【问题标题】:OpenCV cuda::meanStdDev support for CV_32FC1OpenCV cuda::meanStdDev 支持 CV_32FC1
【发布时间】:2019-05-15 08:04:30
【问题描述】:

我想找到 GPUMat 的平均像素值和标准偏差,并在 GPU 上进行此缩减,而不必下载图像并在 CPU 上计算平均值(因为这会在我的应用程序中大大减慢我的速度) .问题是,我正在处理的 GpuMat 图像是 32 位浮点数 - 但是 opencv documentation 声明

目前支持 CV_8UC1 矩阵

我编译下面的代码没有问题:

#include <opencv2/core/core.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaarithm.hpp>

int main(int argc, char** argv)
{
  cv::cuda::GpuMat img = cv::cuda::GpuMat(cv::Mat::zeros(cv::Size(kIWEWidth,kIWEHeight), CV_32FC1));
  cv::Scalar mean, std;
  cv::cuda::meanStdDev(img, mean, std);
}

但是,当我尝试实际执行此操作时,我遇到了 error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'meanStdDev'

所以,我想知道是否有人知道是否可以在 meanStdDev 方法上编译具有 32 位浮点支持的 OpenCV,或者是否可以推荐任何替代方法。例如,我意识到我应该能够使用cuda::sum、cuda::subtract 和cuda::sqrSum 找到平均值。但这需要大量内核启动,在我的特殊情况下,每一微秒都很重要。

无论如何,提前感谢您的帮助!

【问题讨论】:

    标签: opencv opencv3.0


    【解决方案1】:

    我觉得 cv::cuda 版本只支持 CV_8U1 真的很奇怪,因为它实际上调用了 npp 函数 nppiMean_StdDev_8u_C1R,并且存在更多图像类型的版本。

        void meanStdDev_32FC1M(cv::cuda::GpuMat src, cv::cuda::GpuMat mask, double *mean, double *stddev)
    {
        CV_Assert(src.type() == CV_32FC1);
        double *mean_dev, *stddev_dev;
    
        cudaMalloc((void**)&mean_dev, sizeof(double));
        cudaMalloc((void**)&stddev_dev, sizeof(double));
    
        NppiSize sz;
        sz.width = src.cols;
        sz.height = src.rows;
    
        int bufSize;
    
        nppiMeanStdDevGetBufferHostSize_32f_C1R(sz, &bufSize);//nppSafeCall
    
        cv::cuda::BufferPool pool(cv::cuda::Stream::Null());
        cv::cuda::GpuMat buf = pool.getBuffer(1, bufSize, CV_8UC1);
    
        nppiMean_StdDev_32f_C1MR(src.ptr<Npp32f>(), static_cast<int>(src.step), mask.ptr<Npp8u>(), static_cast<int>(mask.step), sz, buf.ptr<Npp8u>(), mean_dev, stddev_dev);
    
        cudaMemcpy(mean, mean_dev, sizeof(double), cudaMemcpyDeviceToHost);
        cudaMemcpy(stddev, stddev_dev, sizeof(double), cudaMemcpyDeviceToHost);
    
        cudaFree(mean_dev);
        cudaFree(stddev_dev);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 2018-02-16
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 2015-12-22
      相关资源
      最近更新 更多