Masking un blob de una imagen binaria

Estoy haciendo el reconocimiento de movimiento de caminar usando openCV y C ++ y me gustaría crear una máscara o una imagen copiada para lograr el efecto que se ve en la imagen provista. @. La siguiente es una explicación de las imágenes. Se ve la gota resultante de la marcha humana. Luego, se crea una imagen de máscara o una imagen copiada del marco original, el blob humano binario ahora se enmascara y los píxeles no enmascarados ahora se ponen a cero. El resultado es el cuerpo humano extraído con un fondo negro. El siguiente diagrama muestra cómo se extrae la masa humana y luego se enmascara. Esto se debe hacer para cada quinto cuadro de una secuencia de video. Mi código hasta ahora consiste en obtener cada quinto cuadro, escalarlo en gris, encontrar las áreas de todos los blobs y aplicar un valor umbral para obtener una imagen binaria donde más o menos, solo el blob humano es blanco y el resto de la imagen es negro. Ahora, estoy tratando de extraer el cuerpo humano pero no tengo idea de cómo proceder. Por favor, ayúdame

#include "cv.h"
#include "highgui.h"
#include "iostream"

using namespace std;
int main( int argc, char* argv ) {

CvCapture *capture = NULL;
capture = cvCaptureFromAVI("C:\\walking\\lady walking.avi");
if(!capture){
    return -1;
}

IplImage* color_frame = NULL;
IplImage* gray_frame = NULL ;

int thresh_frame = 28;
CvMoments moments;

int frameCount=0;//Counts every 5 frames
cvNamedWindow( "walking", CV_WINDOW_AUTOSIZE );

while(1) {
    color_frame = cvQueryFrame( capture );//Grabs the frame from a file
    if( !color_frame ) break;
    gray_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1);
    if( !color_frame ) break;// If the frame does not exist, quit the loop


    frameCount++;
    if(frameCount==5)
    {
        cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY);
        cvThreshold(gray_frame, gray_frame, thresh_frame, 255, CV_THRESH_BINARY);
        cvErode(gray_frame, gray_frame, NULL, 1);
        cvDilate(gray_frame, gray_frame, NULL, 1);

        cvMoments(gray_frame, &moments, 1);
        double m00;
        m00 = cvGetCentralMoment(&moments, 0,0);

        cvShowImage("walking", gray_frame);
        frameCount=0;
    }
    char c = cvWaitKey(33);
    if( c == 27 ) break;
}

double m00 = (double)cvGetCentralMoment(&moments, 0,0);
cout << "Area - : " << m00 << endl;
//area of lady walking = 39696. Therefore, using new threshold area as 30 for this video
//area of walking man = 67929

cvReleaseImage(&color_frame);
cvReleaseImage(&gray_frame);
cvReleaseCapture( &capture );
cvDestroyWindow( "walking" );

return 0;
}

También me gustaría subir el video que estoy usando en el código, pero no sé cómo subirlo aquí, así que si alguien me puede ayudar con eso también. Quiero proporcionar tanta información como sea posible w.r.t. mi pregunta

Respuestas a la pregunta(2)

Su respuesta a la pregunta