opencv4 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)可以直接配置环境,熟悉的话很快的,不会的话请绕道百度。。。

findChessboardCornersSB提取棋盘格角点示例程序

#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<vector<Point2f> > imagePoints;
	for (int i = 1; i <= 10; i++)
	{
		string filename = "E:\\标定测试\\" + to_string(i) + ".bmp";
		image = imread(filename);
		vector<Point2f> 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 < pointbuf.size(); j++)
			{
					float x_pos = pointbuf.at(j).x;
					float y_pos = pointbuf.at(j).y;

					//保存角点坐标
					myfile << x_pos << " " << y_pos << std::endl;				
			}
			myfile.close();
		}
		cv::namedWindow("image", WINDOW_NORMAL);
		cv::imshow("image", image);
		cv::waitKey(0);
	}
	return 0;

}

检测效果:
在这里插入图片描述
自己根据数据调节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

  • 15
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: OpenCV中的棋盘格角点匹配是一种常见的计算机视觉算法,用于在图像中检测棋盘的角点,并将其匹配到实际世界中的坐标。这个过程主要涉及两个步骤:棋盘格角点检测和角点匹配。 在棋盘格角点检测步骤中,我们首先加载一张包含棋盘的图像。然后,使用OpenCV中的函数`cv2.findChessboardCorners()`来检测图像中的角点。这个函数会自动寻找图像中的棋盘,并返回角点的像素坐标。 在角点匹配步骤中,我们需要传入已知的实际世界中的角点坐标。这些坐标可以通过测量或建模来获取。然后,使用OpenCV中的函数`cv2.calibrateCamera()`来计算摄像机的内部参数和外部参数。这个函数会使用棋盘格角点在图像上的像素坐标和实际世界中的角点坐标来估计摄像机的参数。 最后,我们可以使用OpenCV中的函数`cv2.projectPoints()`来将实际世界中的点投影到图像上。这个函数会使用之前估计的摄像机参数来计算投影后的图像中的点位置。 总结来说,OpenCV中的棋盘格角点匹配是一种基于摄像机参数估计的算法,用于将图像中的角点与实际世界中的角点进行匹配。这个算法对于摄像机标定和计算机视觉中的3D重建等应用非常有用。 ### 回答2: OpenCV是一个计算机视觉库,可以用于棋盘格角点匹配。棋盘格角点匹配是指在给定一个棋盘图像的情况下,通过检测出角点并与预定义的角点进行匹配,以确定棋盘在图像中的位置和姿态。 在OpenCV中,可以使用函数`findChessboardCorners()`来检测棋盘图像中的角点。这个函数需要输入棋盘图像,以及棋盘的大小。它会返回一个布尔值,表示是否成功检测到角点,以及检测到的角点的坐标。 如果检测到了角点,我们可以使用函数`drawChessboardCorners()`将角点标记在棋盘图像上,以便可视化。这样可以帮助我们确认角点是否正确检测。 接下来,我们可以使用函数`findHomography()`来估计棋盘在图像中的位置和姿态。这个函数需要输入棋盘的三维坐标和检测到的角点的二维坐标。它会返回一个3x3的变换矩阵,用于将图像上的点映射到棋盘坐标系中。 最后,我们可以使用函数`drawFrameAxes()`将棋盘的姿态绘制在图像上,以显示其在三维空间中的位置和方向。 总之,OpenCV提供了一系列函数来实现棋盘格角点匹配。通过检测角点并与预定义的角点进行匹配,我们可以确定棋盘在图像中的位置和姿态,这对于计算机视觉应用中的摄像机校准和目标追踪等任务非常有用。 ### 回答3: opencv棋盘格角点匹配是指通过opencv库及相关函数,将棋盘图像中的角点进行识别和匹配的过程。 在使用opencv进行棋盘格角点匹配前,需要先准备一张包含棋盘的图像,并确定该棋盘的行列数。接下来,可以通过cv2.findChessboardCorners函数找到图像中的棋盘格角点位置。 首先,我们需要将图像转换为灰度图像,这可以通过调用cv2.cvtColor函数实现。然后,使用cv2.findChessboardCorners函数,传入灰度图像以及棋盘的行列数作为参数,该函数将返回一个布尔值和角点坐标。如果找到了棋盘格角点,布尔值将为真,并且角点坐标将保存在一个numpy数组中。 接下来,可以通过调用cv2.cornerSubPix函数对角点坐标进行亚像素级别的精确化。该函数需要传入原始图像、角点坐标、搜索窗的一半大小和迭代终止条件等参数。这样可以得到更准确的角点位置。 最后,可以通过调用cv2.drawChessboardCorners函数将角点绘制在原始图像上,该函数需要传入原始图像、角点坐标和布尔值等参数。 总结起来,opencv棋盘格角点匹配的过程可以简述为:图像灰度化 -> 角点检测 -> 亚像素级角点精确化 -> 绘制角点。通过这一系列操作,我们可以在棋盘图像中精确地找到角点,并进行后续的处理和分析。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值