1

我正在使用 OpenCV,我的项目的一部分是 3d 校准,我正在使用cv::findChessboardCornersOpenCV 的功能来做这件事,效果很好。我的问题是我需要根据找到的棋盘部分裁剪图像。假设我的棋盘角的找到点是 ( boardSize( 2*3 )) :

     [384.87457, 275.93411; 402.59073, 305.37384; 420.99899, 335.61783; 366.1167, 277.35107; 
      384.15289, 308.0141; 402.59592, 339.44702; 346.16739, 279.11893; 364.19324, 310.56906;  
      383.36844, 343.98239; 324.71078, 281.3793; 343.24969, 313.93167;362.28644, 348.54108]

这是我的代码的一部分,它给了我角落的位置:

  if( (cv::findChessboardCorners(img,boardSize, imageCorners))){
    cv::drawChessboardCorners(img,boardSize,imageCorners,true);
    std::cout<<imageCorners[0] <<std::endl;
    std::cout<<imageCorners[((boardSize.height)*(boardSize.width))-1] <<std::endl;
    std::cout << imageCorners << std::endl;
    cv::Rect  myroi (imageCorners[0],imageCorners[((boardSize.height)*(boardSize.width))-1]);
    cv::imshow("Part ", img(myroi));

}

问题是我只得到了我感兴趣的区域的一个矩形。 在此处输入图像描述

正如你在上面看到的,蓝色区域是我感兴趣的区域,但红色矩形是我得到的。我该如何解决这个问题?

4

2 回答 2

3

你有扭曲棋盘的 4 个角的坐标。使用这些来找到形成四边形的 4 条线的方程。对于任何给定点,您将能够检查它是否位于顶线和底线之间以及左右线之间。如果是,则在遮罩图像上将其标记为 1,否则标记为 0。使用遮罩图像切出失真区域。

于 2013-06-05T12:09:57.883 回答
0

所以你想从外棋盘角裁剪图像。您需要找到顶点列表的 MinX、MaxX、MinY 和 MaxY 以获得最小的边界 ROI(感兴趣的矩形)。

所以你的答案很简单:

TopLeft = (MinX, MinY)
BotRight = (MaxX, MaxY)

ROI = (TopLeft, BotRight)
于 2013-06-05T16:52:59.570 回答