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
OpenCV Mat类:访问多通道矩阵的元素_Opencv_Matrix - Fatal编程技术网

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

OpenCV Mat类:访问多通道矩阵的元素,opencv,matrix,Opencv,Matrix,我现在想把一些值读入一个3通道、480行乘以640列的8位无符号整数值矩阵。我正在初始化矩阵,如下所示: 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] =

我现在想把一些值读入一个3通道、480行乘以640列的8位无符号整数值矩阵。我正在初始化矩阵,如下所示:

    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*;

        }
     }
声明:

rgbMatrix = Mat::zeros(480,640,CV_8UC3);
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*;

        }
     }
当我尝试遍历整个矩阵时,我无法使用以下方法分配/获取值。值只是保持为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*;

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

声明:

rgbMatrix = Mat::zeros(480,640,CV_8UC3);
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*;

        }
     }
rgbMatrix0=Mat::zeros(480640,CV_8UC1);
rgbMatrix1=Mat::零(480640,CV_8UC1);
rgbMatrix2=Mat::零(480640,CV_8UC1);
对于(int i=0;i
现在,我只想使用一个矩阵来进行这些操作,因为必须跟踪三个独立的变量会在一段时间后变得很烦人。我有一种感觉,我没有访问三通道矩阵内存中的正确点。有人知道我如何完成我在代码第二部分中所做的,但使用一个三通道矩阵而不是三个单独的一通道矩阵吗


谢谢。

很抱歉,我无法看到您的代码,因为我是从iPhone编写的。使用3通道矩阵时,可以使用以下方法获得像素:

Vec3b pix=rgbMatrix.at(行,列)

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


另外,RGB矩阵像素通常为vec3b或vec3d类型。始终将image.at转换为相关类型

非常简单,使用Vec3b-用于uchar,Vec3i-用于int,Vec3f-用于float,Vec3d-用于double

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;



    }
 }
Mat rgbMatrix=Mat::zeros(480640,CV_8UC1);
对于(int i=0;i
有很多方法可以做到这一点,例如:

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;
cv::Mat rgbMatrix(480640,cv_8UC3);
对于(int i=0;i
[k] 这是通道值

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

cv::Mat rgbMatrix2(cv::Size(480,640), CV_8UC3, cv::Scalar(5,5,5));
std::cout << rgbMatrix2 << std::endl;
cv::Mat rgbMatrix2(cv::Size(480640),cv_8UC3,cv::Scalar(5,5,5));
std::cout
向量xyzBuffer;
cv::Mat xyzBuffMat=cv::Mat(307200,1,cv_32FC3);
对于(int i=0;i
这里,0、1和2分别是存储x、y和z值的通道