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()
函数所期望的。 - 加上
&
会导致错误,因为你将传递数组的地址的地址,这并不是函数所需要的。