分享

相机标定黑白格纸生成(提供PDF版下载)

 小白学视觉 2021-01-28

小白近期对相机进行了标定,关于相机标定的原理和方法网上比较多,讲解也比较详细,这里小白也就不再重复,如果有对原理不是很清晰的小伙伴,可以后台私密我。

小白在ROS上安装标定工具,使用黑白方格进行标定。因为好久好久之前小白对其他的相机标定过,印象中电脑里面存了黑白格纸的电子版。但是很不幸,最后没有找到。于是小白决定用代码自己生成一个黑白标定纸,小白整理了利用matlab和OpenCV两种方法,并为小伙伴提供PDF版,供大家下载直接使用

Matlab版

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<=10表示纯黑,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版

小白为小伙伴提供了两个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

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多