2011-06-17 30 views
1

現在、いくつかの値を8ビットの符号なし整数値の3チャネル、480行×640列の行列に読み込みたいとします。私は次のメソッドを使用して/グラブ値を割り当てることができません全体の行列を反復処理しようとするとOpenCV Matクラス:マルチチャネルマトリックスの要素へのアクセス

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

宣言:私はこのような行列を初期化しています。値は、単に0私のコードは次のようになり滞在:私は(8ビット符号なし整数値の640列でも480行)3つの別々の1チャネル行列を宣言するとき、しかし

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

     } 
    } 

の要素にアクセスしようとしますこれらの行列次のコードは動作します:

宣言:

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つの別々の変数を追跡するためのものとして、これらの操作のためのちょうど1のマトリックスを使用したいです。私は、3チャンネルマトリックスのためにメモリ上の正しい点にアクセスしていないと感じています。誰かが、私がコードの2番目の部分で行ったことをどのように達成できるのか分かっていますが、3つの別々の1チャネル行列の代わりに1つの3チャネル行列を使用していますか?

ありがとうございました。

答えて

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の値。