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問題是,我的一些圖像都應該不點矩形的一部分。這影響了我的矩形如何形成。我添加了一個圖像來反映這一點。 –