2011-10-27 5 views
2

私はC++で画像データにアクセスするための可能な方法であることをhttp://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.htmlで読む:OpenCVのイメージ・ラッパーのcpp

template<class T> class Image 
{ 
    private: 
    IplImage* imgp; 
    public: 
    Image(IplImage* img=0) {imgp=img;} 
    ~Image(){imgp=0;} 
    void operator=(IplImage* img) {imgp=img;} 
    inline T* operator[](const int rowIndx) { 
    return ((T *)(imgp->imageData + rowIndx*imgp->widthStep));} 
}; 

typedef struct{ 
    unsigned char b,g,r; 
} RgbPixel; 

typedef struct{ 
    float b,g,r; 
} RgbPixelFloat; 

typedef Image<RgbPixel>  RgbImage; 
typedef Image<RgbPixelFloat> RgbImageFloat; 
typedef Image<unsigned char> BwImage; 
typedef Image<float>   BwImageFloat; 

だから私は同じようなものを使用することができるよ:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); 
RgbImage imgA(img); 
imgA[i][j].b = 111; 
imgA[i][j].g = 111; 
imgA[i][j].r = 111; 

I使用:

imgA[i][j].b 

私の質問はどのように画像のチャネルを知っていますか?私はC++が

img[i][j].b as blue channel 
img[i][j].g as green channel and 
img[i][j].r as red channel? 

は、それが構造体にデフォルトコンストラクタを持ってい移入方法を意味します!

答えて

3

テンプレート(テンプレートメタプログラミング)がどのように機能しているかを見てください。

あなたはコンストラクタを持っていますが、RGBチャンネルが

inline T* operator[](const int rowIndx) 
{ 
    return ((T *)(imgp->imageData + rowIndx*imgp->widthStep)); 
} 

あなたはRgbPixel構造のテンプレートをインスタンス化するとき、あなたの関数の意志になったに移入されています

inline RgbPixel* operator[](const int rowIndx) 
{ 
    return ((RgbPixel *)(imgp->imageData + rowIndx*imgp->widthStep)); 
} 

(両方のデータなのでイメージとRgbPixel構造)は、連続したメモリブロックに格納され、正しい情報が得られます。

+0

@CharlesB:質問の編集が完了していません。そして、私のコメントはとても役に立ちます。何を話しているのか分からない人に何か説明することはできませんでした。 – alinoz

+0

編集後にDownvoteが削除されました。この場合、投稿に「現在いくつかの詳細を追加しています」というような免責事項を追加することができます。 – CharlesB

+0

をモデレータにdownvotedされません:この投稿の私のフラグは時代遅れです – CharlesB