我尝试了以下方法。使用 convertTo 函数从 uchar 转换为 CV_32SC1
imgCanny.convertTo(imgCanny32, CV_32SC1);
这只会给我一个空白的 imageCanny32。
以下方式产生相同的结果。
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);
我想不出任何其他方式。
最佳答案
正如您所描述的,您从一个 8 位单 channel 图像开始。这意味着每个像素都由一个无符号字节表示,因此可以具有 0 到 255 之间的值(含 0 和 255)。
接下来,您执行 cv::Mat::convertTo
,使用 alpha
和 beta
的默认值。这意味着在新的 Mat
中,每个像素都由带符号的 32 位整数表示,但值将保持在 0-255 的范围内。
最后,您将此 Mat
传递给 cv::imshow
功能。注意文档:
If the image is 16-bit unsigned or 32-bit integer, the pixels are divided by 256. That is, the value range [0,255*256] is mapped to [0,255].
由于输入图像包含的最大像素值为 255,像素除以 256,因此函数显示的图像将呈现全黑。
也就是说,您显示的两种转换方式都是正确的,尽管我更喜欢 convertTo
,因为它会被优化。如果您想显示 CV_32SC1
图像,也许您应该为转换应用适当的缩放因子 (alpha = 256
)。
关于c++ - 如何转换简历类型 :Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44100532/