基本信息
源码名称:捕捉摄像头数据显示
源码大小:6.49KB
文件格式:.zip
开发语言:C/C++
更新时间:2016-01-20
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <memory.h> #include <malloc.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <sys/stat.h> #include <errno.h> #include <asm/types.h> #include <linux/videodev2.h> #include "videocapture.h" #include "yuv2rgb.h" #define WIDTH 640 #define HEIGHT 480 #define BUFFER_NUM 1 VideoBuffer *buffers; v4l2_std_id std; struct v4l2_requestbuffers reqbuf; struct v4l2_buffer buf; enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE; struct v4l2_control reg; unsigned char rgbBuffer[WIDTH * HEIGHT * 3]; int fd; int openDevice() { fd = open("/dev/video0", O_RDWR); if (fd < 0) { printf("== open device error ==\n"); // exit(-1); return -1; } memset(&std, 0, sizeof(std)); int ret; do { ret = ioctl(fd, VIDIOC_QUERYSTD, &std); printf("== std %d ==\n", ret); } while (ret == -1 && errno == EAGAIN); printf("== std: %x ==\n", (unsigned int)std); switch(std) { case V4L2_STD_NTSC: printf("== std : NTSC ==\n"); break; case V4L2_STD_PAL: printf("== std : PAL ==\n"); break; case V4L2_STD_PAL_D: printf("== std : PAL_D ==\n"); break; default: printf("== std : other %d==\n", ret); break; } struct v4l2_capability capa; ret = ioctl(fd, VIDIOC_QUERYCAP, &capa); if (ret < 0) { printf("== get capability failed ==\n"); } if (! (capa.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { printf("== do not support capture ==\n"); } if (! (capa.capabilities & V4L2_CAP_STREAMING)) { printf("== do not support streaming ==\n"); } struct v4l2_format fmt; memset(&fmt, 0, sizeof(fmt)); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width = WIDTH; fmt.fmt.pix.height = HEIGHT; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; fmt.fmt.pix.bytesperline = WIDTH * 2 ; fmt.fmt.pix.sizeimage = WIDTH * HEIGHT * 2; ret = ioctl(fd, VIDIOC_S_FMT, &fmt); if (ret < 0) { printf("======set format failed %d========\n", errno); } reqbuf.count = BUFFER_NUM; reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; reqbuf.memory = V4L2_MEMORY_MMAP; ret = ioctl(fd, VIDIOC_REQBUFS, &reqbuf); if (ret == EINVAL) { printf("== do not support mmap==\n"); } if (ret < 0) { printf("== reqbufs buffers failed %d ==\n", errno); return ret; } buffers = calloc(reqbuf.count, sizeof(*buffers)); memset(rgbBuffer, 0, sizeof(rgbBuffer)); int i; for (i = 0; i < reqbuf.count; i ) { memset(&buf, 0, sizeof(buf)); buf.index = i; buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; ret = ioctl(fd, VIDIOC_QUERYBUF, &buf); if (ret < 0) { printf("== query buffer failed ==\n"); return ret; } buffers[i].length = buf.length; buffers[i].start = (char *) mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset); if (buffers[i].start == MAP_FAILED) { printf("== mmap %d failed: %d ==\n", i, strerror(errno)); return -1; } ret = ioctl(fd, VIDIOC_QBUF, &buf); if (ret < 0) { printf("== QBUF %d failed: %d ==\n", i, strerror(errno)); return -1; } // printf("== buffer %d addr: 0x%x, length: %d== \n", i, (unsigned int)buffers[i].start, buffers[i].length); } //printf("== mmap done %d == \n", i); ret = ioctl(fd, VIDIOC_STREAMON, &type); if (ret < 0) { printf("== STREAMON failed == \n"); return ret; } return fd; } int startCapture(unsigned char *distBuffer) { int ret; // static int counter = 0; // while (1) { ret = ioctl(fd, VIDIOC_DQBUF, &buf); // if (ret < 0) { // printf("== DQBUF failed == \n"); // return ret; // } // if (counter > 10) // return 0; // convertYUV2RGB(buffers[buf.index].start, distBuffer, WIDTH, HEIGHT); yuyv_bgr32(WIDTH, HEIGHT, buffers[buf.index].start, distBuffer ); // printf("frame %d\n", counter); ret = ioctl(fd, VIDIOC_QBUF, &buf); if (ret < 0) { printf("== QBUF failed ==\n"); return ret; } // } return 0; } int startCapture_YUV_TO_RGB(const unsigned char *srcBuffer, unsigned char *distBuffer) { int ret; yuyv_bgr32(WIDTH, HEIGHT, srcBuffer, distBuffer ); return 0; } int stopCapture() { return 0; } int closeDevice() { int ret, i; for (i = 0; i < BUFFER_NUM; i ) { munmap(buffers[i].start, buffers[i].length); } ret = ioctl(fd, VIDIOC_STREAMOFF, &type); if (ret < 0) { printf("== Stream off failed ==\n"); return ret; } return close(fd); } int setRegister(unsigned id, signed value) { printf("-- set register --"); int ret; reg.id =(unsigned) id; reg.value = (signed) value; ret = ioctl(fd, VIDIOC_S_CTRL, ®); if (ret < 0) { printf("== set register failed %d ==\n", errno); return ret; } return 0; }