趣味は車輪の再発明♪

[opencv] ImageDataPtr - IplImage::imageDataをカプセル化


詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識
Gary Bradski Adrian Kaehler
オライリージャパン
売り上げランキング: 25,746


■ たかみんつ / ソフト開発メモINDEX / OpenCVリファレンス(じぶん用) / 関数・クラスの使い方・サンプルなど /


画像の全画素を左上から右下へ走査する場合に利用できるクラスです。 IplImageのビット深度(depth)とチャネル数(nChannels)の組み合わせによって、煩雑になるポインタの動かし方をカプセル化しています。

++単項演算子で、次の画素へ移動します。チャンネル数が1なら右隣のピクセルへ移動します。3チャンネルならR,G,Bの順に移動します。

// IplImageのimageDataをカプセル化
class ImageDataPtr {
private:
    IplImage* image;
    void* vp;
    size_t element_size;
public:
    //デフォルトコンストラクタ
    inline ImageDataPtr() 
        : image(0), vp(0), element_size(0)
    {
    }
    //コンストラクタ
    inline ImageDataPtr(IplImage* image) {
        setImage(image); 
    }
    //IplImageの代入
    inline ImageDataPtr& operator = (IplImage* image) { 
        setImage(image); 
        return *this;
    }
    //走査ポインタを1画素分右へ進める。
    inline const ImageDataPtr& operator ++ () { 
        inc(); 
        return *this;
    }
    inline const ImageDataPtr& operator ++ (int) { 
        inc(); 
        return *this;
    }
    //走査ポインタを上からy行目の左端へセットする。
    inline void setLine(int y) { 
        vp = image->imageData + image->widthStep * y;
    }
    //ポインタ位置の値をdoubleとして取り出す。
    inline operator double() { 
        return getValue(); 
    }
    //ポインタ位置へ値を格納する。
    inline double operator = (double value) { 
        setValue(value); 
        return value; 
    }
private:
    inline void setImage(IplImage* image) {
        this->image = image;
        vp = image->imageData;
        switch(image->depth) {
            case IPL_DEPTH_8U:
                element_size = sizeof(unsigned char);
                break;
            case IPL_DEPTH_16U:
                element_size = sizeof(unsigned short);
                break;
            case IPL_DEPTH_32F:
                element_size = sizeof(float);
                break;
            default: break;
        }
    }
    inline void inc() { add(1); }
    inline void add(int n) {
        vp = (char*)vp + n * element_size;
    }
    inline double getValue() {
        double fvalue = 0;
        switch(image->depth) {
            case IPL_DEPTH_8U:
                fvalue = (double)*(unsigned char*)vp;
                break;
            case IPL_DEPTH_16U:
                fvalue = (double)*(unsigned short*)vp;
                break;
            case IPL_DEPTH_32F:
                fvalue = (double)*(float*)vp;
                break;
            default:
                break;
        }
        return fvalue;
    }
    inline void setValue(double fvalue) {
        switch(image->depth) {
            case IPL_DEPTH_8U:  
                *(unsigned char*)vp  = (unsigned char)fvalue; 
                break;
            case IPL_DEPTH_16U: 
                *(unsigned short*)vp = (unsigned short)fvalue;
                break;
            case IPL_DEPTH_32F: 
                *(float*)vp = (float)fvalue; 
                break;
            default: break;
        }
    }
};

関連文書


Pythonプロフェッショナルプログラミング 第2版
秀和システム (2015-05-21)
売り上げランキング: 1,813


クラウドではじめる機械学習 Azure MLでらくらく体験
脇森浩志 杉山雅和 羽生貴史
リックテレコム
売り上げランキング: 2,081

実践Node.js プログラミング (Programmer's SELECTION)
Mike Cantelon Marc Harter T.J. Holowaychuk Nathan Rajlich
翔泳社
売り上げランキング: 40,213

■ たかみんつ / ソフト開発メモINDEX / OpenCVリファレンス(じぶん用) / 関数・クラスの使い方・サンプルなど /



RSS Feed Widget
[opencv] ImageDataPtr - IplImage::imageDataをカプセル化
(http://bicycle.life.coocan.jp/takamints/index.php/doc/opencv/doc/ImageDataPtr)
by Koji Takami ( email: vzg03566@gmail.com, GitHub: takamin )