📄 cam.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 + -