Почему opencv правильно сообщает ширину и высоту IplImage *? - PullRequest
0 голосов
/ 03 апреля 2012

Я получил эталонное изображение видео (.avi), поэтому ширина и высота изображения должны совпадать с шириной и высотой видео.

(мое видео CvCapture*, а мое изображение IplImage*)

Ширина 1280 и высота 960;

Но когда я сказал OpenCV, что если координата пикселя находится в определенном прямоугольнике, тогда что-то сделайте. Вся ширина изображения была шириной этого прямоугольника.

const int Y1 = 430, Y2 = 730, X1 = 0, X2 = 1279 ;
for (int i = Y1; i <= Y2; i++)
    for (int j = X1; j <= X2; j++)
        CV_IMAGE_ELEM(frame_BGR, uchar, i, j) = 255;

Но только около 1/5 ширины страницы теперь белая! Тогда я X2 = 3000. Тогда вся ширина изображения теперь белая, и глупо то, что когда я изменяю X2 = 10000, тогда код не сообщает SEGMENTATION FAULT.

Почему отчеты о ширине не работают правильно?

Я запускаю его как в Ubuntu - g ++, так и в Windows 7 - visual studio 2010. Думаю, мое разрешение высокое. Я знаю, что видео снято на телефон Nokia 5800. Это так важно для меня, так что извините, если я был очень конкретен!

1 Ответ

2 голосов
/ 03 апреля 2012

Если изображение не одноканальное, вы используете CV_IMAGE_ELEM неправильно

Это должно быть pixel = CV_IMAGE_ELEM( frame_BGR, uchar, row_number, col_number * 3 + color_channel );

Так что для BGR:

uchar blue = CV_IMAGE_ELEM( frame_BGR, uchar, row_number, col_number * 3 + 0 );
uchar green = CV_IMAGE_ELEM( frame_BGR, uchar, row_number, col_number * 3 + 1 );
uchar red = CV_IMAGE_ELEM( frame_BGR, uchar, row_number, col_number * 3 +  2);

На самом деле CV_IMAGE_ELEM не стоит затраченных усилий, вы также можете просто использовать frame_BGR.ptr (row), чтобы получить указатель на начало строки, а затем увеличить указатель, чтобы получить B, G, R вдоль строки.

...