小白近期对相机进行了标定,关于相机标定的原理和方法网上比较多,讲解也比较详细,这里小白也就不再重复,如果有对原理不是很清晰的小伙伴,可以后台私密我。 小白在ROS上安装标定工具,使用黑白方格进行标定。因为好久好久之前小白对其他的相机标定过,印象中电脑里面存了黑白格纸的电子版。但是很不幸,最后没有找到。于是小白决定用代码自己生成一个黑白标定纸,小白整理了利用matlab和OpenCV两种方法,并为小伙伴提供PDF版,供大家下载直接使用。 I=checkerboard(100); figure,imshow(I>0.5) imwrite((I>0.5),'calibration'); 其中100表示每个方格大边长为100个像素,注意这个I>0.5是为了让显示的棋盘亮度统一,否则会发现一半暗一半亮 如果小伙伴对代码有执着的追求的话,小白也为大家提供了一种通过自主编写代码实现的程序 function M = writeChessBoard( width, height, size, xnum, ynum, position, background) % This function writes a chessboard on image. % 该方程创建一个棋盘格图像。 %参数解释: % width: 宽度 % height:高度 % size:单个小方块的大小 % xum:x方向上的个数(每4个小方块一组) % xum:x方向上的个数(每4个小方块一组) % position:起始位置的坐标(为了留出边,便于打印) % background:背景亮度, 0<=background<=1, 0表示纯黑,1表示纯白 M=ones(width,height); M(:)=background; block=size*2; for i=1:xnum, for j=1:ynum, pos=[position(1)+block*(i-1), position(2)+block*(j-1)]; M=ChessBoard(M,size,pos); end end end 小白为小伙伴提供了两个OpenCV版本的程序 #include <iostream> #include<opencv2/opencv.hpp>
//行数 #define x 9 //列数 #define y 9 //格子大小 #define size 100
int main() { IplImage* image = cvCreateImage(cvSize(x*size, y*size), 8, 1); ///生成黑白条 for (int i = 0; i<image->height; i++) { uchar* data = (uchar*)image->imageData + image->widthStep*i; for (int j = 0; j<image->width; j++) { if ((j / size) % 2 == 1) *data = 255;//白色 else *data = 0;//黑色 data++; } } //生成棋盘格 for (int i = 0; i<image->height; i++) { if ((i / size) % 2 == 1) { uchar* data = (uchar*)image->imageData + image->widthStep*i; for (int j = 0; j<image->width; j++) { *data = 255 - *data; data++; } } } cvShowImage("image",image); cvWaitKey(); cvSaveImage("chessboard.jpg", image); }
/* 作者:lwqbrell 来源:CSDN 原文:https://blog.csdn.net/lwqBrell/article/details/70880670?utm_source=copy */ #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/highgui/highgui.hpp" #include <iostream> using namespace cv; using namespace std; int main() { Size ImageSize = Size(960, 1260); Mat src(ImageSize.width,ImageSize.height,CV_8UC1,Scalar(0)); namedWindow("src", CV_WINDOW_NORMAL); imshow("src", src); int width = 140; int height = 140; for (int i = 0; i < src.rows; i++) { for (int j = 0; j < src.cols; j++) { if ((i / width + j / height)%2 != 0) { src.at<uchar>(i, j) = 255; } else { src.at<uchar>(i, j) = 0; } } } namedWindow("result", CV_WINDOW_NORMAL); imshow("result", src); imwrite("result.bmp", src); waitKey(0); return 0; } 运行生面的程序便可以生成我们需要的黑白格,再用直接用打印机打印就ok了。 A4纸打印变长2.65cm网格纸 https://pan.baidu.com/s/10hmIYeVzAfXcK-kACed_9g A4纸打印边长2.45cm网格纸 https://pan.baidu.com/s/1HaR27e01EPkJiTYcdxAAbA
|