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

📄 cam.cpp

📁 一个linux下的摄像头编程
💻 CPP
字号:
#include "cam.h"// include other stuff#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#define CONV(a) (a) < 0 ? 0 : (a) > 255 ? 255 : aCCamera :: CCamera(){	;}CCamera::~CCamera(){	;}bool CCamera :: connect(int i){	char videofile[14] = "/dev/video";	char buff[2];	sprintf(buff,"%i",i);	strcat(videofile,buff);	printf("connecting to videodevice %s\n",videofile);	cam_fd = open(videofile, O_RDONLY);    if (ioctl(cam_fd, VIDIOCGCAP, &vcap) < 0)	{		printf("failed to connect");		return false;	}	else	{		int type;		if (sscanf(vcap.name, "Philips %d webcam", &type) < 1)     		{			printf("No Philips webcam detected.\n");			return false;		}   		else     		{					printf("Philips webcam type %d detected.\n", type);              float bpp = 1.5;				ioctl(cam_fd, VIDIOCGWIN, &vwin);           	    		   camsize = cvSize(vwin.width,vwin.height);				printf("initial camera size%i %i\n", vwin.width,vwin.height);				buffer = (char*)malloc((int)(vwin.width * vwin.height * bpp));				printf("camera memory buffer created\n");				return true;		}	}}void CCamera :: disconnect(){	close(cam_fd);}/*inline char fix(int a){	if(a < 0) return 0;	else if(a > 255) return 255;	     else return (a);}// slow but easy to followvoid CCamera :: capture(IplImage* img){   int w = camsize.width;	int h = camsize.height;	int wh = w * h;	float wh54 = (w * h * 5.0) / 4.0;   int length = (int)(w *  h * 1.5 ); 	read(cam_fd, buffer, length);		char* src = img->imageData;   for(int y = 0; y < img->height; y++, src += img->widthStep )     	for(int x = 0; x < img->width; x++ )			{				int Uj = (y+1)/2;				unsigned char Y = buffer[y * w + x];			 	unsigned char U = buffer[(int)(wh + (Uj * w + x) / 2)];				unsigned char V = buffer[(int)(wh54 + (Uj * w + x) / 2)];	          	src[x * img->nChannels] = fix(Y + (1.7 * (U -128))); // B;				src[x * img->nChannels + 1] = fix(Y - (0.7 * (V-128)) - (0.34 * (U-128))); // G;				src[x * img->nChannels + 2] = fix(Y + (1.37 * (V-128)));  // R;		//		src[x * img->nChannels] = fix(Y + (1.732446 * (U-128))); // B;		//		src[x * img->nChannels + 1] = fix(Y - (0.698001 * (V-128)) - (0.337633 * (U-128))); // G;		//		src[x * img->nChannels + 2] = fix(Y + (1.370705 * (V-128)));  // R;			}}  */// much faster.// probably it still can faster, but how?void CCamera :: capture(IplImage* img){   int w = camsize.width;	int h = camsize.height;	const int wh = w * h;	const int wh54 = (int)((wh * 5.0) / 4.0);   int length = (int)(wh * 1.5 ); 	read(cam_fd, buffer, length);		char* src = img->imageData;	// Copy the Y component into the B channel of the IplImage	for(int i=0;i<wh;i++)	{			src[3*i] = buffer[i];	}	for(int j=0;j<wh/4;j++)	{		unsigned char U = buffer[wh + j];		unsigned char V = buffer[wh54 + j];				int badd = (int)(1.7 * (U-128));		int gadd =  (int)(-(0.7 * (V-128)) - (0.34 * (U-128)));		int radd =   (int)(1.37 * (V-128));//		int col = 2 * j / w;//		int row = j%(w/2);//		int pos = 6 * (col * w + row);				int pos = 6 * (( 2 * j / w) * w +  (j%(w/2)));  				unsigned char Y = src[pos];		src[pos] = CONV(Y + badd);		src[pos+1] = CONV(Y + gadd);		src[pos+2] = CONV(Y + radd);			pos += 3;		Y = src[pos];		src[pos] = CONV(Y + badd);		src[pos+1] = CONV(Y + gadd);  		src[pos+2] = CONV(Y + radd);		pos += 3 *w; 				Y = src[pos];		src[pos] = CONV(Y + badd);		src[pos+1] = CONV(Y + gadd);		src[pos+2] = CONV(Y + radd);		pos -= 3;		Y = src[pos];		src[pos] = CONV(Y + badd);		src[pos+1] = CONV(Y + gadd);		src[pos+2] = CONV(Y + radd);	}}bool CCamera :: setSize(CvSize sz){	ioctl(cam_fd,VIDIOCGWIN, &vwin);	vwin.width = sz.width;	vwin.height = sz.height;	if(ioctl(cam_fd,VIDIOCSWIN,&vwin) < 0)	return false;	else	{		free(buffer);		buffer = (char*)malloc((int)(vwin.width * vwin.height * 1.5));		camsize = CvSize(sz);		printf("cam size changed to %i %i \n",camsize.width,camsize.height);		return true;	}}bool CCamera :: setFrameRate(int newframerate){	ioctl(cam_fd, VIDIOCGWIN, &vwin);	printf("Camera has framerate setting; current framerate: %d fps\n", (vwin.flags & PWC_FPS_FRMASK) >> PWC_FPS_SHIFT);	/* Set new framerate */	vwin.flags &= ~PWC_FPS_FRMASK;   vwin.flags |= (newframerate << PWC_FPS_SHIFT);   ioctl(cam_fd, VIDIOCSWIN, &vwin);	printf(" framerate changed to : %d fps\n", (vwin.flags & PWC_FPS_FRMASK) >> PWC_FPS_SHIFT);    return true;}// not working with my own camsbool CCamera :: setBlinkMode(int mode){        struct pwc_leds LED;	    if(mode == 0)	{        /* Turn LED off */        LED.led_on = 0;        LED.led_off = 0;        ioctl(cam_fd, VIDIOCPWCSLED, &LED);}   else if (mode == 1) {        /* Turn LED on solid */        LED.led_on = 100;        LED.led_off = 0;        ioctl(cam_fd, VIDIOCPWCSLED, &LED);  }else if(mode == 2){	       LED.led_on = 50;        LED.led_off = 50;        ioctl(cam_fd, VIDIOCPWCSLED, &LED);}return true;}

⌨️ 快捷键说明

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