c++ - 如何使用OpenCV的直方图?

标签 c++ opencv opencv3.0

我正在努力在 OpenCV 中获取 float 据的直方图:

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);

最佳答案

看起来需要包装一下。

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);

关于c++ - 如何使用OpenCV的直方图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32929735/

相关文章:

ipython - 导入错误 : dynamic module does not define module export function (PyInit_cv2)

c++ - OpenCV 构建 G++ 符号错误/DSO 错误

linux - .so.3.0 和 .so 在 opencv 中有什么区别?

c++ - 我的链接列表程序有效,但它不会显示所有列表

c++ - 在使用 C++ 和 .NET 的 Windows 系统编程中,如何进行 System.Diagnostics::Process.Start() 调用并在原始窗口中输出?

c++ - 标准布局 c++

image-processing - 在肖像图像中检测头发?

c++ - 如何在不运行 'make install' 的情况下使用 OpenCV?

opencv - Jmyron 和 Windows 8

c++ - xvalue 上的下标表达式的值类别