1、摄像头程序说明camera.c程序代码#include #include #include #include #include #include #include #include #define ERR_FRAME_BUFFER 1#define ERR_VIDEO_OPEN 2#define ERR_VIDEO_GCAP 3#define ERR_VIDEO_GPIC 4#define ERR_VIDEO_SPIC 5#define ERR_SYNC 6#define ERR_FRAME_USING 7#define ERR_GET_FRAME 8 typedef struct _fb_v
2、4l / FrameBuffer 信息 int fbfd ; / FrameBuffer设备句柄 struct fb_var_screeninfo vinfo; / FrameBuffer屏幕可变的信息 struct fb_fix_screeninfo finfo; / FrameBuffer固定不变的信息 char *fbp; / FrameBuffer 内存指针 / video4linux信息 int fd; / struct video_capability capability; / struct video_buffer buffer; / struct video_window w
3、indow; / struct video_channel channel8; / struct video_picture picture; / struct video_tuner tuner; / struct video_audio audio8; / struct video_mmap mmap; / struct video_mbuf mbuf; / unsigned char *map; int frame_current;/what s the frame number being captured currently? int frame_usingVIDEO_MAX_FRA
4、ME;/帧的状态没有采集还是等待结束?fb_v41; #define DEFAULT_PALETTE VIDEO_PALETTE_RGB565 #define FB_FILE /dev/fb/0/V4L_FILE /dev/video0/Zhaoyang Modified /#define V4L_FILE /dev/v4l/video0 /我的板子video0已被占据/*struct video_mmap unsigned int frame; Frame (0 - n) for double buffer int height,width; unsigned int format; sho
5、uld be VIDEO_PALETTE_* ;struct video_mbuf int size; Total memory to map int frames; Frames int offsetsVIDEO_MAX_FRAME; /32; */* Function name: get_grab_frame* Descriptions: 获取图像帧,该函数调用了VIDIOCMCAPTURE的ioctl,获取一帧图片* Input: *vd,参数指针* frame,帧号* Output : 无* Created by:* Created Date: *-* Modified by:* Mo
6、dified Date: *-*/int get_grab_frame(fb_v41 *vd, int frame) /如果正在采集中 if (vd-frame_usingframe) fprintf(stderr, get_grab_frame: frame %d is already used.n, frame); return ERR_FRAME_USING; vd-mmap.frame = frame; /* Start Picture capture from this moment /*/ if (ioctl(vd-fd, VIDIOCMCAPTURE, &(vd-mmap) fr
7、ame_usingframe = 1; vd-frame_current = frame; return 0; /* Function name: get_next_frame* Descriptions: 获取下一帧的图像* Input: *vd ,参数指针* Output : 无* Created by:* Created Date: *-* Modified by:* Modified Date: *-*/int get_first_frame(fb_v41 *vd) int ret; vd-frame_current = 0; ret = get_grab_frame( vd, 0 )
8、; if ( retfd, VIDIOCSYNC, &(vd-frame_current) frame_usingvd-frame_current = 0 ; return (0); /* Function name: get_next_frame* Descriptions: 获取下一帧的图像* Input: *vd ,参数指针* Output : 返回0表示正常完成返回。* Created by:* Created Date: *-* Modified by:* Modified Date: *-*/int get_next_frame(fb_v41 *vd) int ret; vd-fr
9、ame_current = 1;/两帧采集不是0就是1 ret = get_grab_frame( vd,vd-frame_current); / 获取图像数据 if( ret fd, VIDIOCSYNC, &(vd-frame_current) frame_usingvd-frame_current = 0 ;/采集完毕置0 return 0; /* Function name: get_frame_address* Descriptions: 获取帧地址.调用该函数可以获取当前帧的缓冲地址* Input: *vd ,参数指针* Output : 返回帧图像数据的指针地址.* Create
10、d by:* Created Date: *-* Modified by:* Modified Date: *-*/unsigned char *get_frame_address(fb_v41 *vd) return (vd-map + vd-mbuf.offsetsvd-frame_current); / 从MAP内存中找到当前帧的起始指针 /* Function name: rgb_to_framebuffer* Descriptions: 写图像数据到Framebuffer,使用该函数前必须成功执行open_framebuffer函数.* Input: *vd ,参数指针* width
11、,图像的宽度vd-mmap.width* height,图像高度* xoffset,图在Framebuffer X轴偏移量vd-vinfo.xoffset* yoffset,图在Framebuffer Y轴偏移量* *img_ptr,即将写进FrameBuffer缓冲区指针* Output : 无* Created by:* Created Date: *-* Modified by:* Modified Date: * vd-finfo.line_length* -* | yoffset |* | xoffset * |* | |* | |* -*-*/void rgb_to_framebu
12、ffer( fb_v41 *vd, / int width,int height, / 图像大小 int xoffset,int yoffset, / 图像在Framebuffer偏移位置 unsigned short *img_ptr ) / 图像数据指针 int x,y; int location; unsigned short *loca_ptr; / Figure out where in memory to put the pixel for ( y = 0; y finfo.line_length; loca_ptr = (unsigned short *) (vd-fbp + l
13、ocation); for ( x = 0; x width; x+ ) / 行扫描 *(loca_ptr + x) = *img_ptr+; /*void rgb_to_framebuffer( fb_v41 *vd, / int width,int height, / 图像大小 int xoffset,int yoffset, / 图像在Framebuffer偏移位置 unsigned short int *img_ptr ) / 图像数据指针 int x,y; int location; / Figure out where in memory to put the pixel for
14、( y = 0; y height; y+ ) / 纵扫描 for ( x = 0; x finfo.line_length; *(unsigned short int*)(vd-fbp + location ) = *img_ptr+; */ /* Function name: open_framebuffer* Descriptions: 该函数用于初始化FrameBuffer设备,在该函数中打开FrameBuffer设备,并将设备影射到内存* Input: *ptr,打开Framebuffer设备路径指针* *vd ,参数指针* Output : 返回非0值表示出错* Created b
15、y:* Created Date: *-* Modified by:* Modified Date: *-*/int open_framebuffer(char *ptr,fb_v41 *vd) int fbfd,screensize; / Open the file for reading and writing fbfd = open( ptr, O_RDWR); if (fbfd fbfd = fbfd; / 保存打开FrameBuffer设备的句柄 / Get fixed screen information 获取FrameBuffer固定不变的信息 if (ioctl(fbfd, F
16、BIOGET_FSCREENINFO, &vd-finfo) printf(Error reading fixed information.n); return ERR_FRAME_BUFFER; / Get variable screen information 获取FrameBuffer屏幕可变的信息 if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vd-vinfo) printf(Error reading variable information.n); return ERR_FRAME_BUFFER; printf(%dx%d, %dbpp, xoffse
17、t=%d ,yoffset=%d n, vd-vinfo.xres, vd-vinfo.yres, vd-vinfo.bits_per_pixel,vd-vinfo.xoffset,vd-vinfo.yoffset ); / Figure out the size of the screen in bytes screensize = vd-vinfo.xres * vd-vinfo.yres * vd-vinfo.bits_per_pixel / 8; / Map the device to memory vd-fbp = (char *)mmap(0,screensize,PROT_REA
18、D|PROT_WRITE,MAP_SHARED,fbfd,0); / 影射Framebuffer设备到内存 if (int)vd-fbp = -1) printf(Error: failed to map framebuffer device to memory.n); return ERR_FRAME_BUFFER; printf(The framebuffer device was mapped to memory successfully.n); return 0; /* Function name: open_video* Descriptions: 通过该函数初始化视频设备* Input: *fileptr,打开的文件名指针* *vd,参数指针* dep,像素深度* pal,调色板* width,宽度* height,高度* Output : 无* Created by:* Created Date: *-* Modified by:* Modified Date: *-
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1