效果如下:
1.創建一個winform的窗體項目(框架.NET Framework 4.7.2)
2.Nuget引入opencv的c#程序包(版本最好和我一致)
3.后臺代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.Extensions;namespace opencv讀取攝像頭
{public partial class Form1 : Form{public Form1(){InitializeComponent();Control.CheckForIllegalCrossThreadCalls = false;//取消跨線程檢查this.timer1.Start();}private VideoCapture capture;private bool isopen = false;private bool saveImgFlag = false;private string filePath = "";private void button1_Click(object sender, EventArgs e){capture = new VideoCapture(0);if (!capture.IsOpened()){MessageBox.Show("無法打開攝像頭");return;}isopen = true;Thread video_th = new Thread(StartCapturing);video_th.IsBackground = true;video_th.Start();}public void StartCapturing(){Mat frame = new Mat();while (true){capture.Read(frame);//讀取圖像幀if (frame.Empty()){break;}Bitmap bitmap = BitmapConverter.ToBitmap(frame);if (saveImgFlag == true){try{bitmap.Save(filePath, ImageFormat.Jpeg);saveImgFlag = false;MessageBox.Show("保存成功!");}catch (Exception ex){}}pictureBox1.Image = bitmap;pictureBox1.Refresh();}}private void button2_Click(object sender, EventArgs e){SaveFileDialog saveFileDialog = new SaveFileDialog();// 設置對話框的標題saveFileDialog.Title = "Save Image";// 設置默認的文件名和文件類型過濾器saveFileDialog.FileName = DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss");saveFileDialog.Filter = "Image files (*.Png)|*.Png|Image files (*.Jpg)|*.Jpg";// 顯示對話框并獲取用戶的操作結果DialogResult result = saveFileDialog.ShowDialog();if (result == DialogResult.OK){// 用戶點擊了保存按鈕filePath = saveFileDialog.FileName;//string filter=saveFileDialog.Filter;// 在這里進行保存文件的操作,例如:// File.WriteAllText(filePath, "Hello, world!");Console.WriteLine("File saved to: " + filePath);}else if (result == DialogResult.Cancel){// 用戶點擊了取消按鈕Console.WriteLine("Save cancelled");}saveImgFlag = true;}private void timer1_Tick(object sender, EventArgs e){this.label1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");}}
}