알 수없는 비디오 스트림에서 사람의 실루엣을 격리하려고합니다. (사용자 웹캠), 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
나는이 될 하나의 전체 몸 작성 실루엣 싶습니다.
나는 비슷한 것을 시도하고 있는데, 바운딩 컨투어를 작성하고, 모든 얼룩 중에서 채울 수있는 가정이 현재는 boundingRect() 메소드 밖에 없다. 이 링크 http://stackoverflow.com/questions/8973017/opencv-c-obj-c-connect-nearby-contours 윤곽을 결합하는 몇 가지 방법을 제공 할 수도 있습니다. 그것의 유일한 이론은 아직 시도하지 않았습니다. – Emile