2012-04-03 52 views
0

我得到了視頻(.avi)的參考圖像,因此圖像的寬度和高度必須與視頻的寬度和高度相同。爲什麼opencv無法正確報告IplImage *的寬度和高度?

(我的視頻是一個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.我認爲我的分辨率很高。我知道該視頻是由諾基亞5800手機拍攝的。這對我來說非常重要,所以請原諒我,如果我非常具體!

+1

看起來您的圖像是RGB,而您錯誤地使用了CV_IMAGE_ELEM,這就是爲什麼您只能看到圖像的三分之一被設置爲白色。 – 2012-04-03 13:11:14

+0

還有一個問題:當我說'if(dots [i] .x> = x1 && dots [i] .x <= x2 && dots [i] .y> = y1 && dots [i] .y < = y2)'它仍然考慮寬度的1/5!點是一個'矢量'。問題是什麼? – 2012-04-03 13:58:46

回答

2

如果圖像不是單一的通道,您使用的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。