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

📄 alarmsystemview.cpp

📁 关于只能报警系统的程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                        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 + -