首页 > 解决方案 > OpenCV Mat 问题:直方图和这个循环之间的区别

问题描述

我正在研究图像处理项目,我想用opencv(opencv 4.0 with cuda suport)在cuda上实现它,我不擅长c++。对于两个图像之间的颜色校正,我正在使用此链接中的代码:(https://answers.opencv.org/question/178127/matching-colors-between-two-pictures-in-opencv/

我的目标是在 GPU 上实现此代码。为此,我试图重写该代码。我面临两个问题:

1-为此目的是否有任何 Cuda 实现的库?(相同的功能)

2-在重写函数((do1ChnHist))中,这个循环计算一维直方图(这是真的吗?):

for (size_t p = 0; p<img.total(); p++)
    {
        if (mask(p) > 0)
        {
            uchar c = img(p);
            h(c) += 1.0;
        }
    }

但我不能用:

int histSize = 256;
float range[] = { 0, 256 }; //the upper boundary is exclusive
const float* histRange = { range };
bool uniform = false, accumulate = false;
calcHist(&img, 1, 0, Mat(), h, 1, &histSize, &histRange, uniform, accumulate);

或者用这个循环重写它(为了在未来改变 Mat >> GpuMat。不幸的是 Opencv_cuda 不支持 GpuMat_<>,因为我试图用 Mat 重写循环):

Mat h;
h = Mat::zeros(cv::Size(256, 1), CV_16U);
uchar x;
for (size_t m = 0; m < img.size().width; m++)
    {
        for (size_t n = 0; n < img.size().width; n++)
        {
            x = img.at<int>(Point(m, n));
            h.at<int>(Point(int(x),0)) += 1;
        }
    }

因为两个选项的以太从 do1ChnHist 函数中的主循环返回不同的答案...谢谢...

标签: c++opencv

解决方案


Opencv 拥有你想要的所有功能

virtual void cv::cuda::TemplateMatching::match  (   InputArray  image,
InputArray  templ,
OutputArray     result,
Stream &    stream = Stream::Null() 
)   

void    cv::cuda::calcHist (InputArray src, OutputArray hist, Stream &stream=Stream::Null())
    Calculates histogram for one channel 8-bit image. More...

void    cv::cuda::calcHist (InputArray src, InputArray mask, OutputArray hist, Stream &stream=Stream::Null())
    Calculates histogram for one channel 8-bit image confined in given mask. More...

取决于,可能是一维数组,也可能是二维数组,取决于颜色。你应该先学习一些基本的图像处理原理。


推荐阅读