JavaCv比较2个直方图

标签 java opencv computer-vision javacv javacpp

我正在尝试比较灰度图像中的两个直方图。 我正在使用 CV_COMP_CHISQR(0.0 完美匹配 - 1.0 总不匹配)。我将两个直方图归一化为 1。 但是当我比较直方图时,我得到的结果超过 40.0,这是没有意义的。 我不知道是不是我错过了一些步骤,或者有什么地方不对劲。 这是代码的快照。

public class Histogram {     
    public static void main(String[] args) throws Exception {

    String baseFilename = ".../imgs/lp.jpg";
    String contrastFilename = ".../imgs/lpUrb.jpg";c/surf_javacv/box_in_scene.png";

    IplImage baseImage = cvLoadImage(baseFilename);
    CvHistogram hist=getHueHistogram(baseImage);

    IplImage contrastImage = cvLoadImage(contrastFilename);
   CvHistogram hist1=getHueHistogram(contrastImage);

   double matchValue=cvCompareHist(hist, hist1, CV_COMP_CHISQR );
   System.out.println(matchValue);
  }


private static CvHistogram getHueHistogram(IplImage image){
if(image==null || image.nChannels()<1) new Exception("Error!");

IplImage greyImage= cvCreateImage(image.cvSize(), image.depth(), 1);    
cvCvtColor(image, greyImage, CV_RGB2GRAY);   

//bins and value-range
int numberOfBins=256;
float minRange= 0f;
float maxRange= 255f;
// Allocate histogram object
int dims = 1;
int[]sizes = new int[]{numberOfBins};
int histType = CV_HIST_ARRAY;
float[] minMax = new  float[]{minRange, maxRange};
float[][] ranges = new float[][]{minMax};
int uniform = 1;
CvHistogram hist = cvCreateHist(dims, sizes, histType, ranges, uniform);
// Compute histogram
int accumulate = 0;
IplImage mask = null;
IplImage[] aux = new IplImage[]{greyImage};

cvCalcHist(aux,hist, accumulate, null);
cvNormalizeHist(hist, 1);

cvGetMinMaxHistValue(hist, minMax, minMax, sizes, sizes);
System.out.println("Min="+minMax[0]); //Less than 0.01
System.out.println("Max="+minMax[1]); //255
return hist;
}
}//CLass end

最佳答案

来自《Learnig OpenCV》一书:

“对于卡方,低分代表比高分更好的匹配。完美匹配为 0,总不匹配是无限的(取决于直方图的大小)。”

如果您需要您的结果位于段 [0,1] 中,请使用 method = CV_COMP_INTERSECT,其中高分表示匹配良好,低分表示匹配不佳。如果两个直方图都归一化为 1,则完美匹配为 1,完全不匹配为 0。

关于JavaCv比较2个直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14608238/

相关文章:

java - 假定 Spring Controller 参数已实例化,但它是在何时/何处实例化的?

java - Spring 社交和 Facebook API 更改

java - Android:无法提供结果,无法找到具有权限的提供者的元数据

c++ - 从多个 USB 摄像头捕获帧 - OpenCV,C++

c++ - OpenCV Clang mat.hpp 错误 : call to member function 'ptr' is ambiguous

c++ - 将数据从 OpenCV C++ 传递到 NodeJS/JS | Electron

opencv - 压印到金属板上的文本的 OCR

Java 2D 游戏 : Cant get collisions right

image-processing - 识别图像中的图案

python-3.x - Pytesseract 混淆了零 ('0' )和大写 O ('O' )