opencv - 在盘子里的一堆水果中检测出香蕉或苹果,成功率 > 90%。 (见图)

标签 opencv image-processing computer-vision

enter image description here enter image description here

嗨!我对 OpenCV 和图像处理有点陌生。到目前为止,我一直尝试采用以下方法,但我相信一定有更好的方法。

1). Finding color range (HSV) manually using GColor2/Gimp tool/trackbar manually from a reference image which contains a single fruit (banana) with a white background. Then I used inRange(), findContour(), drawContour() on both reference banana image & target image(fruit-platter) and matchShapes() to compare the contours in the end.

只要选择的颜色范围合适,它就可以正常工作。 (见第二张图片)。但由于这些水果没有统一的纯色,这种方法对我来说似乎不是一种理想的方法。我不想在 inRange() 中对颜色范围(标量值)进行硬编码。

2). Manual thresholding and contour matching.

与 (1) 相同的问题。不想硬编码阈值。

3). OTSU thresholding and canny edge detection.

不适用于香蕉、苹果和柠檬。

4). Dynamically finding colors. I used the cropped banana reference image. Calculated the mean & standard deviation of the image.

不知道如何在我的均值/标准差计算中忽略白色背景像素而不循环遍历每个 x,y 像素。欢迎就此提出任何建议。

5). Haar Cascade training gives inaccurate results. (See the image below). I believe proper training might give better results. But not interested in this for now.

enter image description here

我正在考虑的其他方法:

6). Using floodfill to find all the connected pixels and calculating the average and standard deviation of the same.

这方面还没有成功。不确定如何获取所有连接的像素。我丢弃了面具 (imwrite) 并得到了黑白形式的香蕉(来自引用香蕉图像)。欢迎就此提出任何建议。

7). Hist backprojection:- not sure how it would help me.

8). K-Means , not tried yet. Let me know, if it’s better than step (4).

9). meanshift/camshift → not sure whether it will help. Suggestions are welcome.

10). feature detection -- SIFT/SURF -- not tried yet.

我们将不胜感激任何帮助、提示或建议。

最佳答案

此类一般性问题(对象检测)的答案,尤其是此类非常活跃的研究主题,基本上归结为偏好问题。也就是说,在您提到的 10 种“方法”中,特征检测/提取可能是最值得关注的一种,因为它是各种计算机视觉问题的基本组成部分,包括但不限于对象识别/检测。

您可以尝试的一种非常简单但有效的方法是 Bag-of-Words模型,在快速对象检测的早期尝试中非常常用,所有全局空间关系信息都丢失了。

从每年的计算机视觉 session 记录中观察到的后期目标检测研究趋势是,您通过在节点中存储特征描述符的图形对每个对象进行编码,并将空间关系信息存储在边缘中,因此部分全局信息被保留下来,因为我们现在不仅可以匹配特征空间中特征描述符的距离,还可以匹配图像空间中它们之间的空间距离。

针对您描述的这个问题,一个常见的陷阱是香蕉和苹果皮上的均匀纹理可能无法保证特征的健康分布,并且您检测到的大多数特征将位于(最常见的)3 个或更多对象的交叉点上,这本身并不是一个普遍认为的“好”功能。出于这个原因,我建议研究超像素对象识别(只是谷歌它。认真地。)方法,因此类“Apple”或“Banana”的数学模型将是一个互连的超像素 block ,存储在图形中,每个边存储空间关系信息和每个节点存储有关由超像素指定的邻域的颜色分布等信息。然后识别将是一个(部分)图形匹配问题或与概率相关的问题graphical model许多现有的研究已经完成。

关于opencv - 在盘子里的一堆水果中检测出香蕉或苹果,成功率 > 90%。 (见图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24675286/

相关文章:

opencv - 如何从单个 PNG 中分离两个大小为 8 和 16 的位图

python - 检测网格的角

java - 在 Zxing 中启用 PDF417 解码

C#/EmguCV - 将上传的 HttpPostedFileBase 转换为 Emgu.CV.Mat

image-processing - 如何使用 OpenCV 查找图像上一个点与另一个点的坐标

linux - 错误 "sys/videoio.h - not found"OpenCV 3.1.0

matlab - 将 Matlab 与 C++ 集成

python - 将图像从 Python 传递到 MATLAB 函数

machine-learning - Tensorflow 训练和验证输入队列分离

c# - 如何在 C# 中使用 RANSAC 过滤 OpenSURF 无效匹配