我正在使用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));
}
问题是我只得到了我感兴趣的区域的矩形。
如上所示,蓝色区域是我感兴趣的区域,但红色矩形是我得到的。我该如何解决这个问题?
答案 0 :(得分:3)
你有扭曲棋盘的4个角的坐标。使用这些来找到形成四边形的4条线的方程。对于任何给定的点,您将能够检查它是否位于左右线之间的顶行和底行和之间。如果是,请在遮罩图像上将其标记为1,否则为0.使用遮罩图像剪切出扭曲的区域。
答案 1 :(得分:0)
所以你想要从外面的棋盘角落裁剪图像。您需要找到椎体列表的MinX,MaxX,MinY和MaxY以获得最小的边界ROI(感兴趣的矩形)。
所以答案很简单:
TopLeft = (MinX, MinY)
BotRight = (MaxX, MaxY)
ROI = (TopLeft, BotRight)