Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态OpenCV直方图错误_C++_Opencv_Image Processing - Fatal编程技术网

C++ 动态OpenCV直方图错误

C++ 动态OpenCV直方图错误,c++,opencv,image-processing,C++,Opencv,Image Processing,我使用OpenCV提供的直方图比较代码来检查提交的图像与存储在文件系统中的其他图像的相似性。问题是,我得到的值与我使用的原始比较值不同 原始代码: #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> using namespace std; using namespace cv; /**

我使用OpenCV提供的直方图比较代码来检查提交的图像与存储在文件系统中的其他图像的相似性。问题是,我得到的值与我使用的原始比较值不同

原始代码:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

/** @function main */
int main( int argc, char** argv )
{
  Mat src_base, hsv_base;
  Mat src_test1, hsv_test1;
  Mat src_test2, hsv_test2;
  Mat hsv_half_down;

  /// Load three images with different environment settings
  if( argc < 4 )
    { printf("** Error. Usage: ./compareHist_Demo <image_settings0> <image_setting1> <image_settings2>\n");
      return -1;
    }

  src_base = imread( argv[1], 1 );
  src_test1 = imread( argv[2], 1 );
  src_test2 = imread( argv[3], 1 );

  /// Convert to HSV
  cvtColor( src_base, hsv_base, CV_BGR2HSV );
  cvtColor( src_test1, hsv_test1, CV_BGR2HSV );
  cvtColor( src_test2, hsv_test2, CV_BGR2HSV );

  hsv_half_down = hsv_base( Range( hsv_base.rows/2, hsv_base.rows - 1 ), Range( 0, hsv_base.cols - 1 ) );

  /// Using 30 bins for hue and 32 for saturation
  int h_bins = 50; int s_bins = 60;
  int histSize[] = { h_bins, s_bins };

  // hue varies from 0 to 256, saturation from 0 to 180
  float h_ranges[] = { 0, 256 };
  float s_ranges[] = { 0, 180 };

  const float* ranges[] = { h_ranges, s_ranges };

  // Use the o-th and 1-st channels
  int channels[] = { 0, 1 };

  /// Histograms
  MatND hist_base;
  MatND hist_half_down;
  MatND hist_test1;
  MatND hist_test2;

  /// Calculate the histograms for the HSV images
  calcHist( &hsv_base, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false );
  normalize( hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat() );

  calcHist( &hsv_half_down, 1, channels, Mat(), hist_half_down, 2, histSize, ranges, true, false );
  normalize( hist_half_down, hist_half_down, 0, 1, NORM_MINMAX, -1, Mat() );

  calcHist( &hsv_test1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false );
  normalize( hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat() );

  calcHist( &hsv_test2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false );
  normalize( hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat() );

  /// Apply the histogram comparison methods
  for( int i = 0; i < 4; i++ )
     { int compare_method = i;
       double base_base = compareHist( hist_base, hist_base, compare_method );
       double base_half = compareHist( hist_base, hist_half_down, compare_method );
       double base_test1 = compareHist( hist_base, hist_test1, compare_method );
       double base_test2 = compareHist( hist_base, hist_test2, compare_method );

       printf( " Method [%d] Perfect, Base-Half, Base-Test(1), Base-Test(2) : %f, %f, %f, %f \n", i, base_base, base_half , base_test1, base_test2 );
     }

  printf( "Done \n" );

  return 0;
 }
这是我的输出:

Main picture compared to base.jpg using correlation 1
Main picture compared to test1.jpg using correlation 0.763895
Main picture compared to test2.jpg using correlation 0.54124

Main picture compared to base.jpg using chi values 0
Main picture compared to test1.jpg using chi values 223.443
Main picture compared to test2.jpg using chi values 876.137

Main picture compared to base.jpg intersection 3.4481
Main picture compared to test1.jpg intersection 1.78523
Main picture compared to test2.jpg intersection 1.79021

Main picture compared to base.jpg bhattacharyya 1.05367e-08
Main picture compared to test1.jpg bhattacharyya 0.569303
Main picture compared to test2.jpg bhattacharyya 0.675118

因此,我在循环中排列代码以获得完全不同的结果的方式是否存在问题?

这个问题有点不精确。你的意思是什么?你认为这里会有什么问题?对不起,什么不清楚?我想说的是,为什么我的代码和OpenCV代码有两个不同的结果,尽管它们几乎相同,但我的结果是在一个循环中进行比较的。那么,pic1,pic2和一半,Test1,Test2的图像是一样的吗?您希望得到相同的结果值吗?没有pic1与Test1等效,pic2与Test2等效。我选择在第二节中不使用一半。通道、范围和历史基数在第二节中是相同的吗?
 Method [0] Perfect, Base-Half, Base-Test(1), Base-Test(2) : 1.000000, 0.999990, 0.979741, 0.952336 
 Method [1] Perfect, Base-Half, Base-Test(1), Base-Test(2) : 0.000000, 0.018286, 128.338021, 130.609857 
 Method [2] Perfect, Base-Half, Base-Test(1), Base-Test(2) : 1.260779, 1.225753, 1.225654, 1.254846 
 Method [3] Perfect, Base-Half, Base-Test(1), Base-Test(2) : 0.000000, 0.052663, 0.440655, 0.494793 
Main picture compared to base.jpg using correlation 1
Main picture compared to test1.jpg using correlation 0.763895
Main picture compared to test2.jpg using correlation 0.54124

Main picture compared to base.jpg using chi values 0
Main picture compared to test1.jpg using chi values 223.443
Main picture compared to test2.jpg using chi values 876.137

Main picture compared to base.jpg intersection 3.4481
Main picture compared to test1.jpg intersection 1.78523
Main picture compared to test2.jpg intersection 1.79021

Main picture compared to base.jpg bhattacharyya 1.05367e-08
Main picture compared to test1.jpg bhattacharyya 0.569303
Main picture compared to test2.jpg bhattacharyya 0.675118