запись в IplImage imageData - PullRequest
       50

запись в IplImage imageData

5 голосов
/ 01 августа 2011

Я хочу записать данные непосредственно в массив imageData IplImage, но я не могу найти много информации о том, как он отформатирован.Меня особенно беспокоит то, что, несмотря на создание изображения с тремя каналами, каждый пиксель имеет четыре байта.

Функция, которую я использую для создания изображения:

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

По всем признакам, это должно создать трехканальное RGB-изображение, но, похоже, это не так.

Как, например, написать один красный пиксель для этого изображения?

Спасибо за любую помощь, это поставило меня в тупик.

Ответы [ 3 ]

8 голосов
/ 01 августа 2011

Если вы смотрите на 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;
}
0 голосов
/ 20 декабря 2012

Прямо на ваш ответ, закрасив пиксель красным:

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;
0 голосов
/ 01 августа 2011

без знака char * imageData = [r1, g1, b1, r2, g2, b2, ..., rN, bn, gn]; // n = высота * ширина изображения frame-> imageData = imageData.

Возьмите Ваше изображение, представляющее собой размерный массив высотой N и шириной M, и поместите его в векторный ряд длины N * M. Сделайте это с типом unsigned char * для изображений IPL_DEPTH_8U.

...