6

IplImageのimageData配列に直接データを書き込みたいのですが、フォーマット方法に関する多くの情報が見つかりません。私が特に困っているのは、3つのチャネルで画像を作成しているにもかかわらず、各ピクセルに4バイトがあることです。

画像の作成に使用している関数は次のとおりです。

IplImage *frame = cvCreateImage(cvSize(1, 1), IPL_DEPTH_8U, 3);

すべての兆候によって、これは3チャンネルのRGB画像を作成するはずですが、そうではないようです。

たとえば、その画像に1つの赤いピクセルを書き込むにはどうすればよいですか?

助けてくれてありがとう、それは私を困惑させます。

4

3 に答える 3

8

あなたが見ているなら、それはではなく、frame->imageSizeであることを覚えておいてください。frame->height * frame->widthStepframe->height * frame->width

BGRはOpenCVのネイティブ形式であり、RGBではありません。

また、始めたばかりの場合は、C ++インターフェイス(MatがIplImageを置き換える)の使用を検討する必要があります。これは将来の方向性であり、操作がはるかに簡単だからです。

ピクセルデータに直接アクセスするサンプルコードを次に示します。

int main (int argc, const char * argv[]) {

    IplImage *frame = cvCreateImage(cvSize(41, 41), IPL_DEPTH_8U, 3);

    for( int y=0; y<frame->height; y++ ) { 
        uchar* ptr = (uchar*) ( frame->imageData + y * frame->widthStep ); 
        for( int x=0; x<frame->width; x++ ) { 
            ptr[3*x+2] = 255; //Set red to max (BGR format)
        }
    }

    cvNamedWindow("window", CV_WINDOW_AUTOSIZE);
    cvShowImage("window", frame);
    cvWaitKey(0);
    cvReleaseImage(&frame);
    cvDestroyWindow("window");
    return 0;
}
于 2011-08-01T16:58:53.227 に答える
0

unsigned char * imageData = [r1、g1、b1、r2、g2、b2、...、rN、bn、gn]; //n=画像フレームの高さ*幅->imageData=imageData。

高さNと幅Mの次元配列である画像を取得し、長さN*Mの行方向のベクトルに配置します。IPL_DEPTH_8Uイメージの場合は、これをunsignedchar*タイプにします。

于 2011-08-01T13:53:11.860 に答える
0

あなたの答えにまっすぐに、ピクセルを赤く塗ってください:

IplImage *frame = cvCreateImage(cvSize(1, 1), IPL_DEPTH_8U, 3);
int y,x;
x=0;y=0; //Pixel coordinates. Use this for bigger images than a single pixel.
int C=2; //0 for blue, 1 for green and 2 for red (BGR is the default format).
frame->imageData[y*frame->widthStep+3*x+C]=(uchar)255;
于 2012-12-20T13:01:24.570 に答える