我使用Kinect V2 libfreenect2库中的深度和RGB数据成功创建并填充矩阵,如下所示:
cv::Mat(registered.height, registered.width, CV_8UC4, registered.data).copyTo(cpu_depth);
cv::imshow("depth", cpu_depth);
我相信这个矩阵对于图像中的每个点都与[X,Y,Z,R,G,B,A]等效。如何访问矩阵中的unsigned char值?
我试过这样的话:
uchar xValue = cpu_depth.at(cv::Point(20, 20))[0];
但它没有编译,我觉得我错过了一些非常明显的东西。
答案 0 :(得分:1)
我明白了。您需要声明每个chanel有4个字节并带有强制转换。因此,要正确访问矩阵中的点,请执行以下操作:
uchar xValue = cpu_depth.at<cv::Vec4b>(cv::Point(20, 20))[0];
答案 1 :(得分:0)
对于每个点,该矩阵不等同于[X,Y,Z,R,G,B,A]。该矩阵是cv::Vec4b
个元素的二维数组(即cv::Vec<uchar, 4>
个元素 - 每个通道一个uchar
个元素。每个元素可以是(R, G, B, A)
或(x, y, z, val)
或其他内容 - 它只是位置(x, y)
的4个值。
因此,对于所需(x, y)
位置channel
的访问元素,您可以使用以下选项:
cpu_depth.at<cv::Vec4b>(cv::Point(x, y))[channel]
- 获取点(x, y)
的通道值; cpu_depth.at<cv::Vec4b>(y, x)[channel]
- 在channel
点获取(x, y)
值 - 矩阵第一个索引是行,这就是为什么首先y
然后x
; *(cpu_depth.ptr<uchar>(y) + 4 * x + channel)
- y
- 第一行和第x
列中指针的值,i。即位置(x, y)
。