1. 为什么需要相机标定与图像矫正
想象一下你用手机拍了一张照片,发现照片边缘的直线变成了弯曲的弧线,或者四个角有明显的拉伸变形。这种情况在工业相机、监控摄像头中更为常见,这就是所谓的镜头畸变。对于需要精确测量的场景,比如工业检测、AR/VR应用,这种畸变会直接影响最终结果的准确性。
相机标定就是解决这个问题的第一步。通过拍摄已知图案(比如棋盘格),我们可以计算出相机的内参(焦距、主点坐标)和畸变系数。有了这些参数,就能对后续拍摄的图像进行实时矫正,消除畸变带来的影响。我在一个工业检测项目中就遇到过这个问题,未矫正的图像导致测量误差高达5%,而经过标定矫正后误差降到了0.3%以内。
OpenCvSharp是OpenCV的.NET封装,它让我们可以在C#中直接调用强大的计算机视觉算法。相比其他方案,它的优势在于:
- 完整的OpenCV功能支持
- 与.NET生态无缝集成
- 性能接近原生OpenCV
- 丰富的文档和社区支持
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 准备工作与环境搭建
2.1 硬件准备
你需要准备:
- 一台相机(USB摄像头、工业相机都可以)
- 打印的棋盘格图案(建议A4大小以上)
- 稳定的拍摄环境(避免反光和阴影)
棋盘格建议使用黑白相间的标准图案,我一般用9x6的格子(即8x5个内部角点)。打印时要注意:
- 使用哑光纸张减少反光
- 确保每个方格是完美的正方形
- 打印后可以用尺子测量实际尺寸
2.2 软件环境安装
首先确保已安装:
- Visual Studio 2019或更高版本
- .NET Framework 4.7.2+或.NET Core 3.1+
通过NuGet安装OpenCvSharp4和OpenCvSharp4.runtime.win:
bash复制Install-Package OpenCvSharp4 -Version 4.5.5.2022
Install-Package OpenCvSharp4.runtime.win -Version 4.5.5.2022
如果你遇到DLL加载问题,可以尝试:
- 检查项目平台目标(x86/x64)与运行时是否匹配
- 清理解决方案并重新生成
- 手动复制OpenCvSharp的dll到输出目录
3. 棋盘格标定全流程
3.1 采集标定图像
好的标定需要15-20张不同角度、位置的棋盘格照片。拍摄时要注意:
- 棋盘格要占画面大部分区域
- 包含正面、倾斜、旋转等多种角度
- 确保所有角点都清晰可见
- 避免过度曝光或阴影
我通常会这样组织图像文件:
code复制/CalibrationImages
/position1
image1.jpg
image2.jpg
/position2
image1.jpg
...
3.2 角点检测实现
核心代码结构:
csharp复制// 定义棋盘格尺寸
Size patternSize = new Size(8, 5); // 内部角点数量
List<Point2f[]> imagePoints = new List<Point2f[]>();
foreach (var imagePath in imagePaths)
{
Mat image = Cv2.ImRead(imagePath);
Mat gray = new Mat();
Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY);
// 查找角点
Point2f[] corners;
bool found = Cv2.FindChessboardCor
