📄 alarmsystemview.cpp
字号:
if(isSend==SOCKET_ERROR)
MessageBox("send error");
else
MessageBox("send ok");
char chInBuffer[128];
int isRecv=recv(m_hClientSocket,(LPSTR)chInBuffer,128,0);
MessageBox(chInBuffer);
//声音合成输出
*/
} //end 亮度、颜色不满足火
RunningAvg();
//亮度颜色满足后,进行面积是否增大判断,这个判断也可以放在前面
/* area(pImageChafen,&areaChafen);
fprintf(log,"the area of the first object is:%d\r\n",areaChafen);
//环境变化,如果是着火了,目标面积会增大
IplImage* pFrame2=cvQueryFrame(pCapture);
cvCvtColor(pFrame2,pFrImg2,CV_BGR2GRAY);
cvAbsDiff(pBkImg,pFrImg2,pImgChafen2);
GetAim(pImgChafen2);
int areaChafen2=0;
area(pImgChafen2,&areaChafen2);
fprintf(log,"the area of the later object is:%d\r\n",areaChafen2);
*/
} //end else (环境变化)
}
else //nFrmNum<20
{
RunningAvg();
}//end曝光时间
} //end else (不是第一桢)
}//end while
} //end if (初始化成功)
/* ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
if( avg_bright>210.0 && (avg_color<30 || avg_color>200) )
{
// fprintf(log,"the avg bright is:%f\r\nthe avg color is:%f\r\n",avg_bright,avg_color);
// fprintf(log,"the object is bright and it's color is red or yellow!\r\n");
}
else
{
//进行人的识别
// fprintf(log,"the avg bright is:%f\r\nthe avg color is:%f\r\n",avg_bright,avg_color);
// fprintf(log,"there is something wrong!Maybe someone had intruded!\r\n");
cvSaveImage("C://image//now.bmp",pFrImg);
cvSaveImage("C://image//normal.bmp",pBkImg);
//socket通信,报警,发送彩信,可以传送参数以确定 彩信题目:着火、危险
cvCopy(pFrImg,pBkImg);
Sleep(1500);
continue; //可能有人入侵,进入下一轮循环,重新检测火灾是否发生
}
//亮度颜色满足后,进行面积是否增大判断
area(pImageChafen,&areaChafen);
// fprintf(log,"the area of the first object is:%d\r\n",areaChafen);
//环境变化,如果是着火了,目标面积会增大
IplImage* pFrame2=cvQueryFrame(pCapture);
cvCvtColor(pFrame2,pFrImg2,CV_BGR2GRAY);
cvAbsDiff(pBkImg,pFrImg2,pImgChafen2);
GetAim(pImgChafen2);
int areaChafen2=0;
area(pImgChafen2,&areaChafen2);
// fprintf(log,"the area of the later object is:%d\r\n",areaChafen2);
//判断面积是否增大
if((areaChafen2-areaChafen)<100)
{
//危险
// fprintf(log,"it's not a fire,but it's dangerous!\r\n");
cvSaveImage("C://image//now.bmp",pFrImg);
cvSaveImage("C://image//normal.bmp",pBkImg);
//socket通信,报警,发送彩信
cvCopy(pFrImg,pBkImg);
Sleep(1000);
continue; //没着火,但很危险。进入下一轮循环,重新检测火灾是否发生
}
else
{
// fprintf(log,"the area has extended!\r\n");
//面积增大,计算尖角数目
SharpAngle(&m_SharpAngleNum,AnglePointPosition);
if( m_SharpAngleNum>1 )
{
// fprintf(log,"the object's sharp angle num is:%d\r\n",m_SharpAngleNum);
AnglePointDisplay();
// fprintf(log,"there is a fire!\r\n");
cvSaveImage("C://image//now.bmp",pFrImg);
cvSaveImage("C://image//normal.bmp",pBkImg);
//socket通信,报警,发送彩信
cvCopy(pFrImg,pBkImg);
Sleep(1000);
continue; //着火了
}
else
{
if( m_SharpAngleNum>0 )
{
// fprintf(log,"the object's sharp angle num is:%d\r\n",m_SharpAngleNum);
AnglePointDisplay();
}
// fprintf(log,"it's dangerous!\r\n");
cvSaveImage("C://image//now.bmp",pFrImg);
cvSaveImage("C://image//normal.bmp",pBkImg);
//socket通信,报警,发送彩信,可以传送参数以确定 彩信题目:着火、危险
cvCopy(pFrImg,pBkImg);
Sleep(1000);
continue; //没着火,但很危险
}
}//end 面积增大
}//end 环境变化
*/
//如果有按键事件,则跳出循环
//此等待也为cvShowImage函数提供时间完成显示
//等待时间可以根据CPU速度调整
/* if( cvWaitKey(2) >= 0 )
break;
*/
/*
}//end else
}//end while
} //end if
*/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
BOOL CAlarmSystemView::InitAlarm()
{
pCapture=NULL;
pFrame=NULL;
pFrImg=NULL;
pBkImg=NULL;
HSV=NULL;
pFrImg_copy=NULL;
pFrame2=NULL;
pFrImg2=NULL;
pImgChafen2=NULL;
pFrameMat = NULL;
pFrMat = NULL;
pBkMat = NULL;
pChafenMat=NULL;
areaChafen=0;
avg_bright=0;
avg_color=0;
m_SharpAngleNum=0;
m_NumofFrame=0;//记录拍摄的图片数,并以它来命名所拍摄的图片
CreateDirectory("E://image",NULL);//创建image文件夹,保存图片全部放到此文件夹中
log=fopen("E://image//record.txt","w");
cvNamedWindow("video",1);
cvNamedWindow("front",1);
cvNamedWindow("back",1);
if(!(pCapture=cvCaptureFromCAM(-1)))
{
MessageBox("摄像头捕捉失败!");
return FALSE;
}
/* else if(connection()==FALSE)
return FALSE;
*/
return TRUE;
}
void CAlarmSystemView::OnExit()
{
cvDestroyWindow("video");
cvDestroyWindow("front");
cvDestroyWindow("back");
cvDestroyWindow("Erzhi");
cvReleaseImage(&pFrImg);
cvReleaseImage(&pBkImg);
cvReleaseImage(&HSV);
cvReleaseImage(&pFrImg_copy);
cvReleaseImage(&pFrImg2);
cvReleaseImage(&pImgChafen2);
cvReleaseMat(&pFrameMat);
cvReleaseMat(&pFrMat);
cvReleaseMat(&pBkMat);
cvReleaseMat(&pChafenMat);
cvReleaseCapture(&pCapture);
// cvReleaseImage(&pFrame);
// cvReleaseMat(&pFrameMat);
// CloseDeviceDriver(&m_hDeviceDriver);
// free(m_hDeviceDriver);
// fclose(log);
}
void CAlarmSystemView::GetAim(IplImage *pImage)
{
//求出目标区域,以计算目标亮度,并减少计算量
pimageData=(uchar *)pImage->imageData;
int i,j;
top=0;
left=WIDTH;
bottom=0;
right=0;
//赋初值
for(i=0;i<HEIGHT;i++)
{
int a=0;
for(j=0;j<WIDTH;j++)
{
if(*(pimageData+i*WIDTH+j)==0)
{
top=i;
bottom=i;
left=j;
right=j;
a=1;
break;
}
}
if(a==1)
break;
}
//求边界点
for(i=0;i<HEIGHT;i++)
for(j=0;j<WIDTH;j++)
{
if(*(pimageData+i*WIDTH+j)==0)
{
if(j>right)
right=j;
if(j<left)
left=j;
bottom=i;
}
}
pimageData=NULL;
delete pimageData;
/*
CString a;
a.Format("%d,%d,%d,%d",top,left,bottom,right);
MessageBox(a);
//将目标区域画出来
for(i=top;i<bottom;i++)
*(pimageData1+i*width+left)=0;
for(j=left;j<right;j++)
*(pimageData1+top*width+j)=0;
for(i=top;i<bottom;i++)
*(pimageData1+i*width+right)=0;
for(j=left;j<right;j++)
*(pimageData1+bottom*width+j)=0;
// cvShowImage("image_Erzhi1",pImageErzhi1);
// cvShowImage("image_Erzhi2",pImageErzhi2);
*/
}
int CAlarmSystemView::otsu(unsigned char *image, int rows, int cols, int x0, int y0, int dx, int dy, int vvv)
{
unsigned char *np; // 图像指针
int thresholdValue=1; // 阈值
int ihist[256]; // 图像直方图,256个点
int i, j, k; // various counters
int n, n1, n2, gmin, gmax;
double m1, m2, sum, csum, fmax, sb;
// 对直方图置零...
memset(ihist, 0, sizeof(ihist));
gmin=255; gmax=0;
// 生成直方图
for (i = y0 + 1; i < y0 + dy - 1; i++)
{
np = &image[i*cols+x0+1];
for (j = x0 + 1; j < x0 + dx - 1; j++)
{
ihist[*np]++;
if(*np > gmax) gmax=*np;
if(*np < gmin) gmin=*np;
np++; /* next pixel */
}
}
// set up everything
sum = csum = 0.0;
n = 0;
for (k = 0; k <= 255; k++)
{
sum += (double) k * (double) ihist[k]; /* x*f(x) 质量矩*/
n += ihist[k]; /* f(x) 质量 */
}
if (!n)
{
// if n has no value, there is problems...
fprintf (stderr, "NOT NORMAL thresholdValue = 160\n");
return (160);
}
// do the otsu global thresholding method
fmax = -1.0;
n1 = 0;
for (k = 0; k < 255; k++)
{
n1 += ihist[k];
if (!n1)
{
continue;
}
n2 = n - n1;
if (n2 == 0)
{
break;
}
csum += (double) k *ihist[k];
m1 = csum / n1;
m2 = (sum - csum) / n2;
sb = (double) n1 *(double) n2 *(m1 - m2) * (m1 - m2);
/* bbg: note: can be optimized. */
if (sb > fmax)
{
fmax = sb;
thresholdValue = k;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -