2014-04-26 4 views
0

나는 모션 감지에 OpenCV를 사용하고 있습니다. net에서 다음 코드를 얻었습니다.opencv를 사용하여 느리게 움직이는 객체 만 감지

cv::Mat frame; 
    cv::Mat back; 
    cv::Mat fore; 
    cv::VideoCapture cap(0); 
    bg.nmixtures = 3; 
    bg.bShadowDetection = false; 
const int history = 5; 
cv::BackgroundSubtractorMOG2 bg (history,nmixtures,bShadowDetection); 

    std::vector<std::vector<cv::Point> > contours; 

    cv::namedWindow("Frame"); 
    cv::namedWindow("Background"); 

    for(;;) 
    { 
     cap >> frame; 
     bg.operator()(frame,fore); 
     bg.getBackgroundImage(back); 
     cv::erode(fore,fore,cv::Mat()); 
     cv::dilate(fore,fore,cv::Mat()); 
     cv::findContours(fore,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE); 
     cv::drawContours(frame,contours,-1,cv::Scalar(0,0,255),2); 
     cv::imshow("Frame",frame); 
     cv::imshow("Background",back); 
     if(cv::waitKey(30) >= 0) break; 
    } 

그렇다면 임계 값을 설정하여 새 프레임과 이전 프레임의 변경이 임계 값을 초과하면 아무것도 수행하지 마십시오. 아니면 천천히 움직이는 물체를 캡처하는 제 상황에 맞는 다른 알고리즘 일 수도 있습니다.

답변

0

느리게 움직이는 물체를 감지하고 싶다면 가우스 모델을 혼합하여 히스토리 값을 변경할 수 있습니다 (증가 시키십시오).

+0

실제로 시도했지만,이 경우에는 느리고 빠르게 움직입니다. – user2588495

+0

두 개의 임계 값을 계산하여 두 임계 값을 빼면이 경우 느린 값에 대해서만 모션을 얻을 수 있습니다. – Bharat

0

모든 프레임을 BG 빼기의 입력으로 사용하는 대신 프레임의 이동 평균을 사용할 수 있습니다. 또는 이동 평균을 사용하여 BG 빼기를 출력 한 다음 임계 값으로 이진화하십시오.

addWeightedmoving Average (누적 이동 평균 참조)을 참조하십시오.

통합은 빠른 변경의 영향을 줄입니다.

관련 문제