C#开发Keyence CV-X相机:图像捕获与PictureBox显示求助
Keyence CV-X相机画面捕获与PictureBox显示解决方案
现有代码的核心问题
CVX类调用不符合Keyence SDK规范,缺少相机连接、设备初始化等关键步骤logTextBox声明为object类型,无法直接调用AppendText方法- 未实现图像到PictureBox的显示逻辑
- 定时器为局部变量,会被垃圾回收导致定时任务终止
- 无异常处理,相机操作失败时会直接崩溃
修正后的完整代码
using System; using System.Drawing; using System.IO; using System.Windows.Forms; using Keyence.CVX; // 引用Keyence官方CV-X SDK namespace CVXCommunication { public partial class Form1 : Form { // 图片保存路径 private readonly string _savePath = @"C:\KameraSnimky"; // 捕获间隔(毫秒) private readonly int _captureInterval = 10000; // 相机实例 private CvxCamera _camera; // 定时器实例(类成员,避免被GC回收) private System.Windows.Forms.Timer _captureTimer; public Form1() { InitializeComponent(); // 确保保存目录存在 Directory.CreateDirectory(_savePath); } private void startButton_Click(object sender, EventArgs e) { try { // 初始化相机 _camera = new CvxCamera(); // 连接第一个可用的CV-X相机 _camera.Connect(); // 设置为运行模式 _camera.SetRunMode(CvxRunMode.Run); // 初始化定时器 _captureTimer = new System.Windows.Forms.Timer(); _captureTimer.Interval = _captureInterval; _captureTimer.Tick += CaptureAndDisplayImage; _captureTimer.Start(); logTextBox.AppendText("相机启动成功,开始定时捕获图像\n"); } catch (Exception ex) { logTextBox.AppendText($"相机初始化失败:{ex.Message}\n"); } } private void CaptureAndDisplayImage(object sender, EventArgs e) { try { // 捕获相机图像(SDK返回CvxImage对象) using (var cvxImage = _camera.CaptureImage()) { // 将CvxImage转换为Bitmap,用于PictureBox显示 using (Bitmap bitmap = cvxImage.ToBitmap()) { // 跨线程更新UI,避免线程异常 pictureBox1.Invoke(new Action(() => { // 显示图像到PictureBox pictureBox1.Image = new Bitmap(bitmap); })); // 保存图像到本地 string fileName = Path.Combine(_savePath, $"image_{DateTime.Now:yyyyMMddHHmmssfff}.jpg"); bitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg); logTextBox.AppendText($"图像已保存:{fileName}\n"); } } } catch (Exception ex) { logTextBox.AppendText($"捕获图像失败:{ex.Message}\n"); } } // 窗体关闭时释放资源 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { _captureTimer?.Stop(); _camera?.Disconnect(); _camera?.Dispose(); } } }
关键步骤说明
- SDK引用:必须添加Keyence提供的
Keyence.CVX.dll程序集到项目引用中,该文件通常随CV-X软件安装包提供 - 相机连接:使用
_camera.Connect()连接第一个可用相机,如需指定特定相机,可传入相机序列号或IP地址 - 图像转换:Keyence SDK返回的
CvxImage需通过ToBitmap()方法转换为WinForms支持的Bitmap类型,才能在PictureBox显示 - 跨线程UI更新:定时器的
Tick事件在非UI线程触发,必须使用Invoke方法更新PictureBox,避免线程异常 - 资源释放:在窗体关闭时断开相机连接、释放相机和定时器资源,防止内存泄漏
内容的提问来源于stack exchange,提问作者Jáchym Ryba
相关产品推荐
相关产品推荐

