2012-11-28 4 views
3

카메라에서 움직임을 감지하기 위해 간단한 모션 감지 코드를 사용하려고합니다. 저는 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; 

} 

어떤 도움을 주시면 감사하겠습니다!

+1

안녕하세요, "img_diff 행렬 합계"를 시도했지만 오류가 발생했다고합니다. 바이너리 이미지에서 (확장 후) 0이 아닌'cv :: countNonZero' 픽셀의 비율을 계산할 것을 제안합니다. –

답변

1

당신이 쉬운 방법을 찾고 있다면 내가 운동의 매개 변수로 img_diff의 평균을 사용하여 단 5 또는 10 (가정 8 비트 회색) 등의 임계 값의 평균을 비교하는 것 :

if(mean(img_diff) > thresval){ 
    cout << "motion detected!" << endl; 
    } 

이 방법을 사용하면 임계 값을 이미지의 크기로 조정할 필요가 없습니다. 그러나 나는 현재 및 이전 프레임만을 사용하여 모션을 감지하는 일반적인 문제점을 보았습니다. 고주파수 모션 또는 빠른 모션 만 감지합니다. 슬로우 모션을 감지하려면 현재 프레임을 5 또는 10 프레임 이전의 이전 프레임과 비교해야합니다.

+0

컴퓨터 비전에 대한 경험이 없습니다. 왜 그렇게 될지 설명해 주시겠습니까? 두 프레임 간에는 몇 가지 차이점이 있습니다. 왜 그것을 설명하지 않겠습니까? –

+1

문제는 모션이 전혀 없더라도 항상 두 프레임 사이에 차이가 있다는 것입니다. 이는 조명에 따라 1 % ~ 5 % 정도의 센서 노이즈로 인한 것입니다. 따라서 감지하는 "동작"이 사실상 잡음이 아닌지 확인하려면 충분히 높은 차이가 필요합니다. –

+0

오케이. 알 겠어. –

관련 문제