作者:tuigq | 来源:互联网 | 2023-02-01 19:31
opencv4findChessboardCornersSB棋盘格角点提取简介官方文档介绍opencv4.1安装配置环境findChessboardCornersSB提取棋盘格角
opencv4 findChessboardCornersSB棋盘格角点提取
- 简介
-
- 官方文档介绍
- opencv4.1安装配置环境
- findChessboardCornersSB提取棋盘格角点示例程序
简介
用opencv相机标定一直不如matlab标定稳定和精度高。用opencv标定相机经常会发生棋盘格角点提取不到的现象,之前在做一个三维成像项目,需要比较高的成像精度,用opencv标定(findChessboardCorners+cornerSubPix)的效果根本达不到要求,之后某位大佬提出opencv4的提角点精度更高,博主在opencv4的官方文档中发现了这个神奇的函数findChessboardCornersSB(这个名字挺搞笑的)。这个函数直接得到亚像素精度的角点,提取角点的精度和matlab差不多,提取速度和精度还有稳定性完全碾压之前的方法(findChessboardCorners+cornerSubPix)。
官方文档介绍
opencv4.1中函数说明:
官方文档:opencv4.1标定官方文档
这里的参数主要有
image:原图(棋盘格图像)
patternSize:棋盘格行列内角数(cv::Size(columns,rows))
corners:输出角点
flags:标志位(详细说明请看官方文档,用CALIB_CB_EXHAUSTIVE +CALIB_CB_ACCURACY效果最好,噪声多的话可以加上第一个标志位)
方法原论文”Accurate detection and localization of checkerboard corners for calibration表明,返回的亚像素位置比角subpix返回的位置更精确,从而可以对需要的应用程序进行精确的相机校准。
opencv4.1安装配置环境
这个很容易,直接官网下载安装下载地址,VS2015和VS2017(x64)可以直接配置环境,熟悉的话很快的,不会的话请绕道百度。。。
#include "opencv2/opencv.hpp"
#include "fstream"using namespace cv;
using namespace std;int main()
{Size boardSize, imageSize;boardSize.width = 18;boardSize.height = 17;int winSize = 11;Mat image,imageGray;//vector > imagePoints;for (int i = 1; i <= 10; i++){string filename = "E:\\标定测试\\" + to_string(i) + ".bmp";image = imread(filename);vector pointbuf;cvtColor(image, imageGray, COLOR_BGR2GRAY);bool found;/*found = findChessboardCorners(image, boardSize, pointbuf,CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_FAST_CHECK | CALIB_CB_FILTER_QUADS);*/found = findChessboardCornersSB(image, boardSize, pointbuf,CALIB_CB_EXHAUSTIVE | CALIB_CB_ACCURACY);if (found) {/*cornerSubPix(imageGray, pointbuf, Size(winSize, winSize),Size(-1, -1), TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 30, 0.1));*/drawChessboardCorners(image, boardSize, Mat(pointbuf), found);std::ofstream myfile;string txtName = "corner" + to_string(i) + ".txt";myfile.open (txtName,ios::out);for (unsigned int j = 0; j
检测效果:
自己根据数据调节boardSize宽高参数(列行内角数),图片噪声多可加上CALIB_CB_NORMALIZE_IMAGE标志位
使用findChessboardCorners+cornerSubPix方法请将findChessboardCornersSB这句话备注,取消备注findChessboardCorners和cornerSubPix。
标定测试数据下载提取码5emc
测试了10张棋盘格图像,全部检测到角点,findChessboardCorners+cornerSubPix方法10张只检测出3张,而且速度很慢。
经测试,与matlab提取角点效果接近。
参考
[1]:https://docs.opencv.org/4.1.0/d9/d0c/group__calib3d.html#gad0e88e13cd3d410870a99927510d7f91