【问题标题】:How to improve object detection?如何提高目标检测?
【发布时间】:2016-03-13 19:05:53
【问题描述】:

我想改进我的专为对象检测而设计的项目。

首先,为了得到我的实际结果,我使用absdiff,接下来我在下面的代码中使用以下操作:

cv::threshold(subtractionResultEdges, threshold, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

    Sobel(threshold, sobel, CV_32F, 1, 0);

    minMaxLoc(sobel, &minVal, &maxVal);

    sobel.convertTo(sobel, CV_8U, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal));

    dilate(subtractionResultEdges, subtractionResultEdges, verticalStructreMat, Point(-1, -1));


    erode(subtractionResultEdges, filteredResult, verticalStructreMat, Point(-1, -1));

    Canny(filteredResult, filteredResult, 33, 100, 3);

我最后的操作是findContours(canny_output, *contours, *hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

这是我使用accumulate 函数(20 帧)得到的每个函数和前景后的结果:

前景: http://j71i.imgup.net/foregroundc3dc.PNG

减法: http://p81i.imgup.net/subtractio2866.PNG

索贝尔: http://g51i.imgup.net/sobela1fb.PNG

阈值: http://p46i.imgup.net/treshold14c9.PNG

扩张、侵蚀和 Canny:

http://q68i.imgup.net/canny2e1a.PNG

查找轮廓: http://v76i.imgup.net/contours6845.PNG

背景也是从accumulate函数中获取的。

您能帮我获得更好的角或轮廓检测吗?我需要它,以像素为单位获取对象大小。

提前致谢!

【问题讨论】:

  • 您能否提供一个您想要的检测示例?
  • 我想检测包。一般来说,对象应该是一个长方体。它可以不平行于相机的边缘,所以我不想使用boundingRect 功能,因为在我看来,检测误差太大了。
  • 尝试腐蚀,不使用 Canny,然后找到轮廓,它应该给出一个边界矩形,因为它只是变成一团白色像素。
  • 我试过了,就像你说的那样,但结果比以前更糟。还有其他想法吗?
  • @Shreyas Kapur 这是结果:p16i.imgup.net/resultdc78.PNG

标签: opencv object-detection opencv-contour


【解决方案1】:

dilate/erode 部分使用更大的内核,可能是 (11, 11) 甚至更大,或者进行多次迭代(这可以设置为参数。这应该更好地连接检测到的对象的各个部分,然后你的轮廓会更少。

要计算面积,你可以使用contourArea()

【讨论】:

  • 我尝试使用更大的扩张和侵蚀过滤器,我得到了一些结果。你能告诉我如何从contourArea() 获得高度和宽度吗?也许使用其他函数,在我使用findContours function 得到的这个结果上。
  • 不是来自contourArea,而是来自boundingRect,你可以获得宽度和高度。
  • boundingRect我之前试过,但对我来说效果不佳。
  • 没用是什么意思?它将返回轮廓的边界矩形..所以也许你的轮廓一开始就不好?
  • 我的意思是这个函数不能包围我的对象的矩形,因为我认为轮廓不完整。他们没有关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 2020-10-28
  • 2020-01-11
  • 2011-05-04
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多