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, и результаты, которые я получаю, всегда неверны.
Самое смешное, что этот код работает на моем ноутбуке правильно, а на рабочем столе - нет.
Почему это происходит?