OpenCV Mat类:访问多通道矩阵的元素

时间:2011-06-17 14:51:57

标签: opencv matrix

我目前想要将一些值读入一个3通道,480行×640列的8位无符号整数值。我正在初始化矩阵:

声明:

rgbMatrix = Mat::zeros(480,640,CV_8UC3);

当我尝试遍历整个矩阵时,我无法使用以下方法分配/获取值。值只保持为0.我的代码如下所示:

    for (int i = 0; i < rgbMatrix.rows; i++)
    {
        for (int j = 0; j < rgbMatrix.cols; j++)
        {
           (rgbMatrix.data + rgbMatrix.step * i)[j * rgbMatrix.channels() + 0] = *value0*;
           (rgbMatrix.data + rgbMatrix.step * i)[j * rgbMatrix.channels() + 1] = *value1*;
           (rgbMatrix.data + rgbMatrix.step * i)[j * rgbMatrix.channels() + 2] = *value2*;

        }
     }

但是,当我声明三个单独的1通道矩阵(也是480行乘以640列的8位无符号整数值)并尝试访问这些矩阵的元素时,以下代码可以工作:

声明:

rgbMatrix0 = Mat::zeros(480,640,CV_8UC1);
rgbMatrix1 = Mat::zeros(480,640,CV_8UC1);
rgbMatrix2 = Mat::zeros(480,640,CV_8UC1);

    for (int i = 0; i < rgbMatrix0.rows; i++)
    {
        for (int j = 0; j < rgbMatrix0.cols; j++)
        {
           (rgbMatrix0.data + rgbMatrix0.step * i)[j] = *value0*;
           (rgbMatrix1.data + rgbMatrix1.step * i)[j] = *value1*;
           (rgbMatrix2.data + rgbMatrix2.step * i)[j] = *value2*;

        }
     }

现在,我想只使用一个矩阵进行这些操作,因为必须跟踪三个单独的变量会在一段时间后变得令人厌烦。我有一种感觉,我没有在内存中找到三通道矩阵的正确点。有谁知道我如何能够完成我在第二部分代码中所做的工作,但使用一个三通道矩阵而不是三个独立的单通道矩阵?

感谢。

4 个答案:

答案 0 :(得分:4)

有很多方法可以做到,例如:

cv::Mat rgbMatrix(480,640,CV_8UC3);
for (int i = 0; i < rgbMatrix.rows; i++)
  for (int j = 0; j < rgbMatrix.cols; j++)
    for (int k = 0; k < 3; k++)
      rgbMatrix.at<cv::Vec3b>(i,j)[k] = value;

[k]这里是频道值。

要将所有矩阵元素设置为特定值(例如5),例如,您可以执行以下操作:

cv::Mat rgbMatrix2(cv::Size(480,640), CV_8UC3, cv::Scalar(5,5,5));
std::cout << rgbMatrix2 << std::endl;

答案 1 :(得分:3)

抱歉,因为我是从iPhone写的,所以看不到你的代码。当您使用3通道矩阵时,您可以使用以下方式获取像素:

Vec3b pix = rgbMatrix.at(row,col);

现在您可以使用以下方式访问频道: pix [0] = 255; pix [1] + = pix [2];

P.S。通常rgbMatrix像素的类型为vec3b或vec3d。始终投射image.at&lt;&gt;相关类型

答案 2 :(得分:3)

非常简单使用Vec3b - 用于uchar,Vec3i - 用于int,Vec3f - 用于浮点数,Vec3d - 用于双倍

Mat rgbMatrix = Mat::zeros(480,640,CV_8UC1);


for (int i = 0; i < rgbMatrix.rows; i++)
{
    for (int j = 0; j < rgbMatrix.cols; j++)
    {
       rgbMatrix.at<Vec3b>(i,j)[0] = *value0;
       rgbMatrix.at<Vec3b>(i,j)[1] = *value1;
       rgbMatrix.at<Vec3b>(i,j)[2] = *value2;



    }
 }

答案 3 :(得分:0)

vector<cv::Point3f> xyzBuffer;
cv::Mat xyzBuffMat = cv::Mat(307200, 1, CV_32FC3);
for (int i = 0; i < xyzBuffer.size(); i++) {
    xyzBuffMat.at<cv::Vec3f>(i, 1, 0) = xyzBuffer[i].x;
    xyzBuffMat.at<cv::Vec3f>(i, 1, 1) = xyzBuffer[i].y;
    xyzBuffMat.at<cv::Vec3f>(i, 1, 2) = xyzBuffer[i].z;
}

这里,0,1和2分别是存储x,y和z值的通道。