OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 2500|回复: 1

我在做运动目标检测,程序可以运行,就是看不到结果,求

[复制链接]
发表于 2012-4-8 22:16:28 | 显示全部楼层 |阅读模式
视频中的运动目标检测不到,求大神指导一下,是哪个地方出错了,程序编译正常

#include <iostream.h>
#include <math.h>
#include <stdio.h>

#include &quot;cv.h&quot;
#include &quot;cxcore.h&quot;
#include &quot;highgui.h&quot;

int main(int argc,char* argv[])
{
        cvNamedWindow(&quot;RealTraking&quot;,0);

        IplImage* FirstImage=NULL;//作为背景
        IplImage* SecondImage=NULL;//作为前景
        IplImage* pFrame = NULL;//全景图像获取
        IplImage* TempImage=NULL;//临时存储图像

        CvMat* FirstMat=NULL;
        CvMat* SecondMat=NULL;
        CvMat* TempMat=NULL;
        //CvMat* pFrameMat=NULL;
       
        CvPoint RECT1;
        CvPoint RECT2;
        CvPoint RECT3;
        CvPoint RECT4;
        CvPoint RECT5;
        CvPoint RECT6;
        CvRect AndRect=cvRect(0,0,0,0);//目标的外接矩形
       
        CvMemStorage *storage=cvCreateMemStorage(0);
        CvSeq * contour = 0;

        int XDiff=0;
        int YDiff=0;
        int middle_x=0;
        int middle_y=0;

        CvCapture* pCapture = NULL;//摄像头图像/视频获取
        int FrameNumber=0;

        if( argc > 2 )
        {
                fprintf(stderr, &quot;Usage: bkgrd [video_file_name]\n&quot;);
                return -1;
        }
  
        //打开摄像头
        /*if(argc ==1)
                if( !(pCapture = cvCaptureFromCAM(-1)))
                {
                        fprintf(stderr, &quot;Can not open camera.\n&quot;);
                        return -2;
                }
  */
   //打开视频文件
        if(argc == 2)
                if( !(pCapture=cvCaptureFromFile(argv[1])))
                {
                        fprintf(stderr, &quot;Can not open video file %s\n&quot;, argv[1]);
                        return -2;       
                }
        //逐帧读取视频
        while(pFrame = cvQueryFrame( pCapture ))
        {
                FrameNumber++;
  
                //如果是第一帧,需要申请内存,并初始化
                if(FrameNumber == 1)
                {
                        FirstImage = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);//创建背景图像
                        SecondImage = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);//创建前景图像
                        TempImage = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);

                        FirstMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);//创建背景数据矩阵
                        SecondMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);//创建前景矩阵
                        TempMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);//临时存储矩阵
                        //pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);//当前帧存储空间

                        //转化成单通道图像再处理
                        cvCvtColor(pFrame, FirstImage, CV_BGR2GRAY);//第一帧作为背景图像,并将颜色转化为灰度
                        cvCvtColor(pFrame, SecondImage, CV_BGR2GRAY);//第一帧作为前景图像,并将颜色转化为灰度
                        cvCvtColor(pFrame,TempImage,CV_RGB2GRAY);

                        //cvConvert(FirstImage, pFrameMat);//图像转化为数据矩阵
                        cvConvert(FirstImage, FirstMat);//
                        cvConvert(SecondImage, SecondMat);//
                        cvConvert(TempImage,TempMat);//
                }
                else//(FrameNumber>=2)
                {
                        cvCvtColor(pFrame, SecondImage, CV_BGR2GRAY);//帧的图片内容转化为灰度图像并存到SecondImage.
                        cvConvert(SecondImage, SecondMat);//当前帧内容转化为矩阵数据
                        //高斯滤波先,以平滑图像
                        cvSmooth(SecondMat, SecondMat, CV_GAUSSIAN, 3, 0, 0);

                        //当前帧跟背景图相减
                        cvAbsDiff(SecondMat, FirstMat, TempMat);
                        //cvConvert(TempMat,TempImage);

                        //二值化前景图
                        cvThreshold(TempMat, TempImage, 150, 255.0, CV_THRESH_BINARY);
                       
                        //图像形态学处理---腐蚀与膨胀
                        //cvErode(TempImage,TempImage,0,1);
                        //cvDilate(TempImage,TempImage,0,1);

                        //提取前景边缘\轮廓
                        int count=cvFindContours(TempImage,storage,&contour,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
                        if(count!=0)
                        {
                                AndRect=cvBoundingRect(contour);
                                RECT1.x=AndRect.x;
                                RECT1.y=AndRect.y;
                                RECT2.x=AndRect.x+AndRect.width;
                                RECT2.y=AndRect.y+AndRect.height;
                                cvRectangle(pFrame, RECT1, RECT2, CV_RGB(255,0,0),1,8,0 );
                                middle_x =(int)(RECT1.x+AndRect.width)/2;
                                middle_y =(int)(RECT1.y+AndRect.height)/2;
                                /*RECT3.x=middle_x+15;
                                RECT3.y=middle_y;
                                RECT4.x=middle_x-15;
                                RECT4.y=middle_y;
                                cvLine(pFrame,RECT3,RECT4,CV_RGB(255,0,0),1,8);
                                RECT5.x=middle_x;
                                RECT5.y=middle_y+15;
                                RECT6.x=middle_x;
                                RECT6.y=middle_y-15;
                                cvLine(pFrame,RECT5,RECT6,CV_RGB(255,0,0),1,8);
                                */
                                XDiff=(int)(pFrame->width/2-middle_x);
                                YDiff=(int)(pFrame->height/2-middle_y);
                                cout<<&quot;XDiff:&quot;<<XDiff<<'\n';
                                cout<<&quot;YDIff:&quot;<<YDiff<<'\n';
                        }
/*                        else//目标静止则与前一帧作相同处理
                        {
                                cvRectangle(pFrame, RECT1, RECT2, CV_RGB(255,0,0),1,8,0 );
                                cvLine(pFrame,RECT3,RECT4,CV_RGB(255,0,0),1,8);
                                cvLine(pFrame,RECT5,RECT6,CV_RGB(255,0,0),1,8);
                                cout<<&quot;XDiff:&quot;<<XDiff<<'\n';
                                cout<<&quot;YDIff:&quot;<<YDiff<<'\n';                               
                        }
*/
                        //更新背景
                        cvRunningAvg(SecondMat, FirstMat, 0, 0);

                        //将背景转化为图像格式,用以显示
                        //cvConvert(FirstMat, FirstImage);

                        //显示图像
                        cvShowImage(&quot;RealTracking&quot;, pFrame);

                        //如果有按键事件,则跳出循环
                        //此等待也为cvShowImage函数提供时间完成显示
                        //等待时间可以根据CPU速度调整
                        if( cvWaitKey(0) >= 0 )
                        break;
                }
  
        }
        //销毁窗口
        cvDestroyWindow(&quot;RealTracking&quot;);
  
        //释放图像和矩阵
        cvReleaseImage(&FirstImage);
        cvReleaseImage(&SecondImage);
        cvReleaseImage(&TempImage);
  
        //cvReleaseMat(&pFrameMat);
        cvReleaseMat(&FirstMat);
        cvReleaseMat(&SecondMat);
        cvReleaseMat(&TempMat);
       
        cvReleaseMemStorage(&storage);
        //cvClearSeq(contour);
        cvReleaseCapture(&pCapture);
  
        return 0;
}
回复

使用道具 举报

发表于 2018-3-31 15:50:23 | 显示全部楼层
问题解决没,程序调出来没?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-5-29 05:20 , Processed in 0.009474 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表