2012-09-20 8 views
7

ここに問題があります:OpenCV v.2.4.2でグレースケールイメージを読み込みます。 ここで、たとえば、位置(0,0)のピクセルの値を知りたいと思います。 私は試しました:OpenCVの行列値が表示されます

Mat image=imread("00001.jpg",1); 
cvtColor(image,image,CV_RGB2GRAY); 
int a=image.at<unsigned>(0,1); 
printf("%d ",a); 

これは実際には機能しません。任意のデータ型(CV_8U、CV_32S ...)でピクセル値を取得する方法は?

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

+0

(0,0)の代わりに(0,1)を使用していますか? – count0

答えて

4

あなたはここで2つの間違いを犯しています。

イメージを読み取っているときに、入力引数として1を指定しています。 imreadで説明したように、この関数は3つの異なる形式で画像を読み取ることができます。

CV_LOAD_IMAGE_UNCHANGED(< 0)(存在する場合に、アルファチャンネルを含む)される画像をロード CV_LOAD_IMAGE_GRAYSCALE強度1
CV_LOAD_IMAGE_COLORが(> 0)は、RGB形式の画像をロードするように(0)画像をロード

あなたが使用している次のステップでは、第二引数

としてCV_LOAD_IMAGE_GRAYSCALEを使用する必要がありますあなたのケースのための

:CORRないimage.at<unsigned>(0,1);何かに賛成する。 <unsigned>を使用しますが、コンパイラに「UNSIGNED?UNSIGNED what ???」と表示されます

これを行うより良い方法は、CV_LOAD_IMAGE_COLORCV_LOAD_IMAGE_GRAYSCALEのような正しいラベルを使用することです。以下の例では、画像を1つのチャンネル(CV_LOAD_IMAGE_GRAYSCALE)に読み込み、グレイスケールに自動的に変換します。

#include <cv.h> 
#include <highgui.h> 

#include <iostream> 

using namespace std; 
using namespace cv; 

int main() 
{ 
    Mat gImg = imread("img.png", CV_LOAD_IMAGE_GRAYSCALE); 

    uchar val; 
    val = gImg.at<uchar>(0,0); 

    cout << (int)val << endl; 

    imshow("showImg",gImg); 
    cvWaitKey(0); 

    return 1; 
} 
+0

いいえ、これは機能しますが、これが実際に出力するものを試しましたか?私の場合、私は画素(0,0)に対して-89を得ます。画像が8ビット符号なしの場合、これはどのように可能ですか?次に、なぜあなたはucharを使うのですか? –

+0

もちろん私はそれを試してみました。なぜ出力が正しく得られないのか分かりません。上記の@ count0のコメントで説明したのと同じ理由でUCHARを使用しました。つまり、0〜255の値を表すことができます。 – masad

+1

このようにしてimreadを使用することはできません。 2番目の引数は、画像のグレースケール、3チャネルの色、またはそのままにするかどうかによって、0、> 0または<0のいずれかのフラグです。タイプを正確に指定することはできません。 CV_8U == 0なので特定のケースで動作します。 – Sassa

0

あなたはOpenCVのは、どのようなタイプを使用して、より良いアイデアを持っているとそれを表現したのかを見つけることを試みることができます:

cout << image.depth() << ", " << image.channels() << endl; 

また要素へのアクセスについては、このdiscussionをチェックしてください。

+0

まあ、私は深さとチャネルを知っていますが、私はMatrixがCV_8UC1であるように、行列が通常のイメージ8bitと符号なしの整数であることを知っていれば、どのパラメータをMat :: atに渡すべきですか?ここまで正確に:image.at (0,1); –

+0

CV_8UC1は8ビットの符号なしシングルチャネルを意味するので、0..255の値を表す 'unsigned char'となります。符号なし整数は、CV_16UC1となる0..65536の値を表します。 – count0

0

まず、この方法でピクセル値を取得する一般的な方法はありません。 atを使用する場合は、常に値の正しいタイプを指定する必要があります。この場合、イメージを8ビットの符号なしグレースケール(1チャネル)に変換するので、a=image.at<uchar>(0,1);を実行する必要があります。

OpenCVではチャネルの順序としてBGRを使用しているので、RGB2GRAYではなくCV_BGR2GRAYを使用することをお勧めします。

また最初からグレースケールとしてあなたのイメージを読み、もう一度ucharを使用することができます。これを行う簡単な方法は、

Mat image = imread("00001.jpg",0); // note the 0 flag 
int a=image.at<uchar>(0,1); 
printf("%d ",a); 
1

があります。

Mat.dataは、元のデータ行列を参照するポインタを与える。

n行m列、だから

Mat img = imread("filename.jpg",CV_LOAD_IMAGE_COLOR); 
unsigned char *input = (unsigned char*)(img.data); 

int i,j,r,g,b; 
for(int i = 0;i < img.cols;i++){ 
    for(int j = 0;j < img.rows;j++){ 
     b = input[img.cols * j + i ] ; 
     g = input[img.cols * j + i + 1]; 
     r = input[img.cols * j + i + 2]; 
    } 
} 

の画素値を取得するには、これはカラー画像についてです。グレースケール画像の場合、

Mat img = imread("filename.jpg",CV_LOAD_IMAGE_COLOR); 
Mat g; 
cvtColor(img, g, CV_BGR2GRAY); 
unsigned char *input = (unsigned char*)(g.data); 

int i,j,r,g,b; 
for(int i = 0;i < img.cols;i++){ 
    for(int j = 0;j < img.rows;j++){ 
     g = input[img.cols * j + i]; 
    } 
} 

詳細はblogpostを参照してください。