You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#开发Keyence CV-X相机:图像捕获与PictureBox显示求助

Keyence CV-X相机画面捕获与PictureBox显示解决方案

现有代码的核心问题

  1. CVX类调用不符合Keyence SDK规范,缺少相机连接、设备初始化等关键步骤
  2. logTextBox声明为object类型,无法直接调用AppendText方法
  3. 未实现图像到PictureBox的显示逻辑
  4. 定时器为局部变量,会被垃圾回收导致定时任务终止
  5. 无异常处理,相机操作失败时会直接崩溃

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:03:34