c# - Winforms 中的简单相机捕捉
问题描述
我只想预览然后从 WinForms C# 应用程序中的设备摄像头(网络摄像头)捕获快照。
我用过这个:WebEye WebCameraControl,但它似乎在某些机器/相机上失败了。该描述暗示那里还有更多负载,但我在 NuGet 上找不到任何适用于 WinForms 的内容。
有什么建议吗?我觉得我错过了一些明显的东西,比如一个内置的 Windows 控件就可以做到!
解决方案
尝试OpenCVSharp。一些带有 PictureBox 和 Button 的代码片段:
VideoCapture capture;
Mat frame;
Bitmap image;
private Thread camera;
bool isCameraRunning = 0;
private void CaptureCamera() {
camera = new Thread(new ThreadStart(CaptureCameraCallback));
camera.Start();
}
private void CaptureCameraCallback() {
frame = new Mat();
capture = new VideoCapture(0);
capture.Open(0);
if (capture.IsOpened()) {
while (isCameraRunning) {
capture.Read(frame);
image = BitmapConverter.ToBitmap(frame);
if (pictureBox1.Image != null) {
pictureBox1.Image.Dispose();
}
pictureBox1.Image = image;
}
}
}
private void button1_Click(object sender, EventArgs e) {
if (button1.Text.Equals("Start")) {
CaptureCamera();
button1.Text = "Stop";
isCameraRunning = true;
}
else {
capture.Release();
button1.Text = "Start";
isCameraRunning = false;
}
}
完整代码
public partial class Form1 : Form
{
// Create class-level accesible variables
VideoCapture capture;
Mat frame;
Bitmap image;
private Thread camera;
bool isCameraRunning = false;
// Declare required methods
private void CaptureCamera()
{
camera = new Thread(new ThreadStart(CaptureCameraCallback));
camera.Start();
}
private void CaptureCameraCallback()
{
frame = new Mat();
capture = new VideoCapture(0);
capture.Open(0);
if (capture.IsOpened())
{
while (isCameraRunning)
{
capture.Read(frame);
image = BitmapConverter.ToBitmap(frame);
if (pictureBox1.Image != null)
{
pictureBox1.Image.Dispose();
}
pictureBox1.Image = image;
}
}
}
public Form1()
{
InitializeComponent();
CaptureCamera();
button1.Text = "Stop";
isCameraRunning = true;
}
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text.Equals("Start"))
{
CaptureCamera();
button1.Text = "Stop";
isCameraRunning = true;
}
else
{
capture.Release();
button1.Text = "Start";
isCameraRunning = false;
}
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
try
{
capture.Release();
camera.Abort();
}
catch (Exception ex)
{
}
}
private void button2_Click(object sender, EventArgs e)
{
if (isCameraRunning)
{
Bitmap snapshot = new Bitmap(pictureBox1.Image);
snapshot.Save(string.Format(@"D:\image.jpg", Guid.NewGuid()), ImageFormat.Jpeg);
capture.Release();
camera.Abort();
this.Close();
}
else
{
Console.WriteLine("Cannot take picture if the camera isn't capturing image!");
}
}
private void Form1_Load_1(object sender, EventArgs e)
{
}
}
如果您觉得有任何错误,请在此处 SaveButton 将图像保存到 D:\location 尝试以管理员身份运行
您可以在这里找到解决方案:- 工作示例
推荐阅读
- python-3.x - python - 如何通过Python从没有使用Selenium的Select标签的下拉列表中选择一个选项?
- vuetify.js - Vue 层图未显示在 Vuetify 对话框中
- python - python如何在乘法后对float32数字进行四舍五入?
- spring-boot - Hyperledger Fabric-sdk-java 无法与 orderer 连接(未找到与 localhost 匹配的主题替代 DNS 名称)
- uwp - 如何将扩展启动画面添加到 Windows 模板工作室?
- python - 为什么此文件名上的前导字符会被 strip() 意外剥离?
- php - 如何下载大于 12 MB 的 PDF 文件?
- ffmpeg - 为什么 AVIOContext 在 AVFormatContext 中命名为 pb
- python - 在 Python 中按纬度计算地球半径 - 复制公式
- ruby-on-rails - 嵌套资源 rails 路由的别名