如何从CV_8UC4矩阵中获取值

How to get a value from CV_8UC4 matrix

本文关键字:获取 8UC4 CV      更新时间:2023-10-16

我成功地用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]。如何访问矩阵中的无符号字符值?

我试过这样:

uchar xValue = cpu_depth.at(cv::Point(20, 20))[0];

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

我想明白了。您需要声明每个通道具有4个字节的强制转换。因此,为了正确访问矩阵中的点,您可以这样做:

uchar xValue = cpu_depth.at<cv::Vec4b>(cv::Point(20, 20))[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个值。

因此,对于所需channel(x, y)位置的访问元素,您可以使用以下选项:

  • cpu_depth.at<cv::Vec4b>(cv::Point(x, y))[channel]——得到(x, y)点的通道值
  • cpu_depth.at<cv::Vec4b>(y, x)[channel]-在点(x, y)-得到channel的值-矩阵的第一个索引是行,这就是为什么首先是y,然后是x
  • *(cpu_depth.ptr<uchar>(y) + 4 * x + channel)—指针在y行和x列中的值,即在位置(x, y)