我正在使用openCV和C ++进行行走动作识别,我想创建一个蒙版或复制图像,以达到所提供图片中所见的效果。 。以下是对图像的解释
可以看到人行走的斑点。然后,创建原始帧的掩模图像或复制图像,现在掩蔽二进制人体斑点,并且现在将非掩蔽像素设置为零。结果是提取的人体具有黑色背景。下图显示了如何提取人体斑点然后进行屏蔽。
这将针对视频序列的每第5帧进行。到目前为止,我的代码包括获取每个第5帧,灰度化它,找到所有斑点的区域,并应用阈值来获得或多或少的二进制图像,只有人类斑点是白色的,而图像的其余部分是黑色。现在,我正在尝试提取人体,但我不知道如何继续。请帮帮我。
#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;
}
我还想上传我在代码中使用的视频,但我不知道如何在此处上传,所以如果有人也可以帮我解决这个问题。我想提供尽可能多的信息w.r.t.我的问题。
答案 0 :(得分:1)
最简单的方法是寻找图像中最大的斑点(cvfind轮廓可以是你需要的功能),然后你设置为blac所有其他blob(扫描所有轮廓并使用cvfloadfill)。 最后你扫描整个二进制图像如果所考虑的像素是白色你什么都不做,如果像素是黑色你设置为黑色第5帧的相应像素