cvCalcHist和calcHist的区别
difference between cvCalcHist and calcHist
我试图理解cvCalcHist
之间的区别,openCV c version
和calcHist
中计算图像直方图的方法,openCV c++ version
中计算图像直方图的方法。
openCV c version code:
// load the color image
IplImage* im = cvLoadImage("2.png");
// get the color histogram
IplImage* im32f = cvCreateImage(cvGetSize(im), IPL_DEPTH_32F, 3);
cvConvertScale(im, im32f);
int histSize[] = {32, 32, 32};
float rgbRange[] = {0, 256};
float* ranges[] = {rgbRange, rgbRange, rgbRange};
CvHistogram* hist = cvCreateHist(3, histSize, CV_HIST_ARRAY, ranges);
IplImage* b = cvCreateImage(cvGetSize(im32f), IPL_DEPTH_32F, 1);
IplImage* g = cvCreateImage(cvGetSize(im32f), IPL_DEPTH_32F, 1);
IplImage* r = cvCreateImage(cvGetSize(im32f), IPL_DEPTH_32F, 1);
cvSplit(im32f, b, g, r, NULL);
IplImage* planes[] = {b, g, r};
cvCalcHist(planes, hist);
// find min and max values of histogram bins
float minval, maxval;
cvGetMinMaxHistValue(hist, &minval, &maxval);
cout << "Min : " << minval << " / Max : " << maxval << endl;
//OUTPUT: Min : 0 / Max : 177617
openCV c++ version code:
const int channels[] = {0, 1, 2};
const int histSize[] = {32, 32, 32};
const float rgbRange[] = {0, 256};
const float* ranges[] = {rgbRange, rgbRange, rgbRange};
Mat im = imread("2.png",IMREAD_COLOR);
MatND hist;
Mat im32fc3, backpr32f(im.cols, im.rows, CV_32F), backpr8u(im.cols, im.rows, CV_8U), backprBw;
im.convertTo(im32fc3, CV_32F);
// compute histogram, scale it to 0-255 range and backproject
calcHist( &im32fc3, 1, channels, Mat(), hist, 1, histSize, ranges, true, false);
// find min and max values of histogram bins
double minval, maxval;
cv::minMaxIdx(hist, &minval, &maxval);
cout << "Min : " << minval << " / Max : " << maxval << endl;
//OUTPUT: Min : 455 / Max : 476732
正如您在上面代码部分的//OUTPUT
注释中看到的那样,我认为我应该得到相同结果的2段代码之间的值不同。有什么线索吗?
既然你是在B,G,R中创建3D直方图,你需要告诉calcHist
正确的维度数:3。所以基本上你需要从:
calcHist( &im32fc3, 1, channels, Mat(), hist, 1, histSize, ranges, true, false);
// ^
// one dimension
与正确的维度数:
calcHist( &im32fc3, 1, channels, Mat(), hist, 3, histSize, ranges, true, false);
// ^
// three dimensions
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 返回递归调用和仅递归调用的区别
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- cvCalcHist和calcHist的区别