Opencv 如何改进目标检测?

Opencv 如何改进目标检测?,opencv,object-detection,opencv-contour,Opencv,Object Detection,Opencv Contour,我想改进我的项目,它是为目标检测而设计的 首先,为了得到我的实际结果,我使用了absdiff,接下来我在我的代码中使用了以下操作: cv::threshold(subtractionResultEdges, threshold, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); Sobel(threshold, sobel, CV_32F, 1, 0); minMaxLoc(sobel, &minVal, &maxVal)

我想改进我的项目,它是为目标检测而设计的

首先,为了得到我的实际结果,我使用了
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_输出,*轮廓,*层次结构,CV_RETR_树,CV_链_近似_简单,点(0,0))

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

前景:

减法:

索贝尔:

阈值:

扩张、侵蚀和精明:

findContours:

背景也可通过
累积
功能获得

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

提前谢谢

对部分使用更大的内核,可能是(11,11)或更大的内核,或者进行多次迭代(这可以设置为一个参数)。这将更好地连接检测到的对象的各个部分,然后您将拥有更少的轮廓


为了计算面积,你可以使用

你能提供一个你想要的检测的例子吗?我想检测包裹。一般来说,物体应该是一个长方体。它不能平行于相机的边缘,所以我不想使用
boundingRect
函数,因为在我看来,检测的误差太大了。试着腐蚀,而不要使用使用Canny然后查找轮廓,当它变成一团白色像素时,它应该给出一个边界矩形。我试过这样做,就像你说的,但结果比以前更糟。还有其他想法吗?@Shreyas Kapur这是结果:我试过使用更大的扩张和侵蚀过滤器,我得到了一些结果。你能告诉我如何获得高度和宽度吗h来自
轮廓区域
()?可能使用其他函数,在这个结果上,我使用
findContours
函数得到。不是从
contourArea
而是从中可以得到宽度和高度。
boundingRect
我以前试过,但对我来说不起作用。你说不起作用是什么意思?它将返回轮廓的边框。。因此,也许你的轮廓一开始就不好?我的意思是这个函数不能包围我的对象的矩形,因为我认为轮廓是不完整的。它们不是闭合的。