Задача OpenCV Mat: разница между гистограммой и этим циклом - PullRequest
0 голосов
/ 24 мая 2019

Я работаю над проектом обработки изображений, который я хочу реализовать на cuda с opencv (opencv 4.0 с cuda suport), и я не очень хорош в c ++.Для коррекции цвета между двумя изображениями я использую код по этой ссылке: (https://answers.opencv.org/question/178127/matching-colors-between-two-pictures-in-opencv/)

Моя цель - реализовать этот код на графическом процессоре. Для этого я попытался переписать этот код. У меня возникли две проблемы:

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 голосов
/ 24 мая 2019

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

зависит, может быть массивом 1D, и может быть массивом 2D, зависит от цвета.Сначала вы должны изучить базовый принцип обработки изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...