cv::calcHist()

 

calcHist( &hsv, 1, channels, Mat(), // do not use mask

hist, 2, histSize, ranges,

true, // the histogram is uniform

false );

为什么只有hsv前面需要加取地址符号?

这里&hsv是获取cv::Mat对象hsv的地址,然后将其作为指针数组的第一个元素。即使你只使用一个图像,你也需要传递一个指针数组,这就是为什么需要使用取址运算符&的原因。这告诉cv::calcHist()函数你将提供一个图像,且这个图像的地址是&hsv

为什么channels前面不需要取地址符号?

channels参数在cv::calcHist()函数中是一个指向整数数组的指针,这个数组定义了你希望从输入图像中抽取哪些通道来计算直方图。channels参数的值应该是一个数组,即使这个数组只包含一个元素。

channels参数已经是数组的首地址,你不需要再在其前加上&。如果加上&,你会意外地传递整个数组的地址(即数组的地址的地址),这不是函数期望的。

简而言之,channels不需要加&的原因如下:

  • 在C++中,当你将数组传递给函数时,编译器会自动将其转换为指向数组首元素的指针。
  • 因此,当你编写channels时,你实际上已经在传递一个指向整数数组首元素的指针,这就是cv::calcHist()函数所期望的。
  • 加上&会导致错误,因为你将传递数组的地址的地址,这并不是函数所需要的。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,演示如何使用cv::calcHist函数计算一副图像的灰度直方图: ```cpp #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { // 读取图像 Mat img = imread("lena.jpg", IMREAD_GRAYSCALE); // 定义直方图参数 int histSize = 256; // 直方图大小 float range[] = { 0, 256 }; // 像素值范围 const float* histRange = { range }; bool uniform = true; // 直方图是否均匀 bool accumulate = false; // 直方图是否累积 // 计算直方图 Mat hist; calcHist(&img, 1, 0, Mat(), hist, 1, &histSize, &histRange, uniform, accumulate); // 在窗口中显示直方图 int histWidth = 512, histHeight = 400; int binWidth = cvRound((double)histWidth / histSize); Mat histImage(histHeight, histWidth, CV_8UC1, Scalar(0)); normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat()); for (int i = 1; i < histSize; i++) { line(histImage, Point(binWidth * (i - 1), histHeight - cvRound(hist.at<float>(i - 1))), Point(binWidth * (i), histHeight - cvRound(hist.at<float>(i))), Scalar(255), 2, LINE_AA); } imshow("Histogram", histImage); waitKey(0); return 0; } ``` 在这个示例中,我们首先读取了一幅灰度图像(lena.jpg),然后定义了直方图计算所需的参数,包括直方图大小,像素值范围,直方图是否均匀以及是否累积等。接着,我们使用cv::calcHist函数计算了图像的灰度直方图。最后,我们将计算得到的直方图绘制在一个窗口中显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值