C++ 如何转换cv:Mat的类型

C++ 如何转换cv:Mat的类型,c++,opencv,C++,Opencv,我试着用下面的方法。使用convertTo函数从uchar到CV_32SC1 imgCanny.convertTo(imgCanny32, CV_32SC1); 这只给了我一张空白的照片 下面的方法产生相同的结果 imgCanny32 = Matrix(imgCanny.size(), CV_32SC1); for (int i = 0;i < imgCanny.size().height;i++) for (int j = 0;j < imgCanny.

我试着用下面的方法。使用convertTo函数从uchar到CV_32SC1

imgCanny.convertTo(imgCanny32, CV_32SC1);
这只给了我一张空白的照片

下面的方法产生相同的结果

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);
imgCanny32=矩阵(imgCanny.size(),CV_32SC1);
对于(int i=0;i

我想不出任何其他方法。

正如您所描述的,您从8位单通道图像开始。这意味着每个像素由一个无符号字节表示,因此其值可以介于0和255之间(含0和255)

接下来,使用
alpha
beta
的默认值执行。这意味着在新的
Mat
中,每个像素都由一个有符号的32位整数表示,但值将保持在0-255(包括0-255)范围内

最后,将此
Mat
传递给函数。请注意文档:

如果图像是16位无符号或32位整数,则像素为 除以256。也就是说,值范围[0255*256]被映射到 [0255]

由于输入图像包含的最大像素值为255,且像素除以256,因此该函数显示的图像将显示为全黑色



也就是说,您显示的两种转换方式都是正确的,尽管我更喜欢
convertTo
,因为它将被优化。如果要显示
CV\u 32SC1
图像,可能应该为转换应用适当的比例因子(
alpha=256
)。

什么意义上的“空白”?验证每个像素为0的那个?或者你把结果反馈给我,结果看起来全黑的那一个?我做imshow的那一个,结果全黑的。好的,在这种情况下很清楚:)一定要阅读文档,在这种情况下不要相信你的眼睛。(即使您能够显示16位灰度,您也无法辨别此处涉及的差异)。更多信息请参见我的答案。