1
A
回答
3
方法1
当图像中包含轮廓这并不代表你的矩形两侧
- 你需要在这里做的第一件事这种方法将是有益的找到每个轮廓的中心, 您可以继续查找或 minEnclosingCircle后findcontour。现在您已经设置了代表矩形的点 。
- 下一步是将顶点,底部,左侧和右侧矩形的点分类。这是找到这些点位于同一行这些link和discussion可能会有所帮助。
- 排序后(分类,其位于同一直线上的点),你可以很容易地找到了上,下,左,右通过扩展这些线条和发现四个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();
结果:
相关问题
- 1. 创建一个矩形数组:Opencv,Android
- 2. Python OpenCV - 从一组轮廓点外推最大的矩形
- 3. OpenCV如何组矩形
- 4. 绘制一个矩形和一组点在一起在matlab
- 5. 检查一组点是否在矩形数组内?
- 6. 聚类一组矩形
- 7. 在OpenCV中创建一个IPlImage数组?
- 8. KineticJs锚点不会在同一组中跟随矩形
- 9. Symfony2的独立表单组件2.3版 - 建立一个形式
- 10. 建立一组组合的最高分
- 11. 在一组矩阵
- 12. Android OpenCV创建矩形
- 13. 在iTextSharp中分组矩形
- 14. OpenGL绘制矩形组成的线与顶点数组
- 15. 矩形数组中的公共点
- 16. 如何从一组数据中创建一个数组/矩阵
- 17. 查找矩形包含矩形数组中的点
- 18. OpenCV groupRectangles - 获取分组和未分组的矩形
- 19. 获取一组矩形的轮廓
- 20. 建立一个二维数组在Excel
- 21. OpenCV的 - 曲线拟合到一组点
- 22. 在OpenCV中的矩形矩阵计算
- 23. 如何建立一个不是矩形或圆形的spriteNode
- 24. 如何计算一组精确覆盖矩形板矩形板的矩形板
- 25. 一组点的最大周长边界矩形
- 26. 检测一组点中的形状
- 27. 在MATLAB中创建一个矩形波
- 28. 从一组,如与OpenCV的或SimpleCV
- 29. 在WPF c中将图像和矩形分组在一起c#
- 30. php数组建立与foreach
@我现在有Haris.A问题是,我的一些图像都应该不点矩形的一部分。这影响了我的矩形如何形成。我添加了一个图像来反映这一点。 –