using CameraCardDemo.Infrastructure; using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace CameraCardDemo { public partial class MainForm : Form { private CancellationTokenSource _cameraScanCts = new CancellationTokenSource(); private List _cameras = new List(); private VideoCapture _videoCapture; private CancellationToken cancellationToken = new CancellationToken(); private Rectangle _rect; private Pen _pen; public MainForm() { InitializeComponent(); } private void MainFrom_Load(object sender, EventArgs e) { this.CreateRect(); Task.Run(async () => { while (!this._cameraScanCts.IsCancellationRequested) { this.ScanCameras(); await Task.Delay(1000); } }); try { //读卡器 InitCardReader(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void CreateRect() { this._pen = new Pen(Color.Green); this._pen.DashStyle = DashStyle.Dash; var width = 351 / 2; var height = 448 / 2; this._rect = new Rectangle(this.cameraRender.Width / 2 - width / 2, this.cameraRender.Height / 2 - height / 2, 351 / 2, 448 / 2); } private void ScanCameras() { this.Invoke(new Action(() => { var cameras = CameraHelper.GetDevices(); if (!this._cameras.SequenceEqual(cameras)) { this._cameras = cameras; this.cameraSelector.Items.Clear(); this.cameraSelector.Text = string.Empty; foreach (var item in _cameras) { this.cameraSelector.Items.Add(item); } if (this.cameraSelector.Items.Count > 0) { this.cameraSelector.SelectedIndex = 0; } else { this.cameraSelector.Text = "没有检测到USB摄像头"; } } })); } private void InitCardReader() { int iPort, iRetUSB = 0; for (iPort = 1001; iPort <= 1016; iPort++) { iRetUSB = CVRSDK.CVR_InitComm(iPort); if (iRetUSB == 1) { break; } } if (iRetUSB == 1) { Debug.WriteLine("读卡器初始化成功"); Task.Run(() => { while (!this.cancellationToken.IsCancellationRequested) { if (CVRSDK.CVR_Authenticate() == 1 && CVRSDK.CVR_Read_FPContent() == 1) { var name = new byte[128]; var length = 128; CVRSDK.GetPeopleName(ref name[0], ref length); MessageBox.Show(System.Text.Encoding.GetEncoding("GB2312").GetString(name)); } Thread.Sleep(600); } }); } else { //MessageBox.Show("读卡器初始化失败"); } } private void cameraSelector_SelectedIndexChanged(object sender, EventArgs e) { Release(); this._videoCapture = new VideoCapture((sender as ComboBox).SelectedIndex); if (this._videoCapture.IsOpened()) { //this.ResizeCamera(); Task.Run(() => { while (this._videoCapture.IsOpened()) { try { using (var mat = new Mat()) { this._videoCapture.Read(mat); this.cameraRender.Image = mat.ToBitmap(); } } catch (Exception ex) { this._videoCapture.Release(); break; } } }); } } private void Release() { if (this._videoCapture != null && _videoCapture.IsOpened()) { this._videoCapture.Release(); } } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { this._cameraScanCts.Cancel(); Release(); this._pen.Dispose(); } private void button1_Click(object sender, EventArgs e) { this._cameras.Add("14123"); } private void shotBtn_Click(object sender, EventArgs e) { //剪裁 var bitmap = this.ClipImage(); //缩放 bitmap = this.ResizeImage(bitmap); pictureBox1.Image = bitmap; var eps = new EncoderParameters(1); eps.Param[0] = new EncoderParameter(Encoder.Quality, 70L); bitmap.Save("temp.jpeg", ImageFormat.Jpeg); } private Bitmap ClipImage() { var image = this.cameraRender.Image; var width = this._rect.Width * image.Width / this.cameraRender.Width; var height = this._rect.Height * width / this._rect.Width; var bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb); bitmap.SetResolution(350, 350); using (var g = Graphics.FromImage(bitmap)) { g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(image, new Rectangle(0, 0, bitmap.Width, bitmap.Height), new Rectangle((image.Width - bitmap.Width) / 2, (image.Height - bitmap.Height) / 2, bitmap.Width, bitmap.Height), GraphicsUnit.Pixel); } return bitmap; } private Bitmap ResizeImage(Bitmap image) { var width = 358; var height = 441; var bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb); bitmap.SetResolution(350, 350); using (var g = Graphics.FromImage(bitmap)) { g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(image, new Rectangle(0, 0, bitmap.Width, bitmap.Height), new Rectangle(0, 0, image.Width, image.Height), GraphicsUnit.Pixel); } return bitmap; } private void cameraRender_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawRectangle(this._pen, _rect); } } }