相机标定黑白格纸生成(提供PDF版下载)
小白近期对相机进行了标定,关于相机标定的原理和方法网上比较多,讲解也比较详细,这里小白也就不再重复,如果有对原理不是很清晰的小伙伴,可以后台私密我。
小白在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