2012-12-06 8 views
1

알 수없는 비디오 스트림에서 사람의 실루엣을 격리하려고합니다. (사용자 웹캠), C++/Cinder/OpenCV을 사용합니다. 나는 지금까지 윤곽을 그리기 &을 식별 등이있어,하지만 난 사용하고 모든 사람의 윤곽, 단지 요소 (머리, 눈, 등)OpenCV 웹캠 스트림에서 실루엣을 분리합니다.

을받지 못했습니다 : BackgroundSubtractorMOG2를 배경을 제거하기 위해 . 잡음을 제거하려면 흐리게 만듭니다. 적응 임계 값. & 찾기 특정 복잡성을 통해 윤곽을 그립니다.

코드 :

Surface surface; 
surface = mCapture.getSurface(); 

// To texture for display 
textureCapture = Texture(surface); 

    // Greyscale 
    Mat matGrey(toOcv(surface)); 

    // Output 
    Mat matForeground, matBackground; 

    // Build foreground & background 
    mog(matGrey, matForeground, -1); 
    mog.getBackgroundImage(matBackground); 

// Build countours 
Mat matContourTemp = matForeground.clone(); 

    // Blur to remove noise 
    Mat matBlurred = matContourTemp.clone(); 
    cv::GaussianBlur(matContourTemp, matBlurred, cv::Size(9, 9), 0); 

    textureBlurred = Texture(fromOcv(matBlurred)); 

    // Adaptive threshold 
    Mat matThresh = matContourTemp.clone(); 
    adaptiveThreshold(matBlurred, matThresh, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 0); 

    textureThreshold = Texture(fromOcv(matThresh)); 

    // Contours 
    vector<cv::Vec4i> hierarchy; 

     // Find 
     contours.clear(); 
     findContours(matThresh, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0)); 

     // Draw contours 
     Mat matContourImage(matForeground.size(), CV_8UC3, cv::Scalar(0, 0, 0)); 

     Scalar colors[ 3 ]; 
     colors[ 0 ] = Scalar(255, 255, 255); 

     for(size_t idx = 0; idx < contours.size(); idx++){ 

      if(contours[ idx ].size() > 40){ 

       cv::drawContours(
         matContourImage, contours, idx, 
         colors[ 0 ], -3, 
         100, 
         hierarchy, 
         0, 
         cv::Point(0, 0)); 
       }; 
    }; 
    textureContour = Texture(fromOcv(matContourImage)); 

출력 (I 이미지를 게시하려면 여기 너무 주니어 해요)은

http://barnabysheeran.com/outgoing/stackoverflow/ss_1.png http://barnabysheeran.com/outgoing/stackoverflow/ss_2.png

나는이 될 하나의 전체 몸 작성 실루엣 싶습니다.

+0

나는 비슷한 것을 시도하고 있는데, 바운딩 컨투어를 작성하고, 모든 얼룩 중에서 채울 수있는 가정이 현재는 boundingRect() 메소드 밖에 없다. 이 링크 http://stackoverflow.com/questions/8973017/opencv-c-obj-c-connect-nearby-contours 윤곽을 결합하는 몇 가지 방법을 제공 할 수도 있습니다. 그것의 유일한 이론은 아직 시도하지 않았습니다. – Emile

답변

0

일반적으로 노이즈를 제거하고 흰색 영역을 확장하는 임계 값 적용 후 erode/dilate을 사용할 수 있습니다. 그러나 BGSlibrary을 사용하는 것이 좋습니다. 이전에 openFrameworks와 함께 사용했으며, 배경을 빼는 알고리즘이 정말 좋습니다.

또한 분할 전에 일부 이미지 처리가 약간 도움이 될 수 있지만 이는 단지 이론 일뿐입니다.