2013-06-05 78 views
1

我正在使用OpenCV,我的項目的一部分是3d校準,我正在使用OpenCV的cv::findChessboardCorners功能,這很好。我的問題是我需要根據找到的棋盤部分來裁剪我的圖像。比方說,我的棋盤角的發現點(boardSize(2 * 3)):在OpenCV中獲得投資回報

 [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

正如你在上面看到的,藍色區域是我感興趣的區域,但紅色直腸是我得到的。我該如何解決這個問題?

回答

3

您具有扭曲棋盤的四個角的座標。使用這些來找出構成四邊形的4條線的方程。對於任何給定的點,您將能夠檢查它是否位於左右線之間的頂線和底線之間。如果是,則在遮罩圖像上將其標記爲1,否則爲0.使用遮罩圖像切出扭曲的區域。

0

所以你想從外部的棋盤角落裁剪圖像。您需要查找您的頂點列表的MinX,MaxX,MinY和MaxY以獲得最小的邊界ROI(感興趣的矩形)。

所以你的答案很簡單:

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

ROI = (TopLeft, BotRight) 
+0

我認爲他需要的平行四邊形,而不是邊框​​。所以他需要一個變換矩形作爲ROI。 – Zaphod

相關問題