2013-12-08 25 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问题是,我的一些图像都应该不点矩形的一部分。这影响了我的矩形如何形成。我添加了一个图像来反映这一点。 –