2012-03-21 65 views
0

我正在做一个android项目,我必须检测一个标志(标志可以是不同的对比度,色调或饱和度),为此我使用Android的OpenCV-2.3.1直方图比较。标志的图像比较

我遵循的步骤如下;

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) 那么我裁剪所捕获的图像的每一帧的HIST值。裁剪图像的大小与存储图像的大小完全相同,并使用与上述相同的方法计算其直方图值。

3) 两个图像

double base_test2 = Imgproc.compareHist(hist_base1,hist_baseCamera1,Imgproc.CV_COMP_CHISQR); 

的存储HIST值进行比较,我得到comparehist物有所值的。然而,问题是某些时候它为一些随机捕获的图像提供了很好的值,即不需要的。

所以现在我打算使用一些其他方法与直方图比较。我的标志由一个圆圈组成。

我的问题是::是否有任何方法,以便我可以找到捕获的图像由与存储的徽标的圆的大小完全相同的圆组成。

或者我应该使用的任何其他方法,或者我可以播放存储的通道,范围,histSize值?

我以前曾使用模板匹配,它的速度很慢和

我会很感激有这方面的光同样大小的图像相当困难。

回答

0

确实有其他方法。事实上,比较直方图是一种非常模糊的方法选择,正如您已经发现的那样。 (图片大量可以有相同的直方图,如下图上看到的)

A roughly created de- and re construction of a greylevel picture

我看到你目前工作的一个标志颜色,但更简单的方法往往会导致更多更好的结果。因此,您应该考虑是否可以使用灰度图像(这并不意味着您的徽标不能有颜色,这意味着在处理图像之前您必须对图像进行分割)。由于图像中的数据量较少,因此更简单的方法通常也会导致更快的运行时间。

如果您已经完成了分割,您将能够对图像进行阈值处理并执行BLOB分析(二进制大对象),您需要的算法取决于您感兴趣的数值,并且可以找到这些方法和描述在OpenCV documentation

我的猜测是matchShapes()函数可以很好地为您服务。但是,您需要了解一下图像处理,这些处理略过直方图的使用。

你当然必须找到Android版OpenCV的包装。

P.S.记住在标签中包含环境,编程语言和平台是可行的。

+0

细分似乎是一个更好的选择。虽然我从来没有在openCv中实现分割,我会试试这个。 – user1249358 2012-03-22 05:35:10