OpenCV Mat问题:直方图与此循环之间的区别

时间:2019-05-24 16:40:28

标签: c++ opencv

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

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

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

2-在重写函数((do1ChnHist))中,它暗示了该循环计算1D直方图(是吗?):

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函数的主循环返回不同的答案... 谢谢...

1 个答案:

答案 0 :(得分:-1)

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...

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