【问题标题】:Opencv imread() to Mat_<float>Opencv imread() 到 Mat_<float>
【发布时间】:2014-05-02 17:35:37
【问题描述】:

我在我的程序中读取了许多图像,并使用以下代码读取每个图像。

cv::Mat_<float> LoadedImage = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);

而且,它适用于某些图像,但不适用于所有图像。 (图片均为JPG文件)

我使用 VS 2010 调试模式检查了结构,LoadedImage 具有以下结构。

Structure http://imageshack.com/a/img838/451/5n17.png

不知何故行为零(但列是正确的)。有人能向我解释为什么吗? :)

提前谢谢你。

我正在输入我目前正在使用的代码来避免这个问题。但我不确定为什么必须这样做。

// Read image with imread() to Mat
cv::Mat LoadedImage_CharFormat = imread(fullfilename);  

// Convert to Gray image
if(LoadedImage_CharFormat.type() != CV_8UC1)
    cvtColor(LoadedImage_CharFormat, LoadedImage_CharFormat, CV_RGB2GRAY);

// Convert to Mat_<float> 
cv::Mat_<float> LoadedImage;
LoadedImage_CharFormat.convertTo(LoadedImage, CV_32F);

这是您可以尝试的图像。 http://imagizer.imageshack.us/a/img845/4624/y8h0.jpg

【问题讨论】:

  • 似乎无法正常打开文件!(Bad Ptr)
  • 是的,无法正常打开。它显示正确的列但 0 行。它不仅无法打开,而且我认为还有其他原因。我想知道那个原因。 :)
  • 您是否尝试仅打开那些文件!我的意思是不要一一阅读它们以达到那个糟糕的形象!首先打开它,让我们知道!如果您能与我们分享您的图像就更好了
  • 我尝试先打开它。它仍然失败......

标签: opencv


【解决方案1】:

您无法将灰度 (uchar) 图像直接读取到浮点垫中。 相反,

Mat m = imread("image.jpg",0);
Mat_<float> fm;

m.convertTo(fm,CV_32F);

【讨论】:

  • 感谢您的回答。是的,没错。为了避免这个问题,我实际上做了与你写的完全相同的方式。但奇怪的是我所有的图像都是彩色图像。其中一些对我发布的代码很好,但其中一些不是。
  • Opps,我按下回车键,它只是添加了评论。 :) 无论如何,所有图像都是彩色的,但我不知道为什么其中一些只是返回 0 行。这是 JPG 格式的内部类型吗? (压缩类型?)谢谢。
  • 不,提供的字节数与通道*深度不匹配,想想看,一个 rgb 像素需要 3 个字节,分别。浮动表示需要 12.
  • 谢谢你。所以你的代码的 imread("imagefile.txt", 0) 会将每个像素保存到 Mat m 中的 1 个字节,然后每个像素转换为 Mat_ 中的浮点类型,对吗?
  • 顺便说一句,我尝试了您的代码,但它仍然在第一行失败,因为它仍然读取 0 行。要正确读取行,我必须调用 imread("image.jpg") ,这意味着第二个参数是 1(默认值)。这是供您测试的图像。 imageshack.com/a/img845/4624/y8h0.jpg
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2021-02-27
相关资源
最近更新 更多