相机标定棋盘格制作

Posted alittledruid

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相机标定棋盘格制作相关的知识,希望对你有一定的参考价值。

#include <opencv2/opencv.hpp>
#include <iostream>

 /** 输出指定格式的棋盘图
    @param width 棋盘的宽度,不要超过10000.
    @param height 棋盘的高度,不要超过10000.
    @param pixel 每个格子的大小,建议行和列的格子数一个为奇数一个为偶数
    @param fileName 输出的文件名,支持相对路径和绝对路径,支持png、jpg、bmp等.
    */
static int checkerboard(int width, int height, int pixel, const char* fileName)
{
    if (width > 0 && height > 0 && pixel > 0 && width <= 10000 && height <= 10000 && pixel <= width && pixel <= height && fileName)
    {
        cv::Mat image = cv::Mat::zeros(cv::Size(width, height), CV_8U);
        uchar* uc = image.data;
        for (size_t j = 0; j < height; j++)
        {
            for (size_t i = 0; i < width; i++)
            {
                if ((i / pixel + j / pixel) % 2)
                {
                    uc[j * width + i] = 255;
                }
            }
        }
        imwrite(fileName, image);
        return 0;
    }
    return -1;
}

int main(int argc, char** argv)
{
    int result = -1;
    int width = 0;
    int height = 0;
    int pixel = 0;
    const char* fileName = nullptr;

    if (argc == 5)
    {
        try
        {
            width = std::stoi(argv[1]);
            height = std::stoi(argv[2]);
            pixel = std::stoi(argv[3]);
            fileName = argv[4];
            result = checkerboard(width, height, pixel, fileName);
        }
        catch (const std::exception&)
        {
            std::cout << "输入格式错误" << std::endl;
        }
    }

    if (result == 0)
    {
        std::cout << "生成棋盘图并保存成功" << std::endl;
    }
    else
    {
        std::cout << "保存棋盘图失败" << std::endl;
        std::cout << "用法:" << std::endl;
        std::cout << "CheckerBoard.exe width height pixel fileName" << std::endl;
    }
    return result;
}

 使用这个程序生成一张png格式的图片,不要直接打印,效果不好。用matlab读入并显示,然后另存为PDF文件再打印效果会比较好。

注意:

1.棋盘格行和列的数量不要同时为奇数或偶数,否则标定的时候matlab会给出警告并且标定结果可能错误。一个合法的参数:.CheckerBoard.exe 500 450 50 10x9.png

2.打印后用尺子量一下格子的大小,算出来的结果可能不准,标定的时候要用到。

3.用matlab标定。

 

CheckerBoard.exe下载


需要自己下载OpenCV3.4.7,安装后将opencv_world347.dll(vc15版,x64)拷贝到同一个目录下,同时还要安装vc15的运行库。

 

以上是关于相机标定棋盘格制作的主要内容,如果未能解决你的问题,请参考以下文章

摄像头标定实施

相机标定误差怎么计算

Python之OpenCV相机标定方法

OpenCV 相机校正

相机标定:Matlab标定工具箱使用要点

SLAM入门之视觉里程计:相机标定 张正友经典标定法详解