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

📄 camdetect.c

📁 arm9 Linux下基于摄像头的物体移动检测程序,可以用在门禁上,当有人经过时,自动通过基于video4linux的摄像头
💻 C
字号:
/****************************************************************************#	 CamDetect: Detect Object Moving using the spca5xx module.	    ##.                                                                          ## 		Copyright (C) 2008	BUrSelf		                    ##                                                                           ## This program is free software; you can redistribute it and/or modify      ## it under the terms of the GNU General Public License as published by      ## the Free Software Foundation; either version 2 of the License, or         ## (at your option) any later version.                                       ##                                                                           ## This program is distributed in the hope that it will be useful,           ## but WITHOUT ANY WARRANTY; without even the implied warranty of            ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             ## GNU General Public License for more details.                              ##                                                                           ## You should have received a copy of the GNU General Public License         ## along with this program; if not, write to the Free Software               ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA ##                                                                           #****************************************************************************/#include <stdio.h>#include <string.h>#include <sys/time.h>#include "spcaframe.h"#include "spcav4l.h"#include "xyssl/rsa.h"#include "xyssl/sha1.h"char rsa_N[]	= "807E3526556FADF8D4CA64074ADA36862646D5ECB24E363821306588722AF2B58058CFB88E8C0BEA5C7084F3055D232F110E59C8837A0D132A4B907E91DB4A49"				  "24134A85E7445935E55A772C0B72E12C94501D9DF66B71BA030F842531721AEF43AE48F9505BF7504CDEEA3CAA6F94530835648D770AE2E6C628DD484D10AA57";char rsa_E[]	= "010001";char rsa_D[]	= "56B3D2AD612D10993D0CAC5E7755B340E6071A46B3322F47C4AD6175A683F06E2482C8F761C88229CBE268F38B0503BEB8A59453C6D3CE8AC6196310E4DEB1CA"				  "939DF7F7EE26C4697EEDD1E5122795BFC83861DE2E3EC9E3E84F42B3A9DD25EB09B30FDDFFACCE5091493BC5577530CE9CD9C8BA244EC5FD3DF91BCECFD73961";char rsa_P[]	= "F8DAD6A5651CED9011D979A076D70C4FBD095AAE2E53EF51415832C63AD61618F0BB369F29D1363345FE481FE6C28F0830FE33A1C41F8743A4E02DD682A2E099";char rsa_Q[]	= "842EABF3171F972DE7D6B571B70F969F8F1C305851785BB042CDAE3B794014659A744EA7D16D881B7168463CEEAF52BA0F78755BBE89CFE1361076CE3E20886F";char rsa_DP[]	= "B1C694047FE1548CD1538D21E703E595A933DF86032E8F0E7B21E8D3D8004CB4F074ADA6B296F4A35863395F20D8E8992F76C9A7CC95C169BF852EF9C9455631";char rsa_DQ[]	= "143C54E49D289FEB4E2FC78D461A23D3FF83B03F0511E8EF7DFAA0EEC7EC3073318716B7884F3D63FE239985208144A7E950669F09F76D14AC432EFCF9F3DF0F";char rsa_QP[]	= "C2F98F412476BDA2B14F5882D929090C62BB24ED74E8B78A3BE287EABDB3FADC445D041F1DE04EBE2D39A8913DAF03C23FF632D1B3FB6CCBDD65B2A576F127F5";char videodevice[]   =   "/dev/video0";int  format          =  VIDEO_PALETTE_YUV420P;int  width           =	640;int  height          =	480;int  grabmethod      =  1;      //  1 = mmap    0   =   readint	 picNum;struct vdIn videoIn  =  {0};#define MY_BUFSIZE  (((640*480)*3)>>1)#define DETECT_INTERVAL 500#define SAMPLE_TIMES    10#define SKIP_FIRST_FEW  8#define RESAMPLE_TIMES  200#define CONTIUOUS_TIMES 8char fBuf[2][MY_BUFSIZE];int  curBuf;int  prevBuf;int	 hasInit;int  testTimesRemain;int  maxLevel;int	 skipStart;int  contTimes;  // Continuous picking timesint  pickTimes;struct timespec sleepTime;void grabCmp(void);void WritePic (unsigned char *src, int size);intmain (void){  int i,j;  if (init_videoIn(&videoIn, videodevice, width, height, format,grabmethod) != 0)             printf ("Can't Init Device!\n");    	hasInit			= 0;				// Identify that the prev frame is valid	testTimesRemain	= SAMPLE_TIMES;		//Sample Times	skipStart		= SKIP_FIRST_FEW;				//Skip First few frame	maxLevel		= 0;	contTimes		= 0;	pickTimes		= 0;	prevBuf			= 0;	curBuf			= 1;	picNum			= 0;	i = DETECT_INTERVAL/1000;	j = (DETECT_INTERVAL%1000) * 1000 * 1000; 	sleepTime.tv_sec  = i; 	sleepTime.tv_nsec = j;  	for(;;)	{		grabCmp(); 		nanosleep(&sleepTime,NULL);	}	return 0;}voidgrabCmp (void){    unsigned char *pictureData =NULL;    struct frame_t *headerframe;	int diff,tmpDiff;	int	i;		videoIn.vmmap.height	= videoIn.hdrheight;	videoIn.vmmap.width		= videoIn.hdrwidth;	videoIn.vmmap.format	= videoIn.formatIn;	if (ioctl (videoIn.fd, VIDIOCSYNC,&videoIn.vmmap.frame) < 0)		printf ("cvsync err\n");			memcpy(	fBuf[curBuf],			videoIn.pFramebuffer + videoIn.videombuf.offsets[videoIn.vmmap.frame],			MY_BUFSIZE);	// Copy Data Out	if ((ioctl (videoIn.fd, VIDIOCMCAPTURE, &(videoIn.vmmap))) < 0)		printf ("cmcapture");	videoIn.vmmap.frame = (videoIn.vmmap.frame + 1) % videoIn.videombuf.frames;					if(hasInit)		// Check if prev frame is valid	{		// Do some stuff in some special conditions		if(skipStart)		{			skipStart --;	// Skip First Few Frame			curBuf	=	(curBuf+1)%2;			prevBuf =	(prevBuf+1)%2;			return;		}		if(pickTimes >= RESAMPLE_TIMES)    {      pickTimes = 0;      testTimesRemain = SAMPLE_TIMES;      printf("Running Time Limit Reached,Resampling...\n");    }		// Now,We Began to compare		diff = 0;		for(i = 0;i<MY_BUFSIZE;i++)		{			tmpDiff = fBuf[curBuf][i] - fBuf[prevBuf][i];			if(tmpDiff > 0)				diff += tmpDiff;			else				diff -= tmpDiff;		}		if(testTimesRemain)		{			if(testTimesRemain == SAMPLE_TIMES)				printf("Now we begin to pick some samples.Please wait ...\n");							if(diff > maxLevel)				maxLevel = diff;			printf("Sample %d: %d\n",SAMPLE_TIMES - testTimesRemain + 1,diff);						if(testTimesRemain == 1)			{				maxLevel	*=	1.1;		//We mul a constant for fault-tolerance				printf("Sampling Done! Maximum Level: %d\n",maxLevel);			}						testTimesRemain--;		}		else		{			// We Print some debug infomation 			printf("Cur: %d Prev: %d Diff %d\n",curBuf,prevBuf,diff);			if(diff > maxLevel)			{				int jpegsize;							jpegsize =	convertframe(videoIn.ptframe[0]+ sizeof(struct frame_t),		 								 fBuf[curBuf],										 width,height,videoIn.formatIn,1024);					WritePic(videoIn.ptframe[0]+ sizeof(struct frame_t),jpegsize);								hasInit =	0;		    contTimes++;        if(contTimes >= CONTIUOUS_TIMES)        {          contTimes = 0;          testTimesRemain = SAMPLE_TIMES;          printf("Capture Too Frequently,ReSampling...\n");         }      }      else      {        contTimes = 0;      }		}	}	else	{		hasInit	= 1;	}  pickTimes++;	curBuf	=	(curBuf+1)%2;	prevBuf =	(prevBuf+1)%2;}voidWritePic (unsigned char *src, int size){	FILE *foutpict;	static char filename[40];	int i,ret;	time_t curdate;	struct tm *tdate;		rsa_context rsa;	unsigned char hash[20];	unsigned char rsabuf[512];		for ( i= 1024 ; i< size; i++)		if ((src[i] == 0xFF) && (src[i+1] == 0xD9))			break;	i+=10;	//Get Jpeg size		memset (filename, 0, sizeof (filename));	time (&curdate);	tdate = localtime (&curdate);	snprintf (filename, 40, "%02d:%02d:%04d-%02d:%02d:%02d-P%04d.jpg",	    tdate->tm_mon + 1, tdate->tm_mday, tdate->tm_year + 1900,	    tdate->tm_hour, tdate->tm_min, tdate->tm_sec, picNum++);  	foutpict = fopen(filename, "wb");	fwrite (src, sizeof (char), i, foutpict);	fclose (foutpict);	//Now We Create a Signature	sha1(src,i,hash);	rsa_init( &rsa, RSA_PKCS_V15, 0, NULL, NULL );    mpi_read_string( &rsa.N , 16, rsa_N );    mpi_read_string( &rsa.E , 16, rsa_E );    mpi_read_string( &rsa.D , 16, rsa_D );    mpi_read_string( &rsa.P , 16, rsa_P );    mpi_read_string( &rsa.Q , 16, rsa_Q );    mpi_read_string( &rsa.DP, 16, rsa_DP );    mpi_read_string( &rsa.DQ, 16, rsa_DQ );    mpi_read_string( &rsa.QP, 16, rsa_QP );	rsa.len = ( mpi_msb( &rsa.N ) + 7 ) >> 3;	if(rsa_pkcs1_sign(&rsa,RSA_PRIVATE,RSA_SHA1,20,hash,rsabuf) == 0)	{		memcpy(filename + strlen(filename),".sig",5);		foutpict = fopen(filename, "wb");	    for( i = 0; i < rsa.len; i++ )	        fprintf( foutpict, "%02X%s", rsabuf[i],	                 ( i + 1 ) % 16 == 0 ? "\r\n" : " " );		fclose (foutpict);    filename[strlen(filename)-4]  = 0;		printf ("Captured One Picture,Filename: %s\n", filename);	}	else    	printf ("Captured One Picture,but failed to generate a signature,Filename: %s\n", filename);}

⌨️ 快捷键说明

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