如何做图片 网站 链接,怎样上传网站到百度,商事主体信息查询平台,做卡盟网站赚钱吗展开全部在linux下所e5a48de588b662616964757a686964616f31333337613134有设备都是文件。所以对摄像头的操作其实就是对文件的操作。USB摄像头的设备文件就是在/dev目录下的video0(假如只有一个摄像头)。在linux下操作摄像头就是使用v4l2对摄像头进行视频的操作#xff0c;操作…展开全部在linux下所e5a48de588b662616964757a686964616f31333337613134有设备都是文件。所以对摄像头的操作其实就是对文件的操作。USB摄像头的设备文件就是在/dev目录下的video0(假如只有一个摄像头)。在linux下操作摄像头就是使用v4l2对摄像头进行视频的操作操作步骤如下1. 打开设备文件。int fdopen(”/dev/video0″,O_RDWR);2. 取得设备的capability看看设备具有什么功能比如是否具有视频输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct v4l2_capabilityv4l2_std_id std;do {ret ioctl(fd, VIDIOC_QUERYSTD, std);} while (ret -1 errno EAGAIN);switch (std) {case V4L2_STD_NTSC://……case V4L2_STD_PAL://……}3. 选择视频输入一个视频设备可以有多个视频输入。VIDIOC_S_INPUT,struct v4l2_input(可不要)4. 设置视频的制式和帧格式制式包括PALNTSC帧的格式个包括宽度和高度等。VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_formatstruct v4l2_format fmt;memset ( fmt, 0, sizeof(fmt) );fmt.type V4L2_BUF_TYPE_VIDEO_CAPTURE;fmt.fmt.pix.width 320;fmt.fmt.pix.height 240;fmt.fmt.pix.pixelformat V4L2_PIX_FMT_JPEG;if (ioctl(fd, VIDIOC_S_FMT, fmt) {printf(set format failed\n);//return 0;}5. 向驱动申请帧缓冲一般不超过5个。struct v4l2_requestbuffersstruct v4l2_requestbuffers req;memset(req, 0, sizeof (req));req.count 4;req.type V4L2_BUF_TYPE_VIDEO_CAPTURE;req.memory V4L2_MEMORY_MMAP;if (ioctl(fd,VIDIOC_REQBUFS,req) -1){perror(VIDIOC_REQBUFS error \n);//return -1;}6.申请物理内存将申请到的帧缓冲映射到用户空间这样就可以直接操作采集到的帧了而不必去复制。将申请到的帧缓冲全部入队列以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_bufferVideoBuffer* buffers calloc( req.count, sizeof(VideoBuffer) );printf(sizeof(VideoBuffer) is %d\n,sizeof(VideoBuffer));struct v4l2_buffer buf;for (numBufs 0; numBufs {memset( buf, 0, sizeof(buf) );buf.type V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory V4L2_MEMORY_MMAP;buf.index numBufs;if (ioctl(fd, VIDIOC_QUERYBUF, buf) {printf(VIDIOC_QUERYBUF error\n);//return -1;}printf(buf len is %d\n,sizeof(buf));//内存映射buffers[numBufs].length buf.length;buffers[numBufs].offset (size_t) buf.m.offset;buffers[numBufs].start mmap (NULL, buf.length,PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset);printf(buffers.length %d,buffers.offset %d ,buffers.start[0] %d\n,buffers[numBufs].length,buffers[numBufs].offset,buffers[numBufs].start[0]);printf(buf2 len is %d\n,sizeof(buffers[numBufs].start));if (buffers[numBufs].start MAP_FAILED){perror(buffers error\n);//return -1;}if (ioctl (fd, VIDIOC_QBUF, buf) {printf(VIDIOC_QBUF error\n);//return -1;}}7. 开始视频的采集。enum v4l2_buf_type type;type V4L2_BUF_TYPE_VIDEO_CAPTURE;if (ioctl (fd, VIDIOC_STREAMON, type) {printf(VIDIOC_STREAMON error\n);// return -1;}8. 出队列以取得已采集数据的帧缓冲取得原始采集数据。VIDIOC_DQBUF, 将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUFif (ioctl(fd, VIDIOC_DQBUF, buf) {perror(VIDIOC_DQBUF failed.\n);//return -1;}buf.type V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory V4L2_MEMORY_MMAP;unsigned char *ptcur buffers[numBufs].start;DEBUG(buf.bytesused %d \n,buf.bytesused);int i1;for(i10; i1{if((buffers[numBufs].start[i1] 0x000000FF) (buffers[numBufs].start[i11] 0x000000C4)){DEBUG(huffman table finded! \nbuf.bytesused %d\nFFC4 %d \n,buf.bytesused,i1);break;}}if(i1 buf.bytesused)printf(huffman table dont exist! \n);int i;for(i0; i{if((buffers[numBufs].start[i] 0x000000FF) (buffers[numBufs].start[i1] 0x000000D8)) break;ptcur;}DEBUG(i%d,FF%02x,D8%02x\n,i,buffers[numBufs].start[i],buffers[numBufs].start[i1]);int imagesize buf.bytesused - i;DEBUG(buf.bytesused %d \n,buf.bytesused);DEBUG (imagesize %d \n,imagesize);9. 停止视频的采集。VIDIOC_STREAMOFF10. 关闭视频设备。close(fd);