свертка: conv2 matlab для opencv - PullRequest
       15

свертка: conv2 matlab для opencv

0 голосов
/ 23 ноября 2018

Если я установлю входное изображение и ядро ​​в:

cv::Mat conv2D(cv::Mat input,cv::Mat kernel){
    printf("\nINPUT [ %d x %d ]\n",input.rows,input.cols);
    cout << input <<endl;
    printf("\nKERNEL [ %d x %d ]\n",kernel.rows,kernel.cols);
    cout << kernel <<endl;

    cv::Mat flipped_kernel;
    cv::Point2i pad;
    cv::Mat result;
    cv::Mat padded;
    cv::Point anchor(kernel.cols -kernel.cols/2 -1,kernel.rows -kernel.rows/2 -1 );
    cv::flip( kernel, flipped_kernel, -1 );
    printf("\nFLIPPED KERNEL [ %d x %d ]\n",flipped_kernel.rows,flipped_kernel.cols);
    cout << flipped_kernel <<endl;
    pad = cv::Point2i( kernel.cols - 1, kernel.rows - 1);
    cv::copyMakeBorder( input, padded, pad.y, pad.y, pad.x, pad.x, cv::BORDER_CONSTANT,cv::Scalar(0) );
    cv::Rect region = cv::Rect( pad.x / 2, pad.y / 2, padded.cols - pad.x, padded.rows - pad.y);

    cv::filter2D( padded, result , padded.depth(), flipped_kernel, anchor, 0, cv::BORDER_CONSTANT );
    cv::Mat out = result( region );

    printf("\nOUT [ %d x %d ]\n",out.rows,out.cols);
    cout << out <<endl;
    return out;
}

Вывод будет отличаться от:

conv2(input,kernel)

Чтение в Интернете, кто-то говорит, что переворот является ошибкой, но другие говорят,не.Поэтому я использовал симметричную матрицу вращения в качестве ядра, и результат все еще был неверным.Как я могу выполнить 2-й свертки и 2-й кросс-корреляции в C ++?

1 Ответ

0 голосов
/ 26 ноября 2018

Проблема заключалась в том, что я передал маты opencv типа CV_32F, и это дает мне неверный результат, я преобразовал изображения в CV_8UC1 с помощью метода:

input.convertTo (input, CV_8UC1);flipped_kernel.convertTo (input, CV_8UC1);

И после операции измените тип вывода:

out.convertTo (input, CV_32F);

Так что метод работает!

...