【问题标题】:OpenCV: Assertion failed " dst.data == widget->original_image->data.ptr in function 'cvImageWidgetSetImage' "OpenCV:断言失败“ dst.data == widget->original_image->data.ptr in function 'cvImageWidgetSetImage'”
【发布时间】:2019-03-19 16:42:51
【问题描述】:

重要提示:我解决了这个问题。 最后解决。

我想达到什么目标? 使用 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'

链接到window_gtk.cpp

我已经尝试了什么?

  1. 在 Internet 上查找错误。也许其他人已经遇到过同样的问题。 不。什么都没有
  2. 将矩阵更改为仅包含正浮点值(0 到 1),以防出现负输入问题。初始化:Mat mask(3, 3, CV_32F, new float[9]{0, 1, 0, 1, 0, 1, 0, 1, 0}); 同样的错误
  3. 在不同位置调用这两种方法,以防在我的其他代码中发生更改。 同样的错误
  4. 编写小型 OpenCV 程序来运行这两行代码。 同样的错误
  5. 上述想法的各种组合。 同样的错误
  6. 显示我从内存中读取的其他图像,而不是自己创建它们。 工作得很好
  7. 通过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 的范围内。这样就解决了问题。

这是我应该首先想到的。由于某种原因,我花了一个小时才意识到。以防万一其他人遇到同样的错误或精神障碍,我仍然在这里发布。

【问题讨论】:

  • 我遇到了同样的问题。通过恢复到最新发布的 OpenCV (3.4.3) 版本来修复它。
  • 好的。很高兴知道。我应该提到我使用 OpenCV 版本 4.0.0

标签: c++ opencv highgui


【解决方案1】:

解决方案: 我将 CV_32F 类型矩阵转换为 CV_8U 矩阵,并将所有值缩放到 0 到 255 的范围内。这样就解决了问题。

编辑: 正如 Nikolaj Fogh 所说,也可以恢复到 OpenCV 版本 3.4.3。我自己没有测试。

【讨论】:

  • 在打印出无法显示的变量类型(cout << dst.type(); 给出类型 = 21,CV_32F)后,我对变量类型得出了相同的结论,您找到了解决方案,+ 1 和 +1!
【解决方案2】:

为了完整起见,这是实现 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。 在树莓派上测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 2022-01-10
    • 1970-01-01
    • 2023-03-23
    • 2014-01-08
    • 2019-04-15
    • 2014-02-10
    相关资源
    最近更新 更多