重要提示: :我已解决此问题。 最后的解决方案。
我要达到什么目的? 使用OpenCV cv :: imshow 方法显示图像。 (imshow Documentation)
创建的3x3矩阵图像如下:
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'
我已经尝试了什么?
Mat mask(3, 3, CV_32F, new float[9]{0, 1, 0, 1, 0, 1, 0, 1, 0});
相同错误 imwrite("mask.png", mask)
保存图像看起来像
this。我知道的很小。我将值缩放到0到255之间,因为png需要什么。 工作正常 围绕我已损坏的行填写代码:
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);
}
仅供参考::最后一行引发了相同的异常,这就是为什么将其注释掉了。我用“遮罩”问这个问题,因为它更容易。
写完问题后,我有了另一个主意。
解决方案:我将CV_32F
类型的矩阵转换为CV_8U
矩阵,并将所有值缩放到0到255的范围内。这解决了问题。
这是我应该首先想到的。由于某种原因,我花了一个小时才意识到。万一有人遇到相同的错误或思维障碍,我还是在这里发布。
答案 0 :(得分:1)
解决方案:我将CV_32F类型矩阵转换为CV_8U矩阵,并将所有值缩放到0到255的范围内。这解决了问题。
编辑:如Nikolaj Fogh所述,还可以恢复到OpenCV版本3.4.3。我自己没有测试。
答案 1 :(得分:0)
为完整起见,这是实施Philipp解决方案的方法(使用其程序的变量):
cv::Mat dist_8U; // to store the scaled image with appropriate type
double Min,Max;
cv::minMaxLoc(rgb,&Min,&Max);
dist -= Min;
dist.convertTo(dist_8U,CV_8U,255.0/(Max-Min));
然后dist_8U
可以在opencv 4.0.0中与imshow
一起显示。
在树莓派上进行了测试。