写给IplImage imageData

时间:2011-08-01 13:37:00

标签: image-processing opencv iplimage

我想直接将数据写入IplImage的imageData数组,但是我找不到很多关于它如何格式化的信息。令我特别困扰的一件事是,尽管创建了一个包含三个通道的图像,但每个像素有四个字节。

我用来创建图像的功能是:

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

根据所有迹象,这应该创建一个三通道RGB图像,但似乎并非如此。

例如,我如何向该图像写一个红色像素?

感谢您的帮助,这让我很难过。

3 个答案:

答案 0 :(得分:8)

如果您正在查看frame->imageSize请注意它是frame->height * frame->widthStep,而不是frame->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;
}

答案 1 :(得分:0)

unsigned char * imageData = [r1,g1,b1,r2,g2,b2,...,rN,bn,gn]; // n =高度*图像宽度 frame-&gt; imageData = imageData。

将您的图像作为高度为N和宽度为M的维数组,并将其排列为长度为N * M的行向量。对于IPL_DEPTH_8U图像,请使用unsigned char *类型。

答案 2 :(得分: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;