2015-11-29 60 views
1

我在問這個問題有一個更好的解釋。矩形中的最大和最小頂點

我已經獲得了一個矩形的四個點,我希望執行一個扭曲透視變換。當我手動選擇點併爲變換分配它們的位置時,我已成功實現了對其中一幅圖像的變換。

cv::Point2f src_vertices[4]; 
src_vertices[0] = corners[3]; 
src_vertices[1] = corners[1]; 
src_vertices[2] = corners[0]; 
src_vertices[3] = corners[2]; 

Point2f dst_vertices[4]; 
dst_vertices[0] = Point(0, 0); 
dst_vertices[1] = Point(box.boundingRect().width-1, 0); 
dst_vertices[2] = Point(0, box.boundingRect().height-1); 
dst_vertices[3] = Point(box.boundingRect().width-1, box.boundingRect().height-1); 

正如你所看到的,我將角點分配給轉換頂點手動。

因爲我希望在多個略有不同的圖像上使用此代碼,我想要一個更準確的方法來分配角落。

所有的圖像將類似於此:

​​

此圖片的邊角如下: 左上 - (1106,331), 前右(810,747) , 底部左(825,187), 底部右(510,537)

我已經找到了最大值和最小值的x和y值如下:

float X, Y; 
float maxX= 0; 
float minX = 10000; 
float maxY= 0; 
float minY = 10000; 
for(int i=0; i< 4; i++){ 
    if(corners[i].x > maxX){ 
     maxX = corners[i].x; 
    } 
    if(corners[i].x < minX){ 
     minX = corners[i].x; 
    } 
    if(corners[i].y > maxY){ 
     maxY = corners[i].y; 
    } 
    if(corners[i].y < minY){ 
     minY = corners[i].y; 
    } 

} 

這給了我:

maxX的 - 1106,其minX - 510,美星 - 747,MINY - 187

我想知道如何重組的最大值和最小值各自的值,以便我可以使用這些點來執行轉換。如果這非常明顯,我對opencv非常陌生,所以很抱歉。

+0

你的意思是你想從1106弄(1106,331)回來嗎?只有最大值和最小值信息才能做到這一點,您需要搜索具有「x」值的頂點。 – VillasV

回答

1

你可以做什麼來獲得角落而不會丟失其他座標信息是找到整個點。代替僅存儲float maxX= 0;,您可以存儲Point2f maxX(0,0);並修改您的for循環以跟蹤點本身,而不僅僅是x座標。

更重要的是,擺脫那些循環,並利用STL的

Point2f maxX = *std::max_element(corners, corners+4, [](Point2f a, Point2f b){return a.x < b.x;});

+0

啊,是的,這是有道理的感謝 – user5608415