2014-04-10 2 views
1

카메라를 열고 라이브 비디오/스트림에서 모션을 추적해야하는 어플리케이션을 만들고 있습니다. 현재 프레임의 얼굴 수를 검출 할 수있다.iOS 카메라 라이브 스트림에서 모션 감지

CIDetector를 사용하여 얼굴 인식 부분을 수행했지만 모션 감지를 수행 할 수 없습니다. 아무도 나에게 어떻게 안내해 줄 수 있습니까?

GPUImage를 사용했지만 다중 얼굴 인식을 지원하지 않습니다.

+0

가능한 중복 (http://stackoverflow.com/questions/18570807/motion-sensing-by-camera-in-ios) – Michal

+0

네하지만 GPUImage 여러 없습니다 얼굴 감지 –

답변

3

비슷한 앱을 개발했습니다. OpenCV를 사용하여 동작 탐지와 얼굴 탐지를 수행했습니다. 이 프로세스는 픽셀 버퍼 ref를 OpenCV Mat 객체로 변환하여이를 그레이 스케일로 변환하고 absDiff() 및 threshold() 함수를 수행하여 두 이미지 사이의 diff (동작)를 계산합니다.

그런 다음 얼굴에 대해 동일한 프레임을 다시 처리 할 수 ​​있습니다. 이것은 GPUI 가속을 사용하여 모션 감지를 할 수있는 GPUImage만큼 효율적이지 않을 수 있습니다.

int motionValue; 

    // Blur images to reduce noise and equalize 
    cv::Mat processedFrame = cv::Mat(originFrame.size(), CV_8UC1); 
    cv::blur(originFrame, processedFrame, cv::Size(2,2)); 

    // Get absolute difference image 
    cv::Mat diffMat; 
    cv::absdiff(processedFrame, prevFrame, diffMat); 

    // Apply threshold to each channel and combine the results 
    cv::Mat treshMat; 
    cv::threshold(diffMat, treshMat, kCCAlgorithmMotionSensitivity, 255, CV_THRESH_TOZERO); 

    // Find all contours 
    std::vector<std::vector<cv::Point> > contours; 
    cv::findContours(treshMat, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); 

    // Count all motion areas 
    std::vector<std::vector<cv::Point> > intruders; 
    for (int i = 0; i < contours.size(); i++) { 
     double area = cv::contourArea(contours[i]); 
     //NSLog(@"Area %d = %f",i, area); 
     if (area > kCCAlgorithmMotionMinAreaDetection){ 
      intruders.push_back(contours[i]); 
      motionValue += area; 
     } 
    } 
[아이폰 OS에서 카메라 모션 감지]의
+0

예 Vald GPU 이미지를 사용하여 전체 응용 프로그램을 만들었습니다. 하지만 안타깝게도 얼굴 인식 기능이 없습니다. 그게 왜 내가 이력서를 사용하고 있는지. open cv.because에서 모션 감지 코드를 주시겠습니까? 내가 말한 논리를 시도했지만 많은 문제가 있습니다. –

+0

편집 된 응답을 확인하십시오. 이것은 단지 발췌 일뿐입니다. compare 함수를 호출 할 때마다 이전 프레임 참조를 유지해야합니다. 이것은 모션을 감지하고 모션 값을 계산하는 diff 방식을 보여주기 위해 compare 함수의 스 니펫 일 것입니다. – Vlad