OpenCV Isolate силуэт из потока веб-камеры

Я пытаюсь изолировать силуэт человека от неизвестного видеопотока. (Веб-камера пользователей), используя C++/Cinder/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 ) );

Вывод: (Я слишком младший здесь, чтобы размещать изображения)

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

Я хотел бы, чтобы это был один силуэт, заполненный всем телом.

1

Решение

Вы могли бы использовать разъедать / расширяются после порога, который в целом удаляет шумы и растягивает белые области, но я предлагаю использовать BGSlibrary Я использовал его в прошлом вместе с openFrameworks, и это действительно большая коллекция различных алгоритмов для вычитания фона.

Также может помочь некоторая обработка изображений перед сегментацией, но это только теория.

0

Другие решения

Других решений пока нет …