2016-08-15 64 views
1

我想找到图片中每个对象的边界框,并且在发现该边界框后,我将边界框剪出并用于下一步。 Here is the input picture after preprocessing. 我有一个边界框的代码,但它只适用于1个对象。如果有2个物体,它们都会将它们相加并在它们周围画一个边界框。 Here is the first output.它的代码是:使用边界框查找对象

vector<vector<Point>> contours; 
vector<Point> points; 
findContours(erod, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); 
for (size_t i = 0; i < contours.size(); i++) { 
    for (size_t j = 0; j < contours[i].size(); j++) { 
     Point p = contours[i][j]; 
     points.push_back(p); 
    } 
} 
if (points.size() > 0) { 
    Rect brect = boundingRect(Mat(points).reshape(2)); 
    cv::rectangle(erod, brect.tl(), brect.br(), Scalar(100,100,200), 2, CV_AA); 
    Mat ROI = frame(brect); 
} 

我尝试的事情谢胜利使用的OpenCV的文件的代码。在这里,我将findContours中的CV_RETR_TREE更改为CV_RETR_EXTERNAL,但我仍然遇到很多边界框,并且我不知道如何裁剪这些框。

非常感谢!

回答

1

之前找到的轮廓,你应该做一些形态开来清除所有的噪音和线

Mat morphKernelOpen = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(20, 20)); 
Imgproc.morphologyEx(mat, mat, Imgproc.MORPH_OPEN, morphKernelOpen); 

结果: enter image description here

此外,也有你的对象里面一些黑色的空间,因此要避免找到它们的轮廓,您的findContours功能应该在CV_RETR_EXTERNAL模式下:

Imgproc.findContours(scharrThresh, scharrThreshContours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 

最后你会有两个轮廓,你可以像以前一样继续找到盒子

如果你不喜欢你的对象周围的软边缘,你可以在形态打开之前做阈值函数。由于图像中噪音太大,因此在物体周围获得100%精确的轮廓将非常困难或几乎不可能。此外,如果可以的话,下次如果您要求将所得结果图像放在您所做的动作之后,那么给您一个正确的答案会更容易。

+0

谢谢你的帮助。我将在下一次记住这一点。它现在有效! – Mani

+0

我忘了说这段代码是用Java语言编写的,Java中opencv的类名有些不同,所以如果它给你带来任何困难,我很抱歉。如果你还没有完成,应该很容易整合和展开, –

+1

没问题我理解它,并在我的代码中使用它。谢谢 :) – Mani