我正在做一个Android项目,我必须检测一个徽标(徽标可以有不同的对比度,色调或饱和度),因为我正在使用OpenCV-2.3.1 for android的直方图比较。
我遵循的步骤如下:
1)计算存储图像的组织值
private List<Integer> histSize;
private List<Float> ranges;
histSize.add(50);
histSize.add(60);
histSize.add(10);
ranges.add(0f);
ranges.add(256f);
ranges.add(0f);
ranges.add(180f);
ranges.add(0f);
ranges.add(256f);
channels.add(0);
channels.add(1);
channels.add(2);
hsv_base1=new Mat();
Imgproc.cvtColor(image1,hsv_base1, Imgproc.COLOR_BGR2HSV);
hsv_base.add(hsv_base1);
Imgproc.calcHist(hsv_base, channels,new Mat(), hist_base, histSize, ranges,false);
2) 然后我每帧裁剪捕获的图像。裁剪图像的大小与存储的图像完全相同,并使用与上述相同的方法计算其直方图值。
3) 比较两个图像的存储hist值
double base_test2 = Imgproc.compareHist(hist_base1,hist_baseCamera1,Imgproc.CV_COMP_CHISQR);
我得到了比较好的价值。 然而问题是某些时候它为一些随机捕获的图像提供了良好的值,即不需要的。
所以现在我打算用直方图比较来使用其他一些方法。我的徽标由一个圆圈组成。
我的问题是::是否有任何方法可以让我发现捕获的图像由与存储徽标的圆圈大小完全相同的圆圈组成。
或者我应该使用的任何其他方法,或者我可以使用channel,ranges,histSize的存储值?
我之前使用过模板匹配,对于相同大小的图像来说,它非常慢且非常困难
我对此表示赞赏。
答案 0 :(得分:0)
绝对是其他方法。事实上,正如您已经发现的那样,比较直方图是一种非常模糊的方法选择。 (许多图片可以具有与下图所示相同的直方图)
我发现您目前正在制作带有颜色的徽标,但更简单的方法通常会带来更好的效果。因此,您应该考虑是否可以使用灰度图像(这并不意味着您的徽标不能有颜色,这只意味着您必须在处理之前对图像进行分割)。由于图像中的数据量较少,更简单的方法通常也会使运行时间更快。
如果您已完成分割,您将能够对图像进行阈值处理并进行BLOB分析(二进制大对象),您需要的算法取决于您感兴趣的图形,并且可以在以下位置找到这些方法和描述: OpenCV documentation。
我的猜测是matchShapes()
功能可以很好地为您服务。但是你需要对图像处理有所了解,这有点超过使用直方图。
您当然必须找到Android版OpenCV的包装器。
P.S。请记住,在标签中包含环境,编程语言和平台是可行的。