OpenCV свертка на ROI

Я пытаюсь свернуть область моего изображения, в одном пикселе, чтобы быть более точным. Я также хочу, чтобы эта свертка использовала значения вне ROI при вычислении границ этой ROI. Чтобы проверить это, я написал следующий код.

float kernelData[25] = {0, 0, 0, 0, 0,
                        0, 0, 1, 0, 0,
                        0, 0, 1, 0, 0,
                        0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0};

float imgData[9*9] = {0,  0,  0,   0,   0,    0,  0,   0,  0,
                      0,  0,  0,   0,   0,    0,  0,   0,  0,
                      0,  0,  0,   0,   0,    0,  0,   0,  0,
                      0,  0,  0,   2, 256,  128,  0,   0,  0,
                      0,  0,  0,   4,   1,   64,  0,   0,  0,
                      0,  0,  0,   8,  16,   32,  0,   0,  0,
                      0,  0,  0,   0,   0,    0,  0,   0,  0,
                      0,  0,  0,   0,   0,    0,  0,   0,  0,
                      0,  0,  0,   0,   0,    0,  0,   0,  0};

Mat img = Mat(9, 9, CV_32FC1, (void*)imgData);
Mat kernel = Mat(5, 5, CV_32FC1, (void*)kernelData);
Mat window = Mat(img, Rect2i(Point2i(4, 4), Size(1, 1)));

Mat convolved1 = Mat(1, 1, CV_32FC1);
Mat convolved2 = Mat(1, 1, CV_32FC1);
Mat convolved3 = Mat(1, 1, CV_32FC1);
Mat convolved4 = Mat(1, 1, CV_32FC1);
Mat convolved5 = Mat(1, 1, CV_32FC1);

cv::filter2D(window, convolved1, CV_32F, kernel, Point(-1, -1), 0, BORDER_CONSTANT);
cv::filter2D(window, convolved2, CV_32F, kernel, Point(-1, -1), 0, BORDER_REPLICATE);
cv::filter2D(window, convolved3, CV_32F, kernel, Point(-1, -1), 0, BORDER_REFLECT);
cv::filter2D(window, convolved4, CV_32F, kernel, Point(-1, -1), 0, BORDER_REFLECT_101);
cv::filter2D(window, convolved5, CV_32F, kernel, Point(-1, -1), 0, BORDER_TRANSPARENT);

cout << img << endl;
cout << kernel << endl;
cout << window << endl;
cout << convolved1 << endl;
cout << convolved2 << endl;
cout << convolved3 << endl;
cout << convolved4 << endl;
cout << convolved5 << endl;

Выполнение этого кода показало эти результаты:

[0, 0, 0, 0, 0, 0, 0, 0, 0;
 0, 0, 0, 0, 0, 0, 0, 0, 0;
 0, 0, 0, 0, 0, 0, 0, 0, 0;
 0, 0, 0, 2, 256, 128, 0, 0, 0;
 0, 0, 0, 4, 1, 64, 0, 0, 0;
 0, 0, 0, 8, 16, 32, 0, 0, 0;
 0, 0, 0, 0, 0, 0, 0, 0, 0;    
 0, 0, 0, 0, 0, 0, 0, 0, 0;    
 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0;
 0, 0, 1, 0, 0;
 0, 0, 1, 0, 0;
 0, 0, 0, 0, 0;
 0, 0, 0, 0, 0]
[1]
[5]
[5]
[5]
[5]
[5]

Я проверил все типы границ, и ни один из них не дал правильного результата, 257. Я также пытался модифицировать ядро, меняя позиции 1 и 0, и результаты, которые я получаю, всегда неверны.

Самое смешное, что этот код работает на моем ноутбуке правильно, а на рабочем столе - нет.

Почему это происходит?

0 ответов

Другие вопросы по тегам