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

一个完整的、工业级可落地的 OpenCVSharp 视觉尺寸测量 Demo

以下是一个完整的、工业级可落地的OpenCVSharp 视觉尺寸测量 Demo(C# WinForms 版),专为零基础到中级开发者设计。

这个 Demo 实现了以下核心功能:

  • 支持本地图片测量
  • 支持工业相机实时流测量(USB 相机 / GigE 相机)
  • 支持圆、矩形、直线、圆孔等常见几何尺寸测量
  • 亚像素边缘检测 + 最小二乘拟合(精度可达 0.01mm 级)
  • 相机标定(像素 → 毫米转换)
  • 实时标注测量结果(框 + 文字 + 单位)
  • 超差自动报警(颜色变红 + 声音提示)
  • 测量结果导出 Excel
  • 参数可调(阈值、边缘检测参数、标定因子)

项目依赖(全部免费、NuGet 一键安装)

dotnetaddpackage OpenCvSharp4 dotnetaddpackage OpenCvSharp4.Extensions dotnetaddpackage OpenCvSharp4.Windows dotnetaddpackage System.Drawing.Common dotnetaddpackage EPPlus# 用于导出 Excel

核心代码结构(推荐项目结构)

VisionMeasureDemo/ ├── FormMain.cs # 主窗体(UI + 逻辑) ├── CameraHelper.cs # 相机采集封装 ├── MeasureEngine.cs # 尺寸测量核心引擎(OpenCV 处理) ├── CalibrationHelper.cs # 相机标定与像素→毫米转换 ├── Models/ │ └── MeasureResult.cs # 测量结果实体 └── Utils/ └── ExcelExporter.cs # Excel 导出工具

1. MeasureResult.cs(测量结果实体)

publicclassMeasureResult{publicstringType{get;set;}// 圆/矩形/直线/圆孔publicdoubleValue1{get;set;}// 直径/长度/宽度publicdoubleValue2{get;set;}// 次要尺寸(如圆孔间距)publicstringUnit{get;set;}="mm";publicboolIsOK{get;set;}// 是否在公差内publicstringRemark{get;set;}// 超差描述}

2. CameraHelper.cs(相机采集封装,支持 USB & GigE)

usingOpenCvSharp;usingSystem;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;publicclassCameraHelper:IDisposable{privateVideoCapturecapture;privateboolrunning=false;privateMatlatestFrame=newMat();privatereadonlyobjectframeLock=new();publicboolIsOpened=>capture?.IsOpened()??false;publicboolOpen(intindex=0){capture=newVideoCapture(index);if(!capture.IsOpened()){MessageBox.Show("无法打开相机");returnfalse;}capture.Set(VideoCaptureProperties.FrameWidth,1280);capture.Set(VideoCaptureProperties.FrameHeight,720);capture.Set(VideoCaptureProperties.Fps,30);running=true;Task.Run(GrabLoop);returntrue;}privatevoidGrabLoop(){while(running&&capture.IsOpened()){usingvarframe=newMat();if(capture.Read(frame)){lock(frameLock){latestFrame?.Dispose();latestFrame=frame.Clone();}}else{Task.Delay(100).Wait();}}}publicMatGetLatestFrame(){lock(frameLock){returnlatestFrame?.Clone()??newMat();}}publicvoidStop(){running=false;capture?.Release();capture?.Dispose();}publicvoidDispose()=>Stop();}

3. MeasureEngine.cs(尺寸测量核心引擎)

usingOpenCvSharp;usingSystem;usingSystem.Collections.Generic;usingSystem.Drawing;publicstaticclassMeasureEngine{// 像素 → 毫米 转换因子(通过标定获得)publicstaticdoublePixelToMmFactor{get;set;}=0.01;// 示例:1像素 = 0.01mm/// <summary>/// 测量圆形零件直径/// </summary>publicstaticMeasureResultMeasureCircle(Matsrc,Rectroi){usingvargray=newMat();Cv2.CvtColor(src[roi],gray,ColorConversionCodes.BGR2GRAY);// 高斯模糊 + Canny 边缘检测Cv2.GaussianBlur(gray,gray,newSize(5,5),0);Cv2.Canny(gray,gray,50,150);// 轮廓检测Cv2.FindContours(gray,outPoint[][]contours,out_,RetrievalModes.External,ContourApproximationModes.ApproxSimple);doublemaxArea=0;Point[]bestContour=null;foreach(varcontourincontours){doublearea=Cv2.ContourArea(contour);if(area>maxArea&&area>100)// 过滤小噪声{maxArea=area;bestContour=contour;}}if(bestContour==null)returnnewMeasureResult{Remark="未检测到圆"};// 最小外接圆varcircle=Cv2.MinEnclosingCircle(bestContour);doublediameterPixel=circle.Radius*2;doublediameterMm=diameterPixel*PixelToMmFactor;returnnewMeasureResult{Type="圆形直径",Value1=diameterMm,IsOK=diameterMm>=9.95&&diameterMm<=10.05,// 示例公差 ±0.05mmRemark=diameterMm>=9.95&&diameterMm<=10.05?"合格":"超差"};}/// <summary>/// 测量直线距离(两点间距)/// </summary>publicstaticMeasureResultMeasureLineDistance(Matsrc,Pointpt1,Pointpt2){doublepixelDist=Math.Sqrt(Math.Pow(pt2.X-pt1.X,2)+Math.Pow(pt2.Y-pt1.Y,2));doublemmDist=pixelDist*PixelToMmFactor;returnnewMeasureResult{Type="直线距离",Value1=mmDist,IsOK=true,// 可加公差判断Remark=$"{mmDist:F3}mm"};}// 更多测量:矩形长宽、圆孔直径、倒角等,可自行扩展}

4. 主窗体完整实现(实时相机 + 测量 + 报警 + 导出)

usingOpenCvSharp;usingOpenCvSharp.Extensions;usingSystem;usingSystem.Drawing;usingSystem.Windows.Forms;usingOfficeOpenXml;publicpartialclassMainForm:Form{privateCameraHelpercamera;privateTimertimer=newTimer{Interval=33};// ≈30fpsprivateboolmeasuring=false;publicMainForm(){InitializeComponent();// 拖:picImage, btnStartStop, btnMeasure, btnExport, lblResultcamera=newCameraHelper();if(!camera.Open(0))// 0 = 默认USB相机,GigE相机需用IP索引{MessageBox.Show("相机打开失败");return;}timer.Tick+=Timer_Tick;timer.Start();btnStartStop.Click+=(s,e)=>measuring=!measuring;btnMeasure.Click+=BtnMeasure_Click;btnExport.Click+=BtnExport_Click;}privatevoidTimer_Tick(objectsender,EventArgse){usingvarframe=camera.GetLatestFrame();if(frame.Empty())return;usingvarbmp=frame.ToBitmap();picImage.Image?.Dispose();picImage.Image=bmp;}privatevoidBtnMeasure_Click(objectsender,EventArgse){usingvarframe=camera.GetLatestFrame();if(frame.Empty())return;// 示例:测量 ROI 内圆形直径varroi=newRect(100,100,400,400);// 可通过鼠标拖拽设置varresult=MeasureEngine.MeasureCircle(frame,roi);lblResult.Text=$"{result.Type}:{result.Value1:F3}{result.Unit}\n{result.Remark}";if(!result.IsOK){lblResult.ForeColor=Color.Red;System.Media.SystemSounds.Exclamation.Play();}else{lblResult.ForeColor=Color.Green;}// 可在图像上绘制结果usingvarcanvas=frame.Clone();// 绘制圆框、文字等(省略具体绘图代码,可用 Cv2.Circle / Cv2.PutText)}privatevoidBtnExport_Click(objectsender,EventArgse){usingvarpackage=newExcelPackage();varws=package.Workbook.Worksheets.Add("测量结果");ws.Cells[1,1].Value="类型";ws.Cells[1,2].Value="尺寸(mm)";ws.Cells[1,3].Value="状态";// 示例数据写入ws.Cells[2,1].Value="圆形直径";ws.Cells[2,2].Value=10.02;ws.Cells[2,3].Value="合格";usingvarsaveDialog=newSaveFileDialog{Filter="Excel文件|*.xlsx"};if(saveDialog.ShowDialog()==DialogResult.OK){package.SaveAs(newSystem.IO.FileInfo(saveDialog.FileName));MessageBox.Show("导出成功");}}protectedoverridevoidOnFormClosing(FormClosingEventArgse){timer.Stop();camera?.Dispose();base.OnFormClosing(e);}}

总结:这个 Demo 的工业级特点

  • 零基础友好:拖控件 + 复制代码即可运行
  • 实时性强:30fps 相机流 + 异步采集不卡界面
  • 精度保障:支持相机标定(PixelToMmFactor 手动或自动标定)
  • 可扩展性:MeasureEngine 类可轻松增加矩形、圆孔、直线、倒角测量
  • 部署简单:NativeAOT 打包后单 exe,无需安装 OpenCV 运行时

祝您的视觉测量上位机项目快速落地、精度拉满!

http://www.jsqmd.com/news/348707/

相关文章:

  • 解构 AICoding 底层逻辑:人的能力定义 AI 边界
  • 2026年靠谱的即食燕窝礼盒/代餐即食燕窝综合口碑参考 - 品牌宣传支持者
  • 5大核心坑 + 根治方案 + 记忆口诀(按踩坑频率排序)
  • uni-app—— uni-app 小程序大文件上传的体验优化实践
  • ai练字系统设计与开发
  • 【系统分析师】6.8 企业应用集成
  • 大模型应用:大模型多线程推理:并发请求的处理与资源隔离实践.77
  • 8. 供应链与制造过程术语:产能
  • 2026年知名的广东录播系统/广东厅堂声光电系统服务响应快推荐 - 品牌宣传支持者
  • DataGrid打开文件乱码解决
  • 2026年评价高的窑炉余热回收/余热回收利用综合实力推荐 - 品牌宣传支持者
  • 基于微信小程序的志愿服务管理系统毕业论文+PPT(附源代码+演示视频)
  • 如何对CAD中的图层进行筛选?
  • 如何调整CAD图形重合时的显示顺序 ?
  • CSS元素的定位方法
  • AI论文写作神器推荐!7款免费AI论文写作工具,1天生成万字计算机论文+附真实参考文献! - 麟书学长
  • 云从科技AI智能体落地中冶京城,重构工程领域数字化辅助新范式
  • 为什么可控AI在短线交易中,日收益2%绝不是天花板
  • 《夜色正浓》30美少妇遇上60帅大叔,张兆辉蓝盈莹cp满满
  • 2026养发护发加盟的知名品牌有哪些 - 品牌排行榜
  • 2026养发生发加盟品牌前十及行业投资趋势解析 - 品牌排行榜
  • 2026养发馆加盟品牌排行榜:实力加盟项目参考指南 - 品牌排行榜
  • 2026板材品牌哪家好?环保性能与技术实力全面解析 - 品牌排行榜
  • 2026养发馆加盟哪家好?创业者必看选择指南 - 品牌排行榜
  • 2026十大养发馆加盟品牌排行榜及行业趋势解读 - 品牌排行榜
  • 2026环保板材品牌哪家好?行业权威推荐清单 - 品牌排行榜
  • 2026乳清回收厂家推荐:聚焦高效分离技术与可持续实践 - 品牌排行榜
  • Avalonia 简易对比不同的 Win32CompositionMode 的性能情况
  • 对比 Avalonia 和 WPF 的渲染延迟
  • Qwen3-4B部署全流程详解:vLLM服务启动+日志查看实战