2012-04-03 10 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の両方で動作させています。私の解像度は高いと思います。私はビデオがNokia 5800携帯電話で撮影されていることを知っています。それは私のためにとても重要ですので、もし私が非常に具体的なら私は言い訳!

+1

画像がRGBで、CV_IMAGE_ELEMが正しく表示されていないように見えます。そのため、白く​​設定されている画像の3分の1しか表示されません。 –

+0

さらに別の問題があります:if(dots [i] .x> = x1 && dots [i] .x <= x2 && dots [i] .y> = y1 && dots [i] .y < = y2) 'それはまだ幅の1/5を考慮する!ドットは 'ベクトル'です。何が問題ですか? –

答えて

2

画像は、単一のチャネルではない場合、あなたはCV_IMAGE_ELEMを使用している誤って

それはBGRのためにそう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を与えるためにポインタをインクリメントしてください。

関連する問題