OpenCV相机校准与不同颜色的棋盘

时间:2018-01-18 08:35:30

标签: opencv camera camera-calibration

今天早上出现了一个疑问:findChessboardCorners OpenCV功能是否适用于不同颜色的棋盘,例如蓝色? 如果不是这样的话,你认为一个非常直接的阈值可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您无法将彩色图像传递给findChessboardCorners,因为它只需要@ api55在其评论中指出的灰度图像。

您可能值得查看提供的{checkchessboard代码here

// does a fast check if a chessboard is in the input image. This is a workaround to
// a problem of cvFindChessboardCorners being slow on images with no chessboard
// - src: input binary image
// - size: chessboard size
// Returns 1 if a chessboard can be in this image and findChessboardCorners should be called,
// 0 if there is no chessboard, -1 in case of error
int checkChessboardBinary(const cv::Mat & img, const cv::Size & size)
{
    CV_Assert(img.channels() == 1 && img.depth() == CV_8U);

    Mat white = img.clone();
    Mat black = img.clone();

    int result = 0;
    for ( int erosion_count = 0; erosion_count <= 3; erosion_count++ )
    {
        if ( 1 == result )
            break;

        if ( 0 != erosion_count ) // first iteration keeps original images
        {
            erode(white, white, Mat(), Point(-1, -1), 1);
            dilate(black, black, Mat(), Point(-1, -1), 1);
        }

        vector<pair<float, int> > quads;
        fillQuads(white, black, 128, 128, quads);
        if (checkQuads(quads, size))
            result = 1;
    }
    return result;
}

主循环为:

CV_IMPL
int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
                             CvPoint2D32f* out_corners, int* out_corner_count,
                             int flags )

是此方法的主要实现。他们在这里

  1. 使用cvCheckChessboard确定棋盘是否在图像中
  2. 转换为二进制(B&amp; W)并扩展以分开角落使用
  3. icvGenerateQuads找到正方形。
  4. 所以在回答你的问题时,只要在你将它转换为灰度后你的图像中有足够的对比度它就可以工作了,我会想象一个灰度级的蓝白图像就足够了,如果它是一个光浅绿色或黄色或者你可能在没有更多处理的情况下挣扎的东西