📄 motiondetect.c
字号:
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 + -