打印

arm-linux V4L2 图像采集

[复制链接]
2299|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
15051860045|  楼主 | 2013-6-2 15:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 15051860045 于 2013-6-2 15:57 编辑

    下面是我的一段图像采集然后输出图片的程序,可是出来的图片总是空的,好像是什么存储空间有问题,可是我也找不出是什么错误,希望高手们看看有什么错误,方便的话QQ也行。
QQ877431484


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <linux/videodev.h>
#include <linux/videodev2.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>

int main()
{
printf("Program start!\n");


int fd;
fd=open("/dev/video0",O_RDWR);   
         if(fd == -1)
           {printf("Failed to open video device!\n"); return -1; }
         else
            printf("Open video devive seccess!\n");


struct v4l2_capability cap;
if(ioctl(fd,VIDIOC_QUERYCAP,&cap)==-1)
   {printf("VIDIOC_QUERYCAP failure!\n");return -1;}
printf("Capability Informations:\n");
printf(" driver: %s\n", cap.driver);
printf(" card: %s\n", cap.card);
printf(" bus_info: %s\n", cap.bus_info);
printf(" version: %08x\n", cap.version);
printf(" capabilities: %08x\n", cap.capabilities);

struct v4l2_format fmt;            
memset (&fmt, 0, sizeof(fmt));
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width= 720;
fmt.fmt.pix.height= 576;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field= V4L2_FIELD_INTERLACED;
if (ioctl(fd, VIDIOC_S_FMT, &fmt) == -1)
    {printf("can't fmt\n");return -1;}


if(ioctl(fd, VIDIOC_G_FMT, &fmt) == -1)
   { printf("VIDIOC_G_FMT failed\n"); return -1;}

printf("Stream Format Informations:\n");
printf(" type: %d\n", fmt.type);
printf(" width: %d\n", fmt.fmt.pix.width);
printf(" height: %d\n", fmt.fmt.pix.height);
char fmtstr[8];
memset(fmtstr, 0, 8);
memcpy(fmtstr, &fmt.fmt.pix.pixelformat, 4);
printf(" pixelformat: %s\n", fmtstr);
printf(" field: %d\n", fmt.fmt.pix.field);
printf(" bytesperline: %d\n", fmt.fmt.pix.bytesperline);
printf(" sizeimage: %d\n", fmt.fmt.pix.sizeimage);
printf(" colorspace: %d\n", fmt.fmt.pix.colorspace);
printf(" priv: %d\n", fmt.fmt.pix.priv);
printf(" raw_date: %s\n", fmt.fmt.raw_data);


struct v4l2_requestbuffers req;
req.count=4;
req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory=V4L2_MEMORY_MMAP;
if (ioctl(fd, VIDIOC_REQBUFS, &req) == -1)
    {printf("can't requesbuffers\n");return -1;}



typedef struct VideoBuffer
{   
  void *start;   
  size_t  length;
}VideoBuffer;

VideoBuffer *buffers = calloc(req.count, sizeof(*buffers));
struct v4l2_buffer buf;
int numBufs;
for (numBufs=0;numBufs<req.count;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)==-1)
     { printf("can't querybuf\n");return -1; }
//杞崲鎴愮浉瀵瑰湴鍧€
  buffers[numBufs].length = buf.length;
  buffers[numBufs].start = mmap(NULL, buf.length, PROT_READ|PROT_WRITE, MAP_SHARED,fd, buf.m.offset);
  if (buffers[numBufs].start == MAP_FAILED)
     { printf("can't mmap\n");return -1;}
  if (ioctl(fd, VIDIOC_QBUF, &buf) == -1)
     {printf("VIDIOC_QBUF failure!\n");return -1;}
  printf("Frame buffer %d: address=0x%x, length=%d\n", numBufs, (unsigned int) buffers[numBufs].start, buffers[numBufs].length);
}


enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if(ioctl(fd,VIDIOC_STREAMON,&type)==-1)
    {printf("VIDIOC_STREAMON FAILURE!\n");return -1;}


memset(&buf,0,sizeof(buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = 0;
if(ioctl(fd,VIDIOC_DQBUF, &buf)==-1) { printf("can't dqbuf\n"); return -1;}


FILE *fp = fopen("frame.jpg", "wb");
if (fp < 0)
    {
      printf("open frame data file failed\n");
      return -1;
    }
fwrite(buffers[buf.index].start, buffers[buf.index].length, 1, fp);
fclose(fp);
printf("Capture one frame saved in %s\n", "frame.jpg");



if(ioctl(fd,VIDIOC_QBUF, &buf)==-1) { printf("can't qbuf\n"); return -1;}


if(ioctl(fd,VIDIOC_STREAMOFF, &buf.type)==-1)
   {printf("Can't VIDIOC_STREAMOFF"); return -1;}

for (numBufs=0; numBufs< 4; numBufs++)
    {
        munmap(buffers[numBufs].start, buffers[numBufs].length);
    }
close(fd);

printf("Program end!\n");
return 0;
}

相关帖子

沙发
zhangmangui| | 2013-6-4 10:38 | 只看该作者
看不懂  帮你顶顶   别沉了

使用特权

评论回复
板凳
15051860045|  楼主 | 2013-6-5 09:20 | 只看该作者
zhangmangui 发表于 2013-6-4 10:38
看不懂  帮你顶顶   别沉了

我知道了,是采集的格式不对,需要转换一下格式,但是我转换了一下,显示还是有点问题,在搞搞吧,感觉论坛人好少啊。

使用特权

评论回复
地板
zhangmangui| | 2013-6-5 09:38 | 只看该作者
15051860045 发表于 2013-6-5 09:20
我知道了,是采集的格式不对,需要转换一下格式,但是我转换了一下,显示还是有点问题,在搞搞吧,感觉论 ...

只说明坛里搞图像处理的人较少而已

使用特权

评论回复
5
15051860045|  楼主 | 2013-6-5 15:29 | 只看该作者
zhangmangui 发表于 2013-6-5 09:38
只说明坛里搞图像处理的人较少而已

搞图像的人应该挺多的啊

使用特权

评论回复
6
zhangmangui| | 2013-6-6 09:05 | 只看该作者
继续顶   懂图像处理的进来看看

使用特权

评论回复
7
figo20042005| | 2013-6-7 10:32 | 只看该作者
不知道你打印信息出错在哪一步的?内存分配合理不,BUF的属性赋的对不

使用特权

评论回复
8
zhangmangui| | 2013-6-7 10:58 | 只看该作者
figo20042005 发表于 2013-6-7 10:32
不知道你打印信息出错在哪一步的?内存分配合理不,BUF的属性赋的对不

来高手解答了  

使用特权

评论回复
9
15051860045|  楼主 | 2013-6-7 12:45 | 只看该作者
figo20042005 发表于 2013-6-7 10:32
不知道你打印信息出错在哪一步的?内存分配合理不,BUF的属性赋的对不

显示在LCD上要转换成RGB的,我转换了以后显示好像还是有点问题,应该是图像数据指针的问题,但是现在还没找到,想看看的话可以把源程序发给你,帮着找找错误

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

28

帖子

0

粉丝