ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ OpenCV绘制非对称圆点标定图案

2022-01-03 18:33:53  阅读:308  来源: 互联网

标签:thicknum img cir int 圆点 C++ OpenCV 非对称


目录

通过OpenCV + C++绘制非对称圆点标定图案,注意,非对称圆点图案的维度中的一行实质是一组非对称圆点行(两行),其标定图案示意如下图所示:
在这里插入图片描述

原始代码

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	// 图像宽高
	int width = 1400;
	int height = 1000;
	
	// 边框大小
	int thicknum = 2;
	// 标定图案两个维度的大小
	int sqXnum = 11;
	int sqYnum = 4;		// 非对称圆点图案的一行实质是一组非对称圆点行


	sqYnum = 2 * sqYnum;
	// 根据输入的特征点数目,自适应计算圆点半径大小(此处预设两圆点圆心之间距离为4*半径)
	int radius = min(width / (4 * sqXnum + 2), height / (4 * sqYnum + 2));
	if (radius <= 0.01 * min(height, width)) {
		cout << "警告:圆点过小,可能无法识别!" << endl;
	}
	int space = 4 * radius;
	// 生成两个维度方向上的边缘空白
	int x_st = (width - 2 * radius * (2 * sqXnum - 1)) / 2;
	int y_st = (height - 2 * radius * (2 * sqYnum - 1)) / 2;

	// 生成空白画布
	Mat img(height + 2 * thicknum, width + 2 * thicknum, CV_8UC4, Scalar(255, 255, 255, 255));
	// 生成起始点圆心坐标
	int cir_x = x_st + radius + thicknum;
	int cir_y = y_st + radius + thicknum;
	// 用于做非对称的偏移 
	int Asym_offset = 0;
	int y_count = 0;
	// 绘制非对称圆点图案
	for (int i = 0; i < img.rows; i++) {
		if (y_count % 2 == 0)
			Asym_offset = space / 2;
		else
			Asym_offset = 0;
		for (int j = 0; j < img.cols; j++) {
			// 绘制边框
			if (i < thicknum || i >= thicknum + height || j < thicknum || j >= thicknum + width) {
				img.at<Vec<uchar, 4>>(i, j) = Scalar(0, 0, 0, 255);
				continue;
			}
			// 绘制圆点
			if (cir_y >= img.rows - y_st - thicknum) {
				continue;
			}
			if (i == cir_y && j == cir_x) {
				// 绘制圆点,LINE_AA得到的边缘最为光滑
				circle(img, Point(j, i), radius, cv::Scalar(0, 0, 0, 255), -1, LINE_AA);
				cir_x += space;
			}
			if (cir_x >= img.cols - x_st - thicknum) {
				cir_x = Asym_offset + x_st + radius + thicknum;
				cir_y += space;
				y_count++;
			}

		}
		
	}
	imwrite("asymmetric_dot_calib.png", img);
	imshow("非对称圆点标定图案", img);
	waitKey(0);
	return 0 ;
}

效果图

在这里插入图片描述

参考引用

  1. opencv生成圆形标定版程序
  2. MATLAB/OpenCV–基于棋盘格/对称圆点/非对称圆点–相机标定教程

标签:thicknum,img,cir,int,圆点,C++,OpenCV,非对称
来源: https://blog.csdn.net/weixin_43560489/article/details/122290471

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有