如何从CV_8UC4矩阵中获取值

时间:2015-12-18 13:37:16

标签: c++ opencv

我使用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];

但它没有编译,我觉得我错过了一些非常明显的东西。

2 个答案:

答案 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)