Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 查找具有边界框的对象_Opencv_Image Segmentation_Object Detection_Bounding Box - Fatal编程技术网

Opencv 查找具有边界框的对象

Opencv 查找具有边界框的对象,opencv,image-segmentation,object-detection,bounding-box,Opencv,Image Segmentation,Object Detection,Bounding Box,我想为图片中的每个对象找到边界框,找到后,我裁剪出边界框并将其用于下一步。 我有一个边界框的代码,但它只适用于1个对象。如果有两个对象,则将两个对象相加,并围绕两个对象绘制一个边界框。其代码为: vector<vector<Point>> contours; vector<Point> points; findContours(erod, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); for (size_t i

我想为图片中的每个对象找到边界框,找到后,我裁剪出边界框并将其用于下一步。 我有一个边界框的代码,但它只适用于1个对象。如果有两个对象,则将两个对象相加,并围绕两个对象绘制一个边界框。其代码为:

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);
}
矢量轮廓;
矢量点;
找到的轮廓(erod、等高线、等高线列表、等高线链近似值无);
对于(size_t i=0;i0){
Rect brect=边界Rect(点)。重塑(2);
cv::矩形(erod,brect.tl(),brect.br(),标量(100100200),2,cv_AA);
Mat ROI=帧(brect);
}
我尝试的第二件事是使用OpenCV文档的代码。在这里,我将findContours中的CV_RETR_树更改为CV_RETR_EXTERNAL,但我仍然会看到许多边界框,我不知道如何裁剪这些框


非常感谢

在找到轮廓之前,你应该做一些形态学的打开,以清除所有噪音和线条:

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

此外,对象内部有一些黑色空间,因此为了避免在其中查找轮廓,您的
findContours
功能应处于
CV\u RETR\u EXTERNAL
模式下:

Imgproc.findContours(scharrThresh, scharrThreshContours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
最后,你将有两个轮廓,你可以继续你的盒子寻找你以前做的


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

谢谢你的帮助。下次我会记住这一点。现在可以了!我忘了说我给出的代码是用Java语言编写的,Java中的opencv类在名称上有点不同,所以如果给您带来任何困难,我向您道歉。应该很容易集成和不稳定,如果你还没有,没问题,我理解它,并在我的代码中使用它。谢谢:)