我创建了用于计算直方图的三维矩阵,如下所示:
// Histogram of HSV image
int const hue_bins = 180; //
int const sat_bins = 256; //
int const val_bins = 4; // Only four bins for V channel!
float const hue_range[2] = {0, 180};
float const sat_range[2] = {0, 256};
float const val_range[2] = {0, 256};
int const hsv_sizes[] = {hue_bins, sat_bins, val_bins};
cv::Mat1f m_tone_frequences(3, hsv_sizes, 0.);
然后我正在使用
cv::calcHist
( &image, 1, channels, mask, histogram
, num_channels, hsv_sizes, ranges);
...
cv::calcBackProject
( &image_f, 1, channels, histogram
, backproject, hsv_sizes, 1.0);
并且似乎工作正常(代码已简化)。
由于直方图是从单个图像中采样的,因此可能会遇到采样问题(感兴趣的对象具有狭窄的颜色分布)。所以我想将高斯平滑应用于“值”直方图平面。我尝试获取直方图行,但它给了我另一个 3D Mat:
cv::Mat1f hrow = histogram.row(0);
// hrow.dims ==3 && hrow.rows == -1 && hrow.cols == -1
而且我对处理它没有任何想法。
我无法解决这个问题,因为这个动作应该很简单。
任何意见是极大的赞赏。