3

カメラからの動きを検出するために、単純な動き検出コードを使用しようとしています。私はOpenCVライブラリを使用しており、2つのフレームの違いを検出して変化を検出し、しきい値を使用して違いの白黒画像を作成するコードをいくつか持っています。

私の問題: モーションが検出された場合に true または false の出力を取得する簡単な方法がわかりません。私はこのコードを別の場所から入手しましたが、すべての詳細に精通していません。img_diff マトリックスを合計しようとしましたが、エラーが発生しました。モーションが検出された場合、つまり背景の差がゼロではない場合、「真の」出力を取得する最も簡単な方法は何でしょうか? たとえば、現在のフレームと前のフレームの 2 つのマトリックスを比較する if ステートメントは機能しますか?

私が使用しようとしているコードは以下のとおりです。

int main(int argc, char** argv)
{
const char * _diffType = getCmdOption("-type", "2", argc, argv);
const char * _thresval = getCmdOption("-thr", "60", argc, argv);

int diffType = atoi( _diffType );
int thresval = atoi( _thresval );

VideoCapture cap(0);
if( !cap.isOpened() ) return -1;

Mat cam_frame, img_gray, img_prev, img_diff, img_bin;

const char *win_cam = "Camera input"; namedWindow(win_cam, CV_WINDOW_AUTOSIZE);
const char *win_gray = "Gray image"; namedWindow(win_gray, CV_WINDOW_AUTOSIZE);
const char *win_diff = "Binary diff image"; namedWindow(win_diff, CV_WINDOW_AUTOSIZE);

bool first_frame = true;
while (cvWaitKey(4) == -1) {
cap >> cam_frame;
cvtColor(cam_frame, img_gray, CV_BGR2GRAY);

if (first_frame) {
img_prev=img_gray.clone();
first_frame = false;
continue;
}

absdiff(img_gray, img_prev, img_diff);
threshold(img_diff, img_bin, thresval, 255, THRESH_BINARY);
erode(img_bin, img_bin, Mat(), Point(-1,-1), 3);
dilate(img_bin, img_bin, Mat(), Point(-1,-1), 1);

imshow(win_cam, cam_frame);
imshow(win_gray, img_gray);
imshow(win_diff, img_bin);

if (diffType == 1) img_prev=img_gray.clone();
}

return 0;

}

どんな助けでも大歓迎です!

4

1 に答える 1