2013-01-13 4 views
7

のためのOpenCVに私は次のコードで書かれているのUbuntu 12.04とOpenCVの22-Dマットオブジェクト

を使用しています:

IplImage* img =0; 
    img = cvLoadImage("nature.jpg"); 
    if(img != 0) 
    { 
     Mat Img_mat(img); 
     std::vector<Mat> RGB; 
     split(Img_mat, RGB); 

     int data = (RGB[0]).at<int>(i,j)); /*Where i, j are inside the bounds of the matrix size .. i have checked this*/ 
} 

問題を私は負の値と非常に大きな値を取得しているデータ変数です。私はどこかで間違いを犯したと思う。あなたはそれを指摘できますか? 私は文書を読んでいます(私はそれを完全に終えていません。かなり大きいです)。しかし、私が読んだことから、これはうまくいくはずです。しかし、それはisnt。ここで何がうまくいかないのですか?

答えて

11

Img_matは3チャンネル画像です。各チャネルは、データ型のピクセル値ucharで構成されています。 split(Img_mat, BGR)の場合、Img_matは青、緑、赤の3つのプレーンに分割され、合計でベクトルBGRに格納されます。だから、BGR[0]は、私はあなたが

を書きたいと思います...ので、それはそうで

int dataB = (int)BGR[0].at<uchar>(i,j); 
int dataG = (int)BGR[1].at<uchar>(i,j); 

になります... @bsdnoobz

ucharデータ型の画素を有する最初の(青)面であります

Vec3b data = Img_mat.at<Vec3b>(i,j); data[0] = // blue pixel data[1] = // green pixel 

など...

+0

ねえ、おかげで:)私の問題を解決しました。 – Chani

1

なぜ最初にIplImageをロードしていますか?あなたはCとC++のインターフェイスを混在させています。 imvreadで直接cv :: Matを読み込む方が簡単です。

このようにして、タイプを指定して、あなたのアットコールでタイプを使用することもできます。

+0

答えが問題を解決しません。 – Chani

+0

@RitwikGでもいいアドバイスです。 –

+0

@NenadBulatovic true – Chani

2

cv::Mat::at(i,j)の正しいタイプを指定する必要があります。ピクセルはintにアクセスしていますが、ベクトルはucharである必要があります。コードは次のようになります。

IplImage* img = 0; 
img = cvLoadImage("nature.jpg"); 
if(img != 0) 
{ 
    Mat Img_mat(img); 
    std::vector<Mat> BGR; 
    split(Img_mat, BGR); 

    Vec3b data = BGR[0].at<Vec3b>(i,j); 
    // data[0] -> blue 
    // data[1] -> green 
    // data[2] -> red 
}