Почему opencv неправильно сообщает ширину и высоту IplImage *?

Я получил эталонное изображение видео (.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. Это так важно для меня, так что извините, если я был очень конкретным!


person Milad R    schedule 03.04.2012    source источник
comment
Похоже, ваше изображение RGB, и вы неправильно используете CV_IMAGE_ELEM, поэтому вы видите, что только одна треть изображения настроена на белый цвет.   -  person Paul R    schedule 03.04.2012
comment
Есть еще одна проблема: когда я сказал if (dots[i].x >= x1 && dots[i].x <= x2 && dots[i].y >= y1 && dots[i].y <= y2), он по-прежнему учитывает 1/5 ширины! точки - это vector<CvPoint>. В чем проблема?   -  person Milad R    schedule 03.04.2012


Ответы (1)


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

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

Итак, для БГР:

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 вдоль строки.

person Martin Beckett    schedule 03.04.2012