【发布时间】:2020-06-08 22:06:57
【问题描述】:
我有一个算法可以做一些事情。其中,如果我正在处理CV_8UC3 图像,则转换工作正常,但如果文件类型为C_16UC3,则会出错。
这是一些代码:
//new image is created
Mat3w img(100,100,Vec3w(1000,0,0));
//Image Conversion - ERROR!
cv::Mat inputSource;
//saving the image here will work
img.convertTo(inputSource, CV_64FC3);
//saving the image here will not work -> black image
问题在于CV_16UC3 图像的处理结果是正确尺寸但全黑的图像。
问题在于转换,因为在之前保存图像会得到一个合法的图像,而在之后保存它会得到一个几乎完全白色的图像。
编辑:
我做了一些改动:删掉了一些无用的代码,添加了 inputSource 声明。
现在,当我尝试一些东西时,我得出的结论是,要么我不了解 CV 类型,要么发生了一些奇怪的事情。
我一直认为类型中的数字表示每个通道的位数。所以,在我看来,CV_16UC3 是一个 3 通道,每个通道 16 位。我在测试期间保存的图像(在 img.convertTo 之前)实际上每个通道号都有匹配的位,这一事实加强了这个想法。奇怪的是,保存的inputSource(类型CV_64FC3)是8bpc图片。
我错过了什么?
【问题讨论】:
-
好的,我做了一些修改!由于复制/粘贴错误,CV_MAKTYPE 在那里。在代码中它属于旧的转换线。相关代码几乎就是上面的代码。我创建了 Mat,它作为参数传递给声明 inputSource 并在这个新 Mat 中转换图像的函数。
-
@pedro 你得到什么样的错误信息?
-
如果没有错误但只是 imwrite 写入了错误的图像,请参阅 docs.opencv.org/modules/highgui/doc/… 不希望您保存浮点图像。而是尝试使用 imshow 显示垫子(每个通道中的值介于 0 = 黑色和 1 = 白色之间)或将值打印到终端。
-
好的,我想我已经成功了 :) 问题可能是算法设置了 255 位像素上限,但没有强制转换为 8 位。因此,加载 16 位图像会搞砸一切。现在它适用于 16 位 :) 它不会显示 32 位的图像,但这并不是一个真正的问题。我稍后会尝试,但我并不介意。再次感谢你! :D