当前位置: 首页 > article >正文

机器视觉C# 调用相机:从 USB 摄像头到海康工业相机(WinForms WPF)

机器视觉C# 调用相机从 USB 摄像头到海康工业相机WinForms WPF 前言在工业自动化、医疗影像或简单软件开发中调用摄像头是一个绕不开的话题。在项目中同时遇到了两种需求通用 USB 相机如笔记本自带摄像头、普通免驱 USB 摄像头。专业工业相机如海康威视Hikvision的机器视觉相机需要调用厂商 SDK。本文将带你分别使用WinForms和WPF框架通过C#语言实现这两种相机的调用。文章不仅会提供可直接运行的代码还会附带详细的思路解析和常见踩坑点希望能为你的项目提供一份可靠的参考。 环境准备开发工具Visual Studio 2022 / 2019目标框架.NET 6.0 / .NET Framework 4.7.2 及以上NuGet 包通用 USBOpenCvSharp4.Windows或AForge.NET本文使用OpenCvSharp海康相机需前往 海康机器人官网 下载MVS机器视觉软件并引用其 SDK。第一部分通用 USB 相机调用基于 OpenCvSharp对于普通的 USB 摄像头Windows 系统通过 DirectShow 驱动识别。我们可以使用OpenCvSharp库来轻松操作。1. 核心思路OpenCV 的VideoCapture类封装了 DirectShow只需传入摄像头 ID通常为 0, 1, 2…即可打开设备。2. WinForms 实现实时显示步骤一安装 NuGetInstall-Package OpenCvSharp4.Windows步骤二界面设计拖拽一个PictureBox用于显示画面一个Button用于启动。步骤三后台代码usingOpenCvSharp;usingOpenCvSharp.Extensions;usingSystem;usingSystem.Threading;usingSystem.Windows.Forms;namespaceUSBCamera_WinForms{publicpartialclassForm1:Form{privateVideoCapture_capture;privateThread_captureThread;privatebool_isRunningfalse;publicForm1(){InitializeComponent();}privatevoidbtnStart_Click(objectsender,EventArgse){if(_isRunning)return;// 0 代表第一个 USB 摄像头如果笔记本自带摄像头通常是 0外接可能是 1_capturenewVideoCapture(0);if(!_capture.IsOpened()){MessageBox.Show(无法打开摄像头请检查设备连接。);return;}_isRunningtrue;_captureThreadnewThread(CaptureFrame);_captureThread.IsBackgroundtrue;_captureThread.Start();}privatevoidCaptureFrame(){while(_isRunning){using(MatframenewMat()){_capture.Read(frame);if(frame.Empty())continue;// 将 OpenCV 的 Mat 转换为 WinForms 的 Bitmapusing(BitmapbitmapBitmapConverter.ToBitmap(frame)){// 跨线程更新 UIpictureBox1.Invoke(newAction((){pictureBox1.Image?.Dispose();// 释放旧图像防止内存泄漏pictureBox1.ImagenewBitmap(bitmap);}));}}Thread.Sleep(30);// 控制帧率约 30fps}}privatevoidForm1_FormClosing(objectsender,FormClosingEventArgse){_isRunningfalse;_captureThread?.Join(1000);_capture?.Release();_capture?.Dispose();}}}3. WPF 实现WPF 与 WinForms 不同不能直接接收Bitmap。我们需要借助WriteableBitmap来实现高性能渲染。步骤一界面 XAMLWindowx:ClassUSBCamera_WPF.MainWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlTitleUSB相机 WPF版Height450Width800GridImagex:NamevideoImageStretchUniformBackgroundBlack/Buttonx:NamebtnStartContent打开相机Width100Height30HorizontalAlignmentRightVerticalAlignmentBottomMargin10ClickBtnStart_Click//Grid/Window步骤二后台逻辑usingOpenCvSharp;usingOpenCvSharp.WpfExtensions;usingSystem.Threading;usingSystem.Windows;usingSystem.Windows.Media.Imaging;namespaceUSBCamera_WPF{publicpartialclassMainWindow:Window{privateVideoCapture_capture;privateThread_captureThread;privatevolatilebool_isRunningfalse;publicMainWindow(){InitializeComponent();}privatevoidBtnStart_Click(objectsender,RoutedEventArgse){if(_isRunning)return;_capturenewVideoCapture(0);if(!_capture.IsOpened()){MessageBox.Show(无法打开摄像头);return;}_isRunningtrue;_captureThreadnewThread(CaptureCamera);_captureThread.IsBackgroundtrue;_captureThread.Start();}privatevoidCaptureCamera(){while(_isRunning){using(MatframenewMat()){_capture.Read(frame);if(frame.Empty())continue;// 关键点Mat 转 WriteableBitmap (WPF 专用)varbitmapframe.ToWriteableBitmap();// 调度到 UI 线程更新Application.Current.Dispatcher.Invoke((){videoImage.Sourcebitmap;});}Thread.Sleep(30);}}protectedoverridevoidOnClosing(System.ComponentModel.CancelEventArgse){_isRunningfalse;_captureThread?.Join(1000);_capture?.Release();base.OnClosing(e);}}}第二部分海康工业相机调用基于 MVS SDK海康的工业相机如网口或 USB3.0 接口功能强大但必须依赖官方 SDK。下面是调用海康相机的基本流程。1. 环境配置下载并安装 MVS机器视觉软件。安装完成后在项目中添加对MvCameraControl.Net.dll的引用。路径通常在C:\Program Files (x86)\MVS\Development\Bin\如果是网口相机请确保 PC 和相机 IP 在同一网段。2. 核心调用步骤WinForms WPF 通用这里以 WinForms 为例展示如何枚举设备、打开相机、注册回调获取图像。代码示例usingMvCameraControl;usingSystem;usingSystem.Drawing;usingSystem.Windows.Forms;namespaceHikCamera_Demo{publicpartialclassFormHik:Form{privateMyCamera_cameranull;privatebool_isGrabbingfalse;publicFormHik(){InitializeComponent();}privatevoidbtnEnum_Click(objectsender,EventArgse){// 1. 枚举设备MyCamera.MV_CC_DEVICE_INFO_LISTdeviceListnewMyCamera.MV_CC_DEVICE_INFO_LIST();intnRetMyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE|MyCamera.MV_USB_DEVICE,refdeviceList);if(nRet!MyCamera.MV_OK||deviceList.nDeviceNum0){MessageBox.Show(未发现相机);return;}// 假设取第一个设备MyCamera.MV_CC_DEVICE_INFOdeviceInfo(MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(deviceList.pDeviceInfo[0],typeof(MyCamera.MV_CC_DEVICE_INFO));// 2. 创建设备实例_cameranewMyCamera();nRet_camera.MV_CC_CreateDevice_NET(refdeviceInfo);if(nRet!MyCamera.MV_OK){MessageBox.Show(创建设备失败);return;}// 3. 连接设备nRet_camera.MV_CC_OpenDevice_NET();if(nRet!MyCamera.MV_OK){MessageBox.Show(连接失败);return;}// 4. 设置触发模式为连续自动出图_camera.MV_CC_SetEnumValue_NET(TriggerMode,0);// 0: 关, 1: 开// 5. 注册图像回调_camera.MV_CC_RegisterImageCallBack_NET(ImageCallback,IntPtr.Zero);// 6. 开始采集_camera.MV_CC_StartGrabbing_NET();_isGrabbingtrue;btnEnum.Enabledfalse;MessageBox.Show(相机启动成功);}// 图像回调函数在 SDK 子线程中执行privatevoidImageCallback(IntPtrpData,refMyCamera.MV_FRAME_OUT_INFO_EXpFrameInfo,IntPtrpUser){if(!_isGrabbing)return;try{// 将原始数据转换为 Bitmap// 根据像素格式进行转换这里是简单示例假设是 BGR8byte[]buffernewbyte[pFrameInfo.nFrameLen];Marshal.Copy(pData,buffer,0,(int)pFrameInfo.nFrameLen);// 根据宽高创建 BitmapBitmapbitmapnewBitmap((int)pFrameInfo.nWidth,(int)pFrameInfo.nHeight,System.Drawing.Imaging.PixelFormat.Format24bppRgb);System.Drawing.Imaging.BitmapDatabmpDatabitmap.LockBits(newRectangle(0,0,bitmap.Width,bitmap.Height),System.Drawing.Imaging.ImageLockMode.WriteOnly,bitmap.PixelFormat);Marshal.Copy(buffer,0,bmpData.Scan0,(int)pFrameInfo.nFrameLen);bitmap.UnlockBits(bmpData);// 更新 UI注意跨线程pictureBox1.Invoke(newAction((){pictureBox1.Image?.Dispose();pictureBox1.Imagebitmap;}));}catch(Exceptionex){Console.WriteLine(回调异常ex.Message);}}privatevoidFormHik_FormClosing(objectsender,FormClosingEventArgse){if(_camera!null){_isGrabbingfalse;_camera.MV_CC_StopGrabbing_NET();_camera.MV_CC_CloseDevice_NET();_camera.MV_CC_DestroyDevice_NET();}}}}⚠️ 注意海康 SDK 的像素格式PixelFormat很多如 Mono8、BayerRG8、RGB24必须根据相机实际设置进行转换。回调函数是非 UI 线程更新图像时必须使用Invoke或Dispatcher。记得在项目属性中勾选“允许不安全代码”如果使用指针操作。 参考文档与资源OpenCV 官方文档https://docs.opencv.org/OpenCvSharp GitHubhttps://github.com/shimat/opencvsharp海康机器人 MVS 开发指南安装 MVS 后在Development\Doc目录下有详细的《SDK 开发指南.pdf》。DirectShow 替代方案如果不想用 OpenCV也可以使用AForge.NET或MediaCaptureUWP但 OpenCV 的跨平台性和功能完整性更强。 总结与避坑指南1. 框架选择建议WinForms开发速度快适合简单的工业软件原型但界面美观度稍逊。WPF界面设计灵活支持 MVVM 模式适合复杂交互的桌面应用。2. 常见问题相机打开失败检查相机是否被其他软件占用如系统相机应用、其他调试程序。内存泄漏在实时显示时务必释放旧的Bitmap或WriteableBitmap对象否则内存会持续飙升。海康相机找不到网口相机关闭防火墙固定 IP。USB 相机安装 MVS 自带的驱动通过 MVS 工具卸载系统的UVC驱动安装厂商驱动。3. 性能优化使用Queue缓冲机制处理回调避免 UI 渲染阻塞相机回调线程。对于高分辨率相机建议将图像缩放后再显示减轻 UI 压力。 结语本文覆盖了从简单的 USB 摄像头到专业的海康工业相机在 C# 中的调用方法并分别给出了 WinForms 和 WPF 的示例。希望这篇博客能帮助你快速上手相机的开发。如果你在实现过程中遇到任何问题欢迎在评论区留言交流Happy Coding!

相关文章:

机器视觉C# 调用相机:从 USB 摄像头到海康工业相机(WinForms WPF)

🎥 机器视觉C# 调用相机:从 USB 摄像头到海康工业相机(WinForms & WPF) 📝 前言 在工业自动化、医疗影像或简单软件开发中,调用摄像头是一个绕不开的话题。在项目中同时遇到了两种需求: …...

OpenClaw内存优化:GLM-4.7-Flash大任务处理的资源调配技巧

OpenClaw内存优化:GLM-4.7-Flash大任务处理的资源调配技巧 1. 当OpenClaw遇上大任务:我的内存崩溃现场 那是个周五的深夜,我正尝试用OpenClaw自动处理一批技术文档的归档和摘要生成。任务看似简单:读取200多个Markdown文件&…...

OpenClaw配置优化:GLM-4.7-Flash模型响应速度提升

OpenClaw配置优化:GLM-4.7-Flash模型响应速度提升 1. 为什么需要优化GLM-4.7-Flash的响应速度 第一次用OpenClaw对接GLM-4.7-Flash模型时,我遇到了典型的"等待焦虑"——一个简单的文件整理任务竟然花了3分钟才返回结果。通过日志分析发现&am…...

3步攻克科研数据提取难关:WebPlotDigitizer开源工具实战指南

3步攻克科研数据提取难关:WebPlotDigitizer开源工具实战指南 【免费下载链接】WebPlotDigitizer WebPlotDigitizer: 一个基于 Web 的工具,用于从图形图像中提取数值数据,支持 XY、极地、三角图和地图。 项目地址: https://gitcode.com/gh_m…...

字节开源AI神器DeerFlow,4.1万星标刷屏,普通人免费就能用

文章目录这玩意儿不是ChatGPT那种"嘴炮型"选手35k星标怎么来的?字节这次把"龙虾"养明白了多智能体协作:不是一个人在战斗沙箱执行:让AI真的"动手"干活对比OpenAI:免费、本地、可控普通人怎么上手&a…...

从零到一:基于LLaMA-Factory的微调实战与核心参数精讲

1. 环境准备与LLaMA-Factory初探 第一次接触LLaMA-Factory时,我对着官方文档发呆了半小时——这个工具链实在太强大了,但新手很容易被各种依赖项劝退。这里分享我的踩坑经验:不要一上来就追求最新版本。去年12月我在RTX 3090上折腾v0.4.0时&a…...

编写程序实现智能鱼竿鱼线拉力检测,拉力超标提示“小心断线”。

🎣 项目实战:基于应变片的智能鱼竿拉力监测系统一、实际应用场景描述 (Scenario)在海钓或路亚钓法中,鱼竿的调性(Action)和钓线的磅数(LB)至关重要。新手往往凭感觉遛鱼,当大鱼突然发…...

编写程序让智能洗手液机检测手部靠近,自动出液,无需按压。

🧼 项目实战:基于红外测距的智能洗手液机控制系统一、实际应用场景描述 (Scenario)在机场、医院、办公楼等公共场所,传统的按压式洗手液机存在卫生隐患——每个人都需要接触同一个泵头,容易造成细菌交叉感染。目标:通过…...

如何彻底告别微软Edge浏览器:EdgeRemover专业卸载工具完全指南

如何彻底告别微软Edge浏览器:EdgeRemover专业卸载工具完全指南 【免费下载链接】EdgeRemover PowerShell script to remove Microsoft Edge in a non-forceful manner. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover 你是否曾经尝试卸载Microsof…...

League-Toolkit:革新英雄联盟体验的效率倍增工具集

League-Toolkit:革新英雄联盟体验的效率倍增工具集 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是一…...

ROS Noetic + RealSense D435i:从驱动安装到RVIZ点云显示的完整工作流解析

ROS Noetic RealSense D435i:从驱动安装到RVIZ点云显示的完整工作流解析 在机器人视觉项目的初期搭建阶段,开发者往往面临一个关键挑战:如何将深度相机从"硬件连接"快速推进到"可用数据流"状态。以Intel RealSense D435…...

Git提交时Personal Access Token权限不足:如何正确配置workflow scope

1. 为什么Git提交会提示Personal Access Token权限不足? 最近在团队协作中遇到一个典型问题:当开发者尝试推送包含.github/workflows目录的代码到GitHub仓库时,系统突然报错refusing to allow a Personal Access Token to create or update w…...

OpenClaw+QwQ-32B科研助手:文献摘要与笔记自动整理

OpenClawQwQ-32B科研助手:文献摘要与笔记自动整理 1. 为什么需要AI科研助手? 作为一名经常需要阅读大量文献的研究者,我发现自己长期陷入"文献管理困境":下载的PDF堆积如山,重要信息散落在不同标注工具里&…...

从Address Editor入手:在Block Design中精准调整Bram存储深度的实战解析

1. 当Bram存储深度无法修改时,你该怎么做? 第一次在Vivado中使用Block Design搭建系统时,很多人都会遇到一个奇怪的现象:明明在Bram IP核的参数设置界面看到了"Depth"这个选项,但无论如何点击都无法修改。这…...

【Git技巧】git rebase -i 实战:轻松合并本地提交记录

1. 为什么你需要掌握git rebase -i 每次写完代码提交时,你是不是也经常遇到这种情况:刚提交完就发现有个拼写错误,赶紧又提交一次;或者调试过程中反复提交了好几次"临时保存"。结果git log一看,提交记录乱七…...

Arduino平台SX1280 2.4GHz LoRa轻量驱动库

1. 项目概述PlugAndPlayForLoRa 是一个面向 Arduino 生态的轻量级 LoRa 物理层(PHY)驱动库,专为 SX1280 射频芯片设计,工作于 2.4 GHz ISM 频段。该库并非协议栈(如 LoRaWAN),而是直接对接 SX12…...

好用还专业!2026 降AIGC平台测评:工具对比+最好用AI推荐

2026年真正好用的AI论文降重与改写工具,核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...

避坑指南:Virtio-PCI设备初始化失败的6个常见原因及解决方案

Virtio-PCI设备初始化故障深度排查手册 虚拟化技术在现代数据中心的应用已无处不在,而Virtio作为半虚拟化的事实标准协议,其PCI设备初始化过程却常常成为运维人员的"暗礁区"。上周处理某金融云平台故障时,我发现一个反复出现的现象…...

高效解析快递地址:Java实现智能识别省市区与楼栋单元户室

1. 快递地址解析的痛点与Java解决方案 每天处理成千上万的快递地址是电商和物流企业最头疼的问题之一。我见过太多这样的场景:客服人员手动复制粘贴地址信息,运营团队熬夜整理Excel表格,配送系统因为地址格式混乱而频频出错。这些问题的根源都…...

这次终于选对了!降AI率软件深度测评与推荐

2026年真正好用的AI论文降重与改写工具,核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...

基于STM32与ADC的锂电池电量监测系统设计

1. 锂电池电量监测为什么需要STM32和ADC? 做嵌入式开发的朋友应该都遇到过这样的需求:设备用锂电池供电,需要实时显示剩余电量。比如手持设备、智能家居控制器或者无人机,电量显示都是刚需功能。但锂电池的特性决定了直接测量电量…...

开源工具Jellyfin豆瓣插件高效配置指南:打造完美中文媒体库

开源工具Jellyfin豆瓣插件高效配置指南:打造完美中文媒体库 【免费下载链接】jellyfin-plugin-douban Douban metadata provider for Jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-douban 在数字媒体收藏日益增长的今天&#xff0…...

springboot基于协同过滤推荐算法的图书借阅推荐系统

目录需求分析与系统设计数据准备与处理协同过滤算法实现推荐系统集成系统测试与优化部署与监控项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与系统设计 明确系统的核心功能需求,包括用户管理、图书管理、…...

文档下载工具:突破平台限制的高效获取策略与零成本解决方案

文档下载工具:突破平台限制的高效获取策略与零成本解决方案 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是…...

无损视频剪辑神器LosslessCut:3分钟学会零编码损耗的专业剪辑技巧

无损视频剪辑神器LosslessCut:3分钟学会零编码损耗的专业剪辑技巧 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 你是否还在为视频剪辑时画质损失而烦恼&…...

接近开关和光电开关接头:A编码M12一体式防水连接器规格解析

在工业自动化现场,接近开关与光电开关是应用最广泛的传感器。其标准接口——A编码M12一体式防水连接器(预铸线缆型),通过统一的机械尺寸与电气定义,实现了传感器的即插即用与高可靠连接。一、规格标准与接口定义A编码M…...

ArXiv:为何大模型无法拥有意识|Erik Hoel

导语当AI能流畅谈论“自我感受”,当Anthropic赋予Claude“对话退出权”,我们是否可以说它有意识?2026年初,神经科学家Erik Hoel在ArXiv发布论文《大语言模型意识证伪:持续学习对意识存在的必要性》(A Dispr…...

EN50155以太网交换机的X键位M12插座在PCB板上同一高度方法

在轨道交通车载EN50155以太网交换机的PCB设计中,X键位M12插座(千兆/万兆接口)常需多个并排或阵列布局。由于X编码插座引脚数较多(8芯)且结构复杂,确保所有插座在PCB板上的同一高度(共面性&#…...

C12832 LCD嵌入式驱动库详解:mbed平台128×32点阵显示开发指南

1. C12832 LCD驱动库概述C12832_lcd 是专为 mbed 应用开发板(Application Board)板载液晶显示屏设计的嵌入式驱动库。该显示屏型号为 C12832,是一款 12832 点阵、单色、COG(Chip-on-Glass)结构的 STN 液晶模块&#xf…...

Harness Engineering:Agent 时代,工程师的新战场

关注 AI 的同学大概率对这两个词已经不陌生了:提示词工程(Prompt Engineering)和上下文工程(Context Engineering)。前者教你怎么跟模型说话,后者教你往模型的上下文窗口里塞什么内容。但从 2026 年初开始&…...