Выполнение фильтрации изображений с помощью OpenCV & C ++, ошибка: «Размеры входных аргументов не совпадают» - PullRequest
0 голосов
/ 20 апреля 2020

Вот как я называю свое изображение и определяю свою кнопку:

img = imread("lena.jpg");

createButton("Show histogram", showHistCallback, NULL, QT_PUSH_BUTTON, 0);
createButton("Equalize histogram", equalizeCallback, NULL, QT_PUSH_BUTTON, 0);
createButton("Cartoonize", cartoonCallback, NULL, QT_PUSH_BUTTON, 0);

imshow("Input", img);
waitKey(0);
return 0;

Я могу правильно позвонить и показать свое изображение. Функция Отображение гистограммы и выравнивания гистограммы также работает правильно. Но когда я попытался вызвать Cartoonize , я получил эту ошибку:

[ WARN:0] global /home/hiro/Documents/OpenCV/opencv-4.3.0-source/modules/core/src/matrix_expressions.cpp (1334) 
assign OpenCV/MatExpr: processing of multi-channel arrays might be changed in the future: https://github.com/opencv/opencv/issues/16739
terminate called after throwing an instance of 'cv::Exception'
what():OpenCV(4.3.0) /home/hiro/Documents/OpenCV/opencv-4.3.0-source/modules/core/src/arithm.cpp:669: 
error: (-209:Sizes of input arguments do not match) 
The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function 'arithm_op'

Итак, я предполагаю, что моя ошибка происходит из-за функции CartoonCallback, ошибка канала. Я позаботился о том, чтобы мои мутипликации происходили между изображениями одного и того же канала, я преобразовал все обратно в 3 канала, но, похоже, не могу понять, откуда возникла ошибка. Вот код:

void cartoonCallback(int state, void* userdata){
    Mat imgMedian;
    medianBlur(img, imgMedian, 7);

    Mat imgCanny; 
    Canny(imgMedian, imgCanny, 50, 150); //Detect edges with canny
    Mat kernel = getStructuringElement (MORPH_RECT, Size(2,2));
    dilate(imgCanny, imgCanny, kernel); //Dilate image

    imgCanny = imgCanny/255;
    imgCanny = 1 - imgCanny;

    Mat imgCannyf; //use float values to allow multiply between 0 and 1
    imgCanny.convertTo(imgCannyf, CV_32FC3);
    blur(imgCannyf, imgCannyf, Size(5,5));

    Mat imgBF; 
    bilateralFilter(img, imgBF, 9, 150.0, 150.0); //apply bilateral filter
    Mat result = imgBF/25; //truncate color
    result = result*25;

    Mat imgCanny3c; //Create 3 channels for edges
    Mat cannyChannels[] = {imgCannyf, imgCannyf, imgCannyf};
    merge(cannyChannels, 3, imgCanny3c);

    Mat resultFloat; 
    result.convertTo(imgCanny3c, CV_32FC3); //convert result to float
    multiply(resultFloat, imgCanny3c, resultFloat);

    resultFloat.convertTo(result, CV_8UC3); //convert back to 8 bit
    imshow("Cartoonize", result);
}

Есть предложения?

1 Ответ

1 голос
/ 20 апреля 2020

Проблема в этом фрагменте:

cv::Mat resultFloat; // You prepare an output mat... with no dimensions nor type
result.convertTo(imgCanny3c, CV_32FC3); //convert result to float..ok
cv::multiply(resultFloat, imgCanny3c, resultFloat); //resultFloat is empty and has no dimensions!

Как видите, вы передаете resultFloat в cv::multiply(operand1, operand2, output), но resultFloat пусто, без размеров и типа, а затем пытаетесь умножить это с imgCanny3c. Это кажется причиной ошибки.

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