2013-12-08 40 views

回答

3

方法1

當圖像中包含輪廓這並不代表你的矩形兩側

  1. 你需要在這裏做的第一件事這種方法將是有益的找到每個輪廓的中心, 您可以繼續查找​​或 minEnclosingCirclefindcontour。現在您已經設置了代表矩形的點 。
  2. 下一步是將頂點,底部,左側和右側矩形的點分類。這是找到這些點位於同一行這些linkdiscussion可能會有所幫助。
  3. 排序後(分類,其位於同一直線上的點),你可以很容易地找到了上,下,左,右通過擴展這些線條和發現四個intersection每一行,其中最小的y值代表最高的,最小x代表左側,最大x代表右側,最大y代表底部。

編輯:

方法2

而不是做所有上述步驟,你可以簡單地找出四角如下文所述。

  • 所有輪廓的查找中心點。
  • 找到具有最小x和最大x的點,它們將代表兩個角落。
  • 找到最小y和最大y代表另外兩個角的點。
  • 現在您可以通過查看這些值來決定左上角,右上角,左下角和右下角的哪個點。

    - >從四個點集合中考慮一組具有最小y值的兩點。現在考慮這兩點,你的左上角將是最小x值點,右上角將是最大x點。

    - >類似地從剩餘的兩個點(具有最大的y值的點集)找到,這將是左下方和點具有最大x是右下角最小x值的點。

爲法碼2

Mat src=imread("src.png",0); 
    vector< vector <Point> > contours; // Vector for storing contour 
    vector<Vec4i> hierarchy; 
    findContours(src, contours, hierarchy,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image 

    vector<Point2f>center(contours.size()); 
    vector<float>radius(contours.size()); 
    for(int i = 0; i< contours.size(); i++){ 
     minEnclosingCircle(contours[i], center[i], radius[i]); 
     circle(src,center[i],radius[i], Scalar(255),1,8,0); 
    } 

float top_left=0, top_right=0, bot_left=0,bot_right=0; 
float idx_min_x=0,idx_min_y=0,idx_max_x=0,idx_max_y=0; 

for(int i = 0; i< contours.size(); i++){ 

    if(center[idx_max_x].x<center[i].x) idx_max_x=i; 
    if(center[idx_min_x].x>center[i].x) idx_min_x=i; 

    if(center[idx_max_y].y<center[i].y) idx_max_y=i; 
    if(center[idx_max_y].y>center[i].y) idx_min_y=i; 
    } 


vector<Point2f>corners; 
corners.push_back (center[idx_max_x]); 
corners.push_back (center[idx_min_x]); 
corners.push_back (center[idx_max_y]); 
corners.push_back (center[idx_min_y]); 

Point tmp; 

for(int i = 0; i< corners.size(); i++) { 
for(int j = 0; j< corners.size()-1; j++) { 
    if(corners[j].y>corners[j+1].y){ 
    tmp=corners[j+1]; 
    corners[j+1]=corners[j]; 
    corners[j]=tmp; 
    } 
} 
} 

if(corners[0].x>corners[1].x){ top_left=1; top_right=0;} 
else { top_left=0; top_right=1;} 

if(corners[2].x>corners[3].x){ bot_left=3; bot_right=2;} 
else { bot_left=2; bot_right=3;} 

line(src,corners[top_left],corners[top_right], Scalar(255),1,8,0); 
line(src,corners[bot_left],corners[bot_right], Scalar(255),1,8,0); 

line(src,corners[top_left],corners[bot_left], Scalar(255),1,8,0); 
line(src,corners[top_right],corners[bot_right], Scalar(255),1,8,0); 
imshow("src",src); 

waitKey(); 

結果: enter image description here

+0

@我現在有Haris.A問題是,我的一些圖像都應該不點矩形的一部分。這影響了我的矩形如何形成。我添加了一個圖像來反映這一點。 –