如何使用 OpenCV 的直方图?

Posted

技术标签:

【中文标题】如何使用 OpenCV 的直方图?【英文标题】:How to use OpenCV's histogram? 【发布时间】:2015-10-04 03:26:38 【问题描述】:

我正在努力在 OpenCV 中获取浮点数据的直方图:

cv::ocl::setUseOpenCL(true);
auto rows = 2048;
auto cols = 2064;
auto input_d = cv::UMat(rows, cols, CV_32F, cv::USAGE_ALLOCATE_DEVICE_MEMORY);
cv::UMat hist_d;
cv::randn(input_d, 0, 0.5);
std::vector<int> channels =  0 ;
std::vector<int> histSize =  256 ;
std::vector<float> ranges =  0, 1 ;//run the histogram to track values 0 to 1
cv::calcHist(input_d, channels, cv::UMat(), hist_d, histSize, ranges, false);

我收到如下错误:

OpenCV Error: Assertion failed (0 <= _rowRange.start && _rowRange.start <= _rowRange.end && _rowRange.end <= m.rows) in cv::Mat::Mat, file src\matrix.cpp, line 452

有人知道这个功能怎么用吗?

以下代码可以工作,但计算不会发生在 GPU 上

auto rows = 2048;
auto cols = 2064;
auto input_d = cv::Mat(rows, cols, CV_32F);
cv::MatND hist_d;
cv::randn(input_d, 0, 0.5);
int histSize[1] =  256 ;
float hranges[2] =  0.0, 256.0 ;
const float*  range[1] =  hranges ;
int channels[1] =  0 ;
cv::calcHist(&input_d, 1, channels, cv::Mat(), hist_d, 1, histSize, range);

我怀疑 foo 的大小不应该为零,但我不明白发生了什么。

cv::InputArray& foo = input_d;
cv::calcHist(foo, channels, cv::UMat(), hist_d, histSize, ranges, false);

【问题讨论】:

【参考方案1】:

看起来需要包装一下。

std::vector<cv::UMat> foo =  input_d ;// should ref count, and avoid a deep copy?
cv::calcHist(foo, channels, cv::UMat(), hist_d, histSize, ranges, false);

【讨论】:

【参考方案2】:

这就是我如何使用 cv::UMat:

std::vector<int> channels =  0 ;
std::vector<int> histSize =  256 ;
std::vector<float> range =  0, 256 ;
std::vector<cv::UMat> foo =  oInputMat ;
cv::calcHist(foo, channels, cv::UMat(), oHistogram, histSize, range, false);

【讨论】:

以上是关于如何使用 OpenCV 的直方图?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用opencv比较存储在文件中的两个图像

如何使用 OpenCV 减少图像中的颜色数量?

使用Python,Opencv进行二维直方图的计算及绘制

使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析

如何在 OpenCV 中计算矩阵的直方图?

使用Python,OpenCV计算图像直方图(cv2.calcHist)