ВАЖНЫЙ: Я исправил проблему. Решение в конце.
Чего я пытаюсь достичь?
Показать изображение с OpenCV резюме :: imshow метод. (imshow Документация)
Изображение, представляющее собой матрицу 3х3, создается примерно так:
Mat mask(3, 3, CV_32F, new float[9]{0, 1, 0, 1, -4, 1, 0, 1, 0});
Для отображения изображения я звоню imshow("mask", mask);
В чем моя проблема?
Как я уже упоминал в заголовке, при попытке отобразить изображение возникает исключение. Полное сообщение об ошибке:
terminate called after throwing an instance of 'cv::Exception' what():
OpenCV(4.0.0-pre) /home/mrlab/Libraries/opencv_source/modules/highgui
/src/window_gtk.cpp:146: error: (-215:Assertion failed)
dst.data == widget->original_image->data.ptr in function 'cvImageWidgetSetImage'
Ссылка на window_gtk.cpp
Что я уже пробовал?
Mat mask(3, 3, CV_32F, new float[9]{0, 1, 0, 1, 0, 1, 0, 1, 0});
та же ошибкаimwrite("mask.png", mask)
ПохожеПолный код вокруг моих поврежденных строк:
void high_pass(){
Mat src_f;
// Fourier transform src_bw
src_f = fourier(src_bw);
// Create Laplace High Pass Kernel
Mat mask(3, 3, CV_32F, new float[9]{0, 1, 0, 1, -4, 1, 0, 1, 0});
// In case of using fp values (0 to 1) initialize like this:
// Mat mask(3, 3, CV_32F, new float[9]{0, 1, 0, 1, 0, 1, 0, 1, 0});
imshow("mask", mask);
// Fourier transform kernel
Mat mask_f = fourier_kernel(mask, src_f.size());
Mat hp_filtered;
// Apply filter
mulSpectrums(src_f, mask_f, hp_filtered, DFT_ROWS);
// Transform it back
dst = fourier_inv(hp_filtered);
// Swap quadrants after applying filter
dst = swap_quadrants(dst);
// Show result
//imshow(WINDOW_NAME + "high pass", dst);
}
FYI: Последняя строка выдает то же исключение, поэтому оно закомментировано. Я задаю вопрос с «маской», потому что это проще.
После написания вопроса у меня появилась другая идея.
Решение: Я преобразовал CV_32F
тип матрицы для CV_8U
матрица и масштабировать все значения в диапазоне от 0 до 255. Это решило проблему.
Это то, о чем я должен был подумать первым. По какой-то причине мне потребовался один час, чтобы понять. На всякий случай, если кто-то еще сталкивается с той же ошибкой или умственным блокированием, я все еще публикую это здесь.
Решение: Я преобразовал матрицу типа CV_32F в матрицу CV_8U и масштабировал все значения в диапазоне от 0 до 255. Это решило проблему.
Редактировать: По словам Николая Фога, также возможно вернуться к OpenCV версии 3.4.3. Я не проверял это сам.
Других решений пока нет …