카메라에서 움직임을 감지하기 위해 간단한 모션 감지 코드를 사용하려고합니다. 저는 OpenCV 라이브러리를 사용하고 있으며, 변화를 감지하기 위해 두 프레임의 차이를 취한 다음 몇 가지 코드를 사용하여 임계 값을 사용하여 차이의 흑백 이미지를 만듭니다.모션 감지 opencv
내 문제 : 동작이 감지되면 true 또는 false 출력을 얻는 간단한 방법을 찾을 수 없습니다. 나는이 코드를 다른 곳에서 얻었고 모든 세부 사항에 익숙하지 않다. img_diff 행렬의 합계를 시도했지만 오류가 발생했습니다. 움직임이 감지되면 '실제'출력을 얻는 가장 간단한 방법은 무엇입니까? 배경 차이가 0이 아니란 것을 의미합니까? 예를 들어 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;
}
어떤 도움을 주시면 감사하겠습니다!
안녕하세요, "img_diff 행렬 합계"를 시도했지만 오류가 발생했다고합니다. 바이너리 이미지에서 (확장 후) 0이 아닌'cv :: countNonZero' 픽셀의 비율을 계산할 것을 제안합니다. –