图像对齐等应用非常有用
发布时间:2025-06-24 20:58:55 作者:北方职教升学中心 阅读量:308
Demo源码
voidOpenCVManager::testFindChessboardCorners(){#defineFindChessboardCornersUseCamera1#if!FindChessboardCornersUseCamera// 使用图片std::string srcFilePath ="D:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/chessboard.png";// std::string srcFilePath = "D:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/24.jpg";cv::Mat srcMat =cv::imread(srcFilePath);#else// 使用摄像头cv::VideoCapture capture;// 插入USB摄像头默认为0if(!capture.open(0)){qDebug()<<__FILE__<<__LINE__<<"Failed to open camera: 0";}else{qDebug()<<__FILE__<<__LINE__<<"Succeed to open camera: 0";}while(true){cv::Mat srcMat;capture >>srcMat;#endifintchessboardColCornerCount =6;intchessboardRowCornerCount =9;// 步骤一:读取文件// cv::imshow("1", srcMat);// cv::waitKey(0);// 步骤二:缩放,太大了缩放下(可省略)cv::resize(srcMat,srcMat,cv::Size(srcMat.cols /2,srcMat.rows /2));cv::Mat srcMat2 =srcMat.clone();cv::Mat srcMat3 =srcMat.clone();// cv::imshow("2", srcMat);// cv::waitKey(0);// 步骤三:灰度化cv::Mat grayMat;cv::cvtColor(srcMat,grayMat,cv::COLOR_BGR2GRAY);cv::imshow("3",grayMat);// cv::waitKey(0);// 步骤四:检测角点std::vector<cv::Point2f>vectorPoint2fCorners;boolpatternWasFound =false;patternWasFound =cv::findChessboardCorners(grayMat,cv::Size(chessboardColCornerCount,chessboardRowCornerCount),vectorPoint2fCorners,cv::CALIB_CB_ADAPTIVE_THRESH |cv::CALIB_CB_FAST_CHECK |cv::CALIB_CB_NORMALIZE_IMAGE);/* enum { CALIB_CB_ADAPTIVE_THRESH = 1, // 使用自适应阈值将图像转化成二值图像 CALIB_CB_NORMALIZE_IMAGE = 2, // 归一化图像灰度系数(用直方图均衡化或者自适应阈值) CALIB_CB_FILTER_QUADS = 4, // 在轮廓提取阶段,使用附加条件排除错误的假设 CALIB_CB_FAST_CHECK = 8 // 快速检测 }; */cvui::printf(srcMat,0,0,1.0,0xFF0000,"found = %s",patternWasFound ?"true":"false");cvui::printf(srcMat,0,24,1.0,0xFF0000,"count = %d",vectorPoint2fCorners.size());qDebug()<<__FILE__<<__LINE__<<vectorPoint2fCorners.size();// 步骤五:绘制棋盘点cv::drawChessboardCorners(srcMat2,cv::Size(chessboardColCornerCount,chessboardRowCornerCount),vectorPoint2fCorners,patternWasFound);#ifFindChessboardCornersUseCameracv::imshow("0",srcMat);cv::imshow("4",srcMat2);if(!patternWasFound){cv::imshow("5",srcMat3);cv::waitKey(1);continue;}#endif// 步骤六:进一步提取亚像素角点cv::TermCriteria criteria(CV_TERMCRIT_EPS |CV_TERMCRIT_ITER,// 类型30,// 参数二: 最大次数0.001);// 参数三:迭代终止阈值/* #define CV_TERMCRIT_ITER 1 // 终止条件为: 达到最大迭代次数终止 #define CV_TERMCRIT_NUMBER CV_TERMCRIT_ITER // #define CV_TERMCRIT_EPS 2 // 终止条件为: 迭代到阈值终止 */qDebug()<<__FILE__<<__LINE__<<vectorPoint2fCorners.size();cv::cornerSubPix(grayMat,vectorPoint2fCorners,cv::Size(11,11),cv::Size(-1,-1),criteria);// 步骤七:绘制棋盘点cv::drawChessboardCorners(srcMat3,cv::Size(chessboardColCornerCount,chessboardRowCornerCount),vectorPoint2fCorners,patternWasFound);cv::imshow("5",srcMat3);// cv::waitKey(0);#ifFindChessboardCornersUseCameracv::waitKey(1);}// cv::imshow(_windowTitle.toStdString(), dstMat);#elsecv::waitKey(0);#endif}
对应工程模板v1.67.0
入坑
入坑一:无法检测出角点
问题
检测角点失败
原因
输入棋牌横向竖向角点的数量入函数,而不是输入行数和列数。
本篇描述了相机成形的原理,并绘制出识别的角点。
畸变分为以下几类:
- 径向畸变
- 切向畸变
- 薄棱镜畸变
通常情况下,径向畸变的影响要远远大于其他畸变。解决
输入正确的横向纵向角点数量即可。
- corners:初始的角点坐标向量,同时作为亚像素坐标位置的输出,因此需要是浮点型数据。如果为 true,则函数会在角点周围绘制彩色的方框;如果为 false,则只会绘制白色的方框。角点位置变化量或角点误差变化量等。
findChessboardCorners 函数通常用于相机标定,通过检测棋盘角点来确定图像与真实世界之间的对应关系。一旦角点被检测到,就可以使用这些点来估计相机的内参(如焦距、上一篇:《OpenCV开发笔记(七十五):相机标定矫正中使用remap重映射进行畸变矫正》
下一篇:《OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像》若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/136535848