C#编程下的自定义控件与OpenCVSharp结合应用:卡尺测距功能实现
·
C# 自定义控件 opencvsharp 卡尺测距

最近在工业检测项目里折腾卡尺测距功能,用C#搞了个带图像分析的控件。这玩意儿核心就三件事:自定义控件画界面、OpenCvSharp处理图像、像素转实际尺寸。咱们直接上干货。

先撸个控件框架,继承UserControl太笨重,直接继承Control更灵活:
public class CaliperControl : Control
{
private Mat _sourceImage;
protected override void OnPaint(PaintEventArgs e)
{
// 这里画标尺线和测量结果
using var pen = new Pen(Color.Cyan, 2);
e.Graphics.DrawLine(pen, startPoint, endPoint);
}
}
重点在图像处理部分。用OpenCvSharp读取标定板图像,先做边缘强化:
using (var src = Cv2.ImRead("caliper.jpg", ImreadModes.Grayscale))
{
var edges = new Mat();
Cv2.Canny(src, edges, 50, 200); // 参数别照搬,根据实际调整
FindMeasurementPoints(edges);
}
找测量点时得注意,工业场景里经常遇到反光干扰。我一般用ROI区域约束+亚像素级检测:
private void FindEdges(Mat edges)
{
using var roi = new Mat(edges, new Rect(100, 50, 300, 400)); // 限定检测区域
var lineSegment = Cv2.HoughLinesP(roi, 1, Math.PI / 180, 50);
// 亚像素级角点修正
var corners = new Mat();
Cv2.CornerSubPix(roi, corners, new Size(3,3), new Size(-1,-1),
new TermCriteria(CriteriaType.Epsilon | CriteriaType.MaxIter, 30, 0.1));
}
测距算法最怕像素抖动。我的土办法是取连续20帧做移动平均:
private Queue<float> _distanceBuffer = new Queue<float>(20);
public float StableDistance => _distanceBuffer.Average();
void UpdateDistance(float newVal)
{
if(_distanceBuffer.Count >= 20) _distanceBuffer.Dequeue();
_distanceBuffer.Enqueue(newVal);
Invalidate(); // 触发重绘
}
像素转实际尺寸的玄学环节来了。标定板千万别用A4纸打印,热胀冷缩坑死人。建议用带温度补偿的陶瓷标定板,代码里要处理非线性畸变:
// 标定参数建议存json
var calibration = JsonConvert.DeserializeObject<CalibData>(File.ReadAllText("calib.json"));
// 带畸变校正的坐标转换
Point2f PixelToWorld(Point2f pixel)
{
var undistorted = calibration.CameraMatrix * pixel;
return new Point2f(
undistorted.X * calibration.PixelRatio + calibration.OffsetX,
undistorted.Y * calibration.PixelRatio + calibration.OffsetY
);
}
最后给控件加点交互才像样。按住Alt滚轮调整标尺线位置,右键菜单导出数据:
protected override void OnMouseWheel(MouseEventArgs e)
{
if (Control.ModifierKeys == Keys.Alt)
{
_measurementLine += e.Delta > 0 ? 1 : -1;
Invalidate();
}
base.OnMouseWheel(e);
}
实测在1080p图像下,这套方案能稳定做到±0.05mm精度。注意OpenCvSharp比较吃内存,处理大图时记得用Using语句及时释放Mat对象。遇到卡顿时试试Nvidia的CUDA加速,不过那又是另一个坑了。
更多推荐


所有评论(0)