我尝试了以下方式。使用从uchar到CV_32SC1的convertTo函数
imgCanny.convertTo(imgCanny32, CV_32SC1);
这只是给了我一张空白的图片.Canny32。
以下方式产生相同的结果。
imgCanny32 = Matrix(imgCanny.size(), CV_32SC1);
for (int i = 0;i < imgCanny.size().height;i++)
for (int j = 0;j < imgCanny.size().width;j++)
imgCanny32.at<int>(i,j) = imgCanny.at<uchar>(i,j);
我无法想到任何其他方式。
答案 0 :(得分:1)
正如您所描述的那样,您从一个8位单通道图像开始。这意味着每个像素由无符号字节表示,因此可以具有0到255之间的值。
接下来,使用alpha
和beta
的默认值执行cv::Mat::convertTo
。这意味着在新Mat
中,每个像素由带符号的32位整数表示,但值将保持在0-255范围内。
最后,您将此Mat
传递给cv::imshow
函数。请注意文档:
如果图像是16位无符号或32位整数,则像素为 除以256.即,值范围[0,255 * 256]被映射到 [0255]
由于输入图像包含的最大像素值为255,并且像素除以256,因此该功能显示的图像将全部显示为黑色。
也就是说,您展示的两种转换方式都是正确的,但我更喜欢convertTo
,因为它会进行优化。如果您想要显示CV_32SC1
图片,可能应该为转换应用适当的缩放系数(alpha = 256
)。