首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

怎么实现运动对象的计数

2013-03-01 
如何实现运动对象的计数目前在使用opencv对视频中运动人体进行识别、提取。目前实现了单一人体的识别与检测,

如何实现运动对象的计数
  目前在使用opencv对视频中运动人体进行识别、提取。目前实现了单一人体的识别与检测,现在需要对视频中的人进行计数。主要的应用场景是:对一个一个或长或短的视频进行处理,在每一帧中只有单一的人在运动,但是不同时刻运动的人不一样,需要对人进行编号存储。
   请教如何对运动的人体进行计数,并且不存储没有人在镜头里的帧
以下是目前以实现的代码,请高人指点如何实现运动对象的计数功能,并仅存储包含对象的帧

int main(int argc, const char** argv)
{  
VideoCapture cap;
    bool update_bg_model = true;
void writefile(Mat,int);

cap.open(argv[1]);
    if( !cap.isOpened() )
    {
        printf("can not open camera or video file\n");
        return -1;
    }

    BackgroundSubtractorMOG2 bg_model;
    Mat img, fgmask, fgimg;

int i=0;

    for(;;)
    {
        cap >> img;
        if( img.empty() )
            break;
        
        if( fgimg.empty() )
          fgimg.create(img.size(), img.type());

        //update the model
        bg_model(img, fgmask, update_bg_model ? -1 : 0);

        fgimg = Scalar::all(0);
        img.copyTo(fgimg, fgmask);

        Mat bgimg;
        bg_model.getBackgroundImage(bgimg);

imshow( "image", img );
imshow("single",fgmask);
imshow("color",fgimg);
imshow("background image",bgimg);

writefile(fgimg,i);
writefile(fgmask,i);
i++;
        
char k = (char)waitKey(30);
        if( k == 27 ) break;
        if( k == ' ' )
        {
            update_bg_model = !update_bg_model;
            if(update_bg_model)
            printf("Background update is on\n");
            else
            printf("Background update is off\n");
        }
    }

    return 0;
}

void writefile(Mat img,int num)
{
string filename;
stringstream stream;
stream<<num;

if (img.channels()==1)
{
filename = "single_pipe"+stream.str()+".jpg";
filename = "E:\\opencv\\软件所需\\对象提取与存储\\single_pipe\"+filename;
imwrite(filename,img);
}
else
{
filename = "color_pipe"+stream.str()+".jpg";
filename = "E:\\opencv\\软件所需\\对象提取与存储\\color_pipe\"+filename;
imwrite(filename,img);
}




}


[解决办法]
如果每个人都只出现一次,只要计算出两人出现之间的静态画面,就可以标记了。如果一个人可能多次出现,就在前面标记过的结果中进行匹配计算
静态画面用前后图像相减就可以得到。
再用静态画面减去有人的图像,就可以得到人所在的区域。便于你的匹配计算。
[解决办法]
试试OpenCV的blob track,直接有计数功能,也有例程。
http://blog.csdn.net/fengbingchun/article/details/7872325

热点排行