⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motiondetect.c

📁 本程序是基于VC++和opencv开发的视频入侵检测预警程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			  cvReleaseImage( &Bimg);
			  Bimg=cvCreateImage(cvSize(r.width,r.height),IPL_DEPTH_8U,1);                                              //新建一个图像并分配内存
			  cvZero(Bimg);
              
			  //cvCopy(img,dst_img1,0);
			  for(j=r.x;j<r.x+r.width;j++)
				  for(i=r.y;i<r.y+r.height;i++)
				  {
                    CvScalar Rimg;
					CvScalar s3,s4;
                    s3.val[0]=1;s4.val[0]=0;
					//if(j>=356) 
					//{ printf("array out of range\n");
					  //printf("%d\n",i);
					//}
					Rimg=cvGet2D(img,i,j);
					//printf("%f,%f,%f\n",Rimg.val[0],Rimg.val[1],Rimg.val[2]);
                    Y=0.299*Rimg.val[0]+0.587*Rimg.val[1]+0.114*Rimg.val[2];
			        //Cr=(Rimg.val[0]-Y)*0.713+128;
			        //Cb=(Rimg.val[2]-Y)*0.564+128;
                    if(Y>=130)
						objArea=objArea+1;
                    }
			         ratio1=objArea/(r.width*r.height);//面积比
                     ratio2=r.width/r.height;//长宽比
				  
		if(r.height * r.width > CONTOUR_MAX_AERA) // 面积小的方形抛弃掉
              {
				  if (Sf[0]>Sb&&Sf[1]>Sb&&Sf[2]>Sb&&Sf[3]>Sb)//&&Sp[0]>St&&Sp[1]>St&&Sp[2]>St&&Sp[3]>St)                                                              //当人不在危险区域时,区域边框显示为绿色
				  {
                      cvRectangle( img, cvPoint(r.x,r.y), 
                          cvPoint(r.x + r.width, r.y + r.height),
                          CV_RGB(0,255,0), 1, CV_AA,0);
					  cvLine(img,cvPoint(danger_x[0],danger_y[0]),
		                   cvPoint(danger_x[1],danger_y[1]),
		                   CV_RGB(0,255,0), 1, CV_AA,0);
                      cvLine(img,cvPoint(danger_x[1],danger_y[1]),
		                   cvPoint(danger_x[2],danger_y[2]),
		                   CV_RGB(0,255,0), 1, CV_AA,0);
	                  cvLine(img,cvPoint(danger_x[0],danger_y[0]),
		                 cvPoint(danger_x[3],danger_y[3]),
		                 CV_RGB(0,255,0), 1, CV_AA,0);
                     cvLine(img,cvPoint(danger_x[3],danger_y[3]),
		                 cvPoint(danger_x[2],danger_y[2]),
		                 CV_RGB(0,255,0), 1, CV_AA,0);
					 }
				  else                                                    
				  {   
					  if(ratio1>=0.3&&ratio2>=0.59)                                                        //当人进入危险区域时,区域边框显示为红色,并提示警告语
					  {
                        cvRectangle( img, cvPoint(r.x,r.y), 
                          cvPoint(r.x + r.width, r.y + r.height),
                          CV_RGB(0,255,0), 1, CV_AA,0);
                     cvLine(img,cvPoint(danger_x[0],danger_y[0]),
		                 cvPoint(danger_x[1],danger_y[1]),
		                  CV_RGB(255,0,0), 1, CV_AA,0);
                      cvLine(img,cvPoint(danger_x[1],danger_y[1]),
		                cvPoint(danger_x[2],danger_y[2]),
		                CV_RGB(255,0,0), 1, CV_AA,0);
	                 cvLine(img,cvPoint(danger_x[0],danger_y[0]),
		                cvPoint(danger_x[3],danger_y[3]),
		                CV_RGB(255,0,0), 1, CV_AA,0);
                     cvLine(img,cvPoint(danger_x[3],danger_y[3]),
		                      cvPoint(danger_x[2],danger_y[2]),
		             CV_RGB(255,0,0), 1, CV_AA,0);
					 //在窗口中显示预警提示语
					 cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.5,1,0,1,8);
					 cvPutText(img,"Danger! No Entering",cvPoint(10,150),&font,CV_RGB(255,0,0));
					 sprintf(strTmp, "SaveImage_%d.jpg", nFrmnum); //修改保存的图片名
                     strcat(strSaveImagename,strTmp);//图片名添加到图片保存目录名后
                     cvSaveImage(strSaveImagename,img);
					 nFrmnum=nFrmnum+1;
					  }
					  else
					  {
						  cvRectangle( img, cvPoint(r.x,r.y), 
                          cvPoint(r.x + r.width, r.y + r.height),
                          CV_RGB(0,255,0), 1, CV_AA,0);
					  cvLine(img,cvPoint(danger_x[0],danger_y[0]),
		                   cvPoint(danger_x[1],danger_y[1]),
		                   CV_RGB(0,255,0), 1, CV_AA,0);
                      cvLine(img,cvPoint(danger_x[1],danger_y[1]),
		                   cvPoint(danger_x[2],danger_y[2]),
		                   CV_RGB(0,255,0), 1, CV_AA,0);
	                  cvLine(img,cvPoint(danger_x[0],danger_y[0]),
		                 cvPoint(danger_x[3],danger_y[3]),
		                 CV_RGB(0,255,0), 1, CV_AA,0);
                     cvLine(img,cvPoint(danger_x[3],danger_y[3]),
		                 cvPoint(danger_x[2],danger_y[2]),
		                 CV_RGB(0,255,0), 1, CV_AA,0);
					  }
					 /* else                                                                 
					  {

					  cvRectangle( img, cvPoint(r.x,r.y), 
                          cvPoint(r.x + r.width, r.y + r.height),
                          CV_RGB(0,255,0), 1, CV_AA,0);
                     cvLine(img,cvPoint(danger_x[0],danger_y[0]),
		                 cvPoint(danger_x[1],danger_y[1]),
		                  CV_RGB(255,0,0), 1, CV_AA,0);
                      cvLine(img,cvPoint(danger_x[1],danger_y[1]),
		                cvPoint(danger_x[2],danger_y[2]),
		                CV_RGB(255,0,0), 1, CV_AA,0);
	                 cvLine(img,cvPoint(danger_x[0],danger_y[0]),
		                cvPoint(danger_x[3],danger_y[3]),
		                CV_RGB(255,0,0), 1, CV_AA,0);
                     cvLine(img,cvPoint(danger_x[3],danger_y[3]),
		                      cvPoint(danger_x[2],danger_y[2]),
		             CV_RGB(255,0,0), 1, CV_AA,0);
					 //在窗口中显示预警提示语
					 cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.5,1,0,1,8);
					 cvPutText(img,"Danger! No Entering",cvPoint(10,150),&font,CV_RGB(255,0,0));
					  }*/

					}

              }
    }
    cvReleaseMemStorage(&stor);
    cvReleaseImage( &pyr );
}
//计算三角型面积的函数
double TrianglArea( int x1,int y1,int x2, int y2, int x3,int y3)
{
	double a,b,c,s,T_area;
	a=sqrt((double)(pow((double)(x2-x1),2)+pow((double)(y2-y1),2)));
	b=sqrt((double)(pow((double)(x3-x2),2)+pow((double)(y3-y2),2)));
	c=sqrt((double)(pow((double)(x3-x1),2)+pow((double)(y3-y1),2)));
	if((a+b>c)&&(a+c>b)&&(b+c>a)) 
	{
		s=(a+b+c)/2; 
        T_area=sqrt(s*(s-a)*(s-b)*(s-c)); 
	}
	else
		//不能构成三角形
		 T_area=0.;
	return T_area;
}
//计算四边形的面积
double SquArea(int x1,int y1,int x2, int y2, int x3,int y3,int x4,int y4)
{
	double T_area1,T_area2,S_area;
	T_area1=TrianglArea(  x1,y1,x2,y2, x3,y3);
	T_area2=TrianglArea( x1,y1,x4,y4, x3,y3);
	S_area=T_area1+T_area2;
	return S_area;
}
int main()
{
    IplImage* motion = 0; 
    CvCapture* capture = 0;
    capture = cvCaptureFromAVI("videolongxvid.avi");
    if(!capture)
    {
	fprintf(stderr,"打开视频文件错误%s\n");
	return -2;
    }  
    if( capture )
    {
        cvNamedWindow( "Motion", 1 );
        for(;;)
        {
            IplImage* image;
            if( !cvGrabFrame( capture ))
                break;
            image = cvRetrieveFrame( capture );
            if( image )
            {
                if( !motion )
                {
                    motion = cvCreateImage( cvSize(image->width,image->height), 8, 1 );
                    cvZero( motion );
                    motion->origin = image->origin;
                }
            }

            update_mhi( image, motion, 60 );
            cvShowImage( "Motion", image );
            
            if( cvWaitKey(10) >= 0 )
                break;
        }
        cvReleaseCapture( &capture );
        cvDestroyWindow( "Motion" );
    }
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -