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

📄 capture.c

📁 OV511摄像头在Linux中的简单应用
💻 C
字号:
    #include"capture.h" pthread_mutex_t fd_lock=PTHREAD_MUTEX_INITIALIZER;int v4lgetcapability(v4ldevice *vd){	if(ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)) < 0) {		perror("v4lopen:VIDIOCGCAP");		return -1;	}	return 0;}int v4lopen(char *name, v4ldevice *vd){	if((vd->fd = open(name,O_RDWR)) < 0) {		perror("open ,error");		return -1;	}	if(v4lgetcapability(vd))		return -1;	return 0;}int v4lgetmbuf(v4ldevice *vd){	if(ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf))<0) {		perror("v4lgetmbuf:VIDIOCGMBUF");		return -1;	}	return 0;}unsigned char* v4lgetaddress(v4ldevice *vd){	unsigned char add[1];	//add=vd->map + vd->mbuf.offsets[vd->frame];	return add;ַ}int v4lgrabinit(v4ldevice *vd, int width, int height){	vd->mmap.width = width;	vd->mmap.height = height;	vd->mmap.format =VIDEO_PALETTE_RGB565;	vd->frame = 0;	vd->framestat[0] = 0;	vd->framestat[1] = 0;	return 0;}int v4lmmap(v4ldevice *vd){	if(v4lgetmbuf(vd)<0)		return -1;	if((vd->map =(unsigned char*) mmap(0, vd->mbuf.size, PROT_READ|PROT_WRITE, MAP_SHARED,  vd->fd, 0)) < 0) {		perror("mmap,error");		return -1;	}	return 0;}int v4lmunmap(v4ldevice *vd){	munmap(vd->map,vd->mbuf.size);	return 0;}int v4lgrabstart(v4ldevice *vd, int frame){	vd->mmap.frame = frame;	if(ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) < 0) {		perror("vidiocmcapture,error");			return -1;	}	vd->framestat[frame] = 1;	return 0;}void *v4lsync(void *pt){	 pth_1 *pth=(pth_1 *)pt;	int frame;	frame=pth->frame;	pthread_mutex_lock(&fd_lock);	if(ioctl(pth->device->fd, VIDIOCSYNC, &frame) < 0) {		perror("vidiocsync,error");		exit(1);	}	pthread_mutex_unlock(&fd_lock);	pth->device->framestat[frame] = 0;	return NULL;}int v4lcapture(v4ldevice *vd, int frame){	vd->mmap.frame = frame;	if(ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) < 0) {		perror("vidiocmcapture ,error");		return -1;	}	vd->framestat[frame] = 1;	return 0;}int other_clear();int width = 320;int height = 240;int main(void *rect){	v4ldevice device;	pthread_t t1,t2;	pth_1 pth1_a;	pth_2 pth2_a;       struct Rect *rectt=(struct Rect *)rect;             pth2_a.link=(char*)rectt->l;	char *buffer;	int frame = 0;	v4lopen("/dev/video0",&device);	v4lgrabinit(&device,width,height);	v4lmmap(&device);	v4lgrabstart(&device,frame);	printf("ioctl,successfully");	printf("init,successfully\n");	printf("put image,successfully\n");	while(1){		pth1_a.device=&device;		pth1_a.frame=frame;		pthread_create(&t1,NULL,v4lsync,&pth1_a);        	buffer = (char*)v4lgetaddress(&device);		pth2_a.x=rectt->x;		pth2_a.y=rectt->y;		pth2_a.buffer=buffer;		pthread_create(&t2,NULL,other_set_image,&pth2_a);			pthread_join(t1,NULL);		pthread_join(t2,NULL);		frame = (frame+1)%2;		v4lcapture(&device,frame);			}	v4lmunmap(&device);	close(device.fd);	}void *other_set_image(void *pt){	 pth_2 *pth=(pth_2 *)pt;         char *image=pth->buffer;         unsigned char *p;         int i;         p=(unsigned char *)pth->link;         for(i=0;i<height;i++){                memcpy(p,image,640);                 image+=640;                p+=1280;                    	       	} 	return NULL;     }

⌨️ 快捷键说明

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