c++ - Mat 的 convertTo 函数在将灰度图像类型转换为 OpenCV 中的 CV_32F 时提示断言错误

标签 c++ opencv

我是 OpenCV 的新人。我刚收到一个错误,我不明白为什么会发生,也不知道如何解决。

这是我的代码。

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char *argv[])
{
  Mat I = imread("water.jpg", 0);
  Mat W = imread("laosiji.jpg", CV_LOAD_IMAGE_GRAYSCALE);
  cout << I.channels() << endl;
  Mat CI(I.rows,I.cols,CV_32FC);
  I.convertTo(CI, CV_32FC);
  Mat FI;
  Mat IFI;

  dft(CI,FI,DFT_COMPLEX_OUTPUT | DFT_SCALE);
  idft(FI,IFI);
  imshow("water.jpg after idft transformation",IFI);

  return 0;
}

当我运行程序时,它给了我一个错误:

    OpenCV Error: Bad number of channels (Source image must have 1, 3 or 4 channels) in cvConvertImage, file /var/tmp/portage/media-libs/opencv-3.1.0-r7/work/opencv-3.1.0/modules/imgcodecs/src/utils.cpp, line 611
terminate called after throwing an instance of 'cv::Exception'
  what():  /var/tmp/portage/media-libs/opencv-3.1.0-r7/work/opencv-3.1.0/modules/imgcodecs/src/utils.cpp:611: error: (-15) Source image must have 1, 3 or 4 channels in function cvConvertImage

但是从上面的代码来看,程序输出的 channel 数是1,我对OpenCV不是很熟悉,所以很难搞定这个问题,请问有哪位高手能出来解释一下吗?提前致谢。

最佳答案

这个回答应该是@Dan Mašek 写的,但是他可能太忙了,我等了好几天都没有任何回复,所以我只好自己回答了。 首先,错误的症结不在于convertTo()函数的显式调用,否则就是在imshow()函数中隐式调用造成的。在我的代码中,我在 idft() 之后调用了 imshow()。但是 idft() 返回一个有 2 个 channel 的矩阵。并且 convertTo 的隐式调用需要一个包含 1、3 或 5 个 channel 的矩阵作为参数。因此出现了错误。

关于c++ - Mat 的 convertTo 函数在将灰度图像类型转换为 OpenCV 中的 CV_32F 时提示断言错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43740641/

相关文章:

c++ - 协变返回类型无效转换错误

xcode - 什么是.framework文件,如何获取?

c++ - 修改 OpenCV RandomTree 分类器

android - 使用适用于 Android 的 openCV 时无法找到正确的 FAST-SURF 匹配项

c++ - 迭代器或指针的 std::enable_if 或 SFINAE

C# 按引用传递(ref 关键字)问题

c++ - 引用和对象切片

opencv - Tiny yolo v4 dnn 模块 opencv 无检测

c# - 在opencv中检测到一个完整的椭圆

c++ - 使用访问者模式对事件进行排序