gpt4 book ai didi

opencv - 查找带有边界框的对象

转载 作者:太空宇宙 更新时间:2023-11-03 22:50:27 24 4
gpt4 key购买 nike

我想为图片中的每个对象找到边界框,找到之后,我裁剪出边界框并将其用于后续步骤。 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,但我仍然遇到许多边界框,而且我不知道如何裁剪这些框。

非常感谢!

最佳答案

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

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% 准确的轮廓。另外,如果可以的话,下次如果你问把你得到的结果图像放在你做的 Action 之后,就会更容易给你一个正确的答案。

关于opencv - 查找带有边界框的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38953449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com