Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将16位深度CvMat*转换为8位深度_C++_Opencv_Input_Kinect_Depth - Fatal编程技术网

C++ 将16位深度CvMat*转换为8位深度

C++ 将16位深度CvMat*转换为8位深度,c++,opencv,input,kinect,depth,C++,Opencv,Input,Kinect,Depth,我正在与Kinect和OpenCV合作。我已经在这个论坛上搜索过了,但是我没有发现任何类似我的问题。 我保存来自Kinect的原始深度数据(16位),将其存储在CvMat*中,然后将其传递给cvGetImage以从中创建IplImage*: CvMat* depthMetersMat = cvCreateMat( 480, 640, CV_16UC1 ); [...] cvGetImage(depthMetersMat,temp); 但现在我需要处理这张图像,以便进行CVD并找到轮廓。这两个函

我正在与Kinect和OpenCV合作。我已经在这个论坛上搜索过了,但是我没有发现任何类似我的问题。 我保存来自Kinect的原始深度数据(16位),将其存储在CvMat*中,然后将其传递给cvGetImage以从中创建IplImage*:

CvMat* depthMetersMat = cvCreateMat( 480, 640, CV_16UC1 );
[...]
cvGetImage(depthMetersMat,temp);
但现在我需要处理这张图像,以便进行CVD并找到轮廓。这两个函数需要输入8位深度图像。如何将CvMat*深度计转换为8位深度CvMat*?

这应该可以:

CvMat* depthMetersMat = cvCreateMat( 480, 640, CV_16UC1 );
cv::Mat m2(depthMetersMat, true);
m2.convertTo(m2, CV_8U);

但是,CvMat已经过时。你应该改用Mat。

@SSteve给出的答案对我几乎起到了作用,但是调用
convertTo
似乎只是切掉了高阶字节,而不是实际将值缩放到8位范围。由于@Sirnino没有指定需要哪种行为,我想我应该发布代码来进行(线性)缩放,以防其他人想要这样做

SSteve的原始代码:

 CvMat* depthMetersMat = cvCreateMat( 480, 640, CV_16UC1 );  
 cv::Mat m2(depthMetersMat, true);  
 m2.convertTo(m2, CV_8U);
要缩放值,只需将比例因子(1/256,或0.00390625,用于16位到8位的缩放)作为第三个参数(alpha)添加到调用
convertTo

m2.convertTo(m2, CV_8U, 0.00390625);

还可以添加第四个参数(增量),该参数将在乘以alpha后添加到每个值。有关更多信息,请参阅。

什么是“缩放值”?@Maystro,无符号16位数字的值可以在0到65535之间的任意位置,但我们需要将这些值放入8位数字中,该数字只能容纳0到255的值。所以我们应用一个比例因子,这意味着你用一个常数乘以每个值,在这个例子中,乘以0.00390625。原始矩阵中任何值为0到255的数字都会得到一个新值0,256到511变为1,512到767变为2,依此类推。这就像m2。convertTo(m2/256,cv8u)对吗?另一个问题,如果我们没有传递比例因子参数呢?如何计算?正确。在将其传递给函数之前,可以将比例因子应用于矩阵。如果不缩放这些值,那么
convertTo()
函数似乎只是将16位值的额外位切掉,使其适合8位。你必须检查我在回答中引用的文档的链接,看看到底发生了什么。比例因子对我来说似乎是错误的。我们希望将[0-65535]ushort(CV_16U)的范围映射到uchar(CV_8U)的[0-255]。因此,方程式为255=65535/x。x正好是257,所以比例因子是1/257,对吗?在python中会是什么样子?