获得OpenCV的投资回报率

时间:2013-06-05 11:27:48

标签: c++ opencv image-processing

我正在使用OpenCV,我的项目的一部分是3D校准,我正在使用OpenCV的cv::findChessboardCorners功能这样做,效果很好。我的问题是我需要根据棋盘的找到部分裁剪我的图像。让我们说我的棋盘角落的发现点是(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));

}

问题是我只得到了我感兴趣的区域的矩形。 enter image description here

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

所以答案很简单:

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

ROI = (TopLeft, BotRight)