【OpenCV findChessboardCornersSB 算法原理与函数使用】

这篇具有很好参考价值的文章主要介绍了【OpenCV findChessboardCornersSB 算法原理与函数使用】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

findChessboardCornersSB是OpenCV4新引入的棋盘格角点检测函数,可以直接获得亚像素角点坐标,对噪声的鲁棒性和对大尺寸图像的检测速度相比之前的findChessboardCorners有很大提升。本文介绍findChessboardCornersSB函数的算法原理,并给出函数使用示例。

算法原理

findChessboardCornersSB的实现主要参考论文Accurate Detection and Localization of Checkerboard Corners for Calibration(2018)。
accurate detection and localization of checkerboard corners for calibration,opencv,算法,计算机视觉
如上图所示,棋盘格角点检测算法的模型可以分为两类,一种是中心线模型,一种是边缘交叉模型。边缘交叉模型的缺点是易受噪声影响,论文中提出的是一种基于中心线模型的检测算法。

检测算法基于Radon变换的思想,对于任意一个像素,可以选择以其为中心的圆形区域,对像素灰度沿不同角度进行积分。可以画出积分结果随角度的变化曲线,当这一像素是角点时,如下图所示,曲线接近三角函数曲线,且曲线有较大的变化幅度。可以根据这一特性判断像素是否为角点。
accurate detection and localization of checkerboard corners for calibration,opencv,算法,计算机视觉
使用Radon变换的问题是不同角度的积分计算较为耗时。为了加速这一过程,论文中只计算0、45、90、135这四个方向。0、90度的积分结果分别由对图像进行横竖两个方向的Box滤波获得,为得到45、135度的积分结果,先将图像旋转45°,对旋转的图像进行横竖两个方向的Box滤波,最后再反向旋转图像。取四个滤波结果中最大值与最小值差值的平方作为角点响应值。对响应图进行滤波,找到局部极大值,并进行亚像素插值获得亚像素角点坐标,最后再使用阈值和非最大值抑制来滤除响应弱的角点。原文算法流程如下图。
accurate detection and localization of checkerboard corners for calibration,opencv,算法,计算机视觉
下图是论文中展示的对实际图片进行角点检测的效果
accurate detection and localization of checkerboard corners for calibration,opencv,算法,计算机视觉
论文使用仿真数据和实际数据对提出的算法和OpenCV原始的角点检测算法效果进行了对比。仿真数据中,提出的算法在不同角点角度、低运动模糊、不同噪声水平、不同透视角度下都优于OpenCV原始方法。实际数据中,提出的算法检测成功率更高,同时重投影误差也更小。文章来源地址https://www.toymoban.com/news/detail-836994.html

函数使用

#include<opencv2/opencv.hpp>

int main()
{
	std::string pattern = "./data/*.png";
	std::vector<std::string> files;
	cv::glob(pattern, files);
	int width = 11;
	int height = 8;
	cv::Size patternSize(width, height);

	// flag参数
	// cv::CALIB_CB_NORMALIZE_IMAGE 调用cv::equalizeHist对图片进行直方图均衡化
	// cv::CALIB_CB_EXHAUSTIVE 保留更多的角点用于棋盘格筛选,同时尝试更多次数的棋盘格筛选
	// cv::CALIB_CB_ACCURACY 对图像进行x2放大,提高角点检查准确度
	// cv::CALIB_CB_LARGER 是否允许检测出的标定板角点数量大于标定板patternSize
	// cv::CALIB_CB_MARKER 标定板是否有标记点
	int flag = cv::CALIB_CB_EXHAUSTIVE | cv::CALIB_CB_ACCURACY;

	std::string windowsName = "Chessboard Corners";

	for (auto f : files)
	{
		cv::Mat image = cv::imread(f, cv::IMREAD_UNCHANGED);
		std::vector<cv::Point2f> corners;
		// 检测棋盘格
		bool found = cv::findChessboardCornersSB(image, patternSize, corners, flag);
		if (found)
		{
			// 绘制显示结果
			cv::drawChessboardCorners(image, patternSize, corners, found);
			cv::namedWindow(windowsName);
			cv::imshow(windowsName, image);
			cv::waitKey(0);
			cv::destroyWindow(windowsName);
		}
	}
	return 0;
}

到了这里,关于【OpenCV findChessboardCornersSB 算法原理与函数使用】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV书签 #感知哈希算法的原理与相似图片搜索实验

    感知哈希算法(Perceptual Hash Algorithm,简称pHash) 是哈希算法的一种,主要可以用来做以图搜索/相似图片搜索工作。   感知哈希算法(pHash)首先将原图像缩小成一个固定大小的像素图像,然后将图像转换为灰度图像,通过使用离散余弦变换(DCT)来获取频域信息。然后,根

    2024年01月22日
    浏览(41)
  • OpenCV书签 #直方图算法的原理与相似图片搜索实验

    直方图算法(Image Histogram Algorithm) 通过统计图像中各个颜色值的分布情况来提供关于图像颜色特征的信息,它可以用来衡量两张图片在颜色分布上的相似度,进而可以用来进行图像相似度的比较,因此,直方图算法是一种常用的图片相似度算法,通常是一个一维的数组(取

    2024年01月23日
    浏览(46)
  • OpenCV #以图搜图:均值哈希算法(Average Hash Algorithm)原理与实验

    均值哈希算法(Average Hash Algorithm,简称aHash) 是哈希算法的一种,主要用来做相似图片的搜索工作。   均值哈希算法(aHash)首先将原图像缩小成一个固定大小的像素图像,然后将图像转换为灰度图像,通过缩小图像的每个像素与平均灰度值的比较,生成一组哈希值。最后,

    2024年02月08日
    浏览(42)
  • OpenCV #以图搜图:感知哈希算法(Perceptual hash algorithm)的原理与实验

    感知哈希算法(Perceptual Hash Algorithm,简称pHash) 是哈希算法的一种,主要可以用来做以图搜索/相似图片搜索工作。   感知哈希算法(pHash)首先将原图像缩小成一个固定大小的像素图像,然后将图像转换为灰度图像,通过使用离散余弦变换(DCT)来获取频域信息。然后,根

    2024年02月05日
    浏览(58)
  • OpenCV书签 #结构相似性SSIM算法的原理与图片相似性实验

    结构相似性(Structural Similarity,简称SSIM算法) ,主要用于检测两张相同尺寸的图像的相似度、或者检测图像的失真程度,是一种衡量两幅图像相似度的指标。 给定两个图像 x 和 y,两张图像的结构相似性可按照以下方式求出: 结构相似性的范围为 -1 到 1。当两张图像一模一

    2024年01月24日
    浏览(42)
  • OpenCV inRange 函数使用详解

            本文是 OpenCV图像视觉入门之路的第6篇文章,本人详细的解决了RGB转HSV,HSV通过AI来进行HSV转 inRange() 函数的范围值操作,简单全面的解决了OpenCV对于图像中某个颜色的分析工作,本文通过识别红色区域和蓝色区域来编写示例程序和博客,也讲述了各种操作,例如:

    2024年02月03日
    浏览(41)
  • Opencv中inRange函数使用介绍

    inRange是OpenCV中的图像阈值函数,用于将图像中的像素值限制在指定的范围内。它的输入和输出如下所述: 输入值: src:输入图像,可以是灰度图像或彩色图像。 lowerb:表示下界的阈值,可以是一个标量值或与输入图像通道数相同的数组。对于灰度图像,lowerb是一个标量值。

    2024年02月05日
    浏览(48)
  • OpenCV腐蚀函数:cv2.erode()使用

    void cv::erode ( InputArray src , OutputArray dst , InputArray kernel , Point anchor  =  Point(-1,-1) , int  iterations  =  1 , int  borderType  =  BORDER_CONSTANT , const Scalar   borderValue  =  morphologyDefaultBorderValue()   ) Python: dst = cv.erode( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] ) 通过使用特定

    2024年02月14日
    浏览(48)
  • [C++] opencv - imwrite函数介绍和使用场景

    OpenCV 是一个开源的计算机视觉库,它包含了许多用于图像处理和计算机视觉任务的函数。其中,imsave() 函数是 OpenCV 中的一个非常有用的函数,它可以让程序将处理后的图像数据保存到指定的文件中。 使用 imwrite() 函数可以将处理后的图像数据保存到本地文件系统中。例如,

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包