【OpenCV】5th-识别背景和前景

来源:互联网 发布:it软件测试 编辑:程序博客网 时间:2024/05/16 01:40

打开前置摄像头或本地视频,识别背景和前景

#include <stdio.h>  #include <cv.h>  #include <cxcore.h>  #include <highgui.h>  #include <opencv2\core\core.hpp>#include <opencv2\highgui\highgui.hpp>#include <opencv2\opencv.hpp>using namespace cv;//命名空间int main(int argc, char** argv){    //声明IplImage指针      IplImage* pFrame = NULL;    IplImage* pFrImg = NULL;    IplImage* pBkImg = NULL;    CvMat* pFrameMat = NULL;    CvMat* pFrMat = NULL;    CvMat* pBkMat = NULL;    CvCapture* pCapture = NULL;    int nFrmNum = 0;    //创建窗口       cvNamedWindow("video", 1);    cvNamedWindow("background", 1);    cvNamedWindow("foreground", 1);    //使窗口有序排列      cvMoveWindow("video", 300, 200);    cvMoveWindow("background", 10, 0);    cvMoveWindow("foreground", 600, 100);    //cvResizeWindow("video", 300, 300);    argc = 1;    if (argc > 2)    {        fprintf(stderr, "Usage: bkgrd [video_file_name]\n");        return -1;    }    //打开摄像头      if (argc == 1)        CvCapture* pCapture = cvCaptureFromCAM(0);   //获取摄像头    if (!(pCapture = cvCaptureFromCAM(0)))    {        fprintf(stderr, "Can not open camera.\n");        return -2;    }    //打开视频文件      if (argc == 2)        if (!(pCapture = cvCaptureFromFile(argv[1])))        {            fprintf(stderr, "Can not open video file %s\n", argv[1]);            return -2;        }    //逐帧读取视频      while (pFrame = cvQueryFrame(pCapture))    {        nFrmNum++;        //如果是第一帧,需要申请内存,并初始化          if (nFrmNum == 1)        {            pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1);            pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1);            pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);            pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);            pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);            //转化成单通道图像再处理              cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);            cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);            cvConvert(pFrImg, pFrameMat);            cvConvert(pFrImg, pFrMat);            cvConvert(pFrImg, pBkMat);        }        else        {            cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);            cvConvert(pFrImg, pFrameMat);            //先高斯滤波,以平滑图像              //cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0);              //当前帧跟背景图相减              cvAbsDiff(pFrameMat, pBkMat, pFrMat);            //二值化前景图              cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);            //进行形态学滤波,去掉噪音               //cvErode(pFrImg, pFrImg, 0, 1);              //cvDilate(pFrImg, pFrImg, 0, 1);              //更新背景              cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);            //将背景转化为图像格式,用以显示              cvConvert(pBkMat, pBkImg);            //显示图像              cvShowImage("video", pFrame);            cvShowImage("background", pBkImg);            cvShowImage("foreground", pFrImg);            //如果有按键事件,则跳出循环              //此等待也为cvShowImage函数提供时间完成显示               //等待时间可以根据CPU速度调整              if (cvWaitKey(2) >= 0)                break;        }    }    //销毁窗口      cvDestroyWindow("video");    cvDestroyWindow("background");    cvDestroyWindow("foreground");    //释放图像和矩阵      cvReleaseImage(&pFrImg);    cvReleaseImage(&pBkImg);    cvReleaseMat(&pFrameMat);    cvReleaseMat(&pFrMat);    cvReleaseMat(&pBkMat);    cvReleaseCapture(&pCapture);    return 0;}

【问题】:打开摄像头时选择播放源且闪退
【解决】:单步调试
错误代码:
//打开摄像头
if (argc == 1)
if (!(pCapture = cvCaptureFromCAM(-1)))
{
fprintf(stderr, "Can not open camera.\n");
return -2;
}

正确代码:

if (argc == 1)    CvCapture* pCapture = cvCaptureFromCAM(0);   //获取摄像头if (!(pCapture = cvCaptureFromCAM(0))){    fprintf(stderr, "Can not open camera.\n");    return -2;}

注意CvCapture* pCapture = cvCaptureFromCAM(0);

CvCapture*cvCaptureFromCAM( int index );
index:要使用的摄像头索引。如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。
一般index=0


CvCreateImage函数说明
OPENCV 函数cvCreateMat
cvCvtColor的用法
各函数用法


opencv运动视频跟踪

关于Kinect彩色图像和深度图像,通过单步运行(Fn+F10),监视变量,可知参数放在哪个变量中。

0 0
原创粉丝点击