2011-06-17 99 views
1

我當前想要將某些值讀入一個3通道480行640列矩陣的8位無符號整數值。我初始化矩陣是這樣的:OpenCV Mat類:訪問多通道矩陣的元素

聲明:

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通過柱8 640位無符號整數值),並嘗試訪問的元素這些矩陣下面的代碼工作:

聲明:

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

     } 
    } 

現在,我想用這些行動只是一個矩陣,具有跟蹤三個獨立的變量會得到一段時間後煩人。我有一種感覺,我沒有訪問三通道矩陣的正確內存點。有誰知道我如何能夠完成我在第二部分代碼中所做的工作,但是使用一個三通道矩陣而不是三個單獨的單通道矩陣?

謝謝。

回答

3

對不起,我從iPhone寫信以來看不到您的代碼。當您使用3通道矩陣時,您可以使用以下像素:

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

現在你可以訪問頻道使用: pix [0] = 255; pix [1] + = pix [2];

P.s.一般rgbMatrix像素的類型是vec3b或vec3d。總投image.at <>相關類型

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; 



    } 
} 
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; 
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值。