打印

出来的图片总是空的

[复制链接]
747|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanghqi|  楼主 | 2016-5-13 19:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dengdc| | 2016-5-13 20:01 | 只看该作者
存储空间有问题吧

使用特权

评论回复
板凳
zhanghqi|  楼主 | 2016-5-13 20:07 | 只看该作者
我也感觉好像是什么存储空间有问题,可是我也找不出是什么错误

使用特权

评论回复
地板
wuhany| | 2016-5-13 20:12 | 只看该作者
程序呢

使用特权

评论回复
5
zhanghqi|  楼主 | 2016-5-13 20:14 | 只看该作者

#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;
}

使用特权

评论回复
6
jiaxw| | 2016-5-13 20:16 | 只看该作者
看不懂  帮你顶顶   别沉了

使用特权

评论回复
7
spark周| | 2016-5-13 20:18 | 只看该作者
是采集的格式不对

使用特权

评论回复
8
liliang9554| | 2016-5-13 20:22 | 只看该作者
对,需要转换一下格式

使用特权

评论回复
9
zhanghqi|  楼主 | 2016-5-13 20:25 | 只看该作者
但是我转换了一下,显示还是有点问题

使用特权

评论回复
10
午夜粪车| | 2016-5-13 20:27 | 只看该作者
感觉论坛人好少啊

使用特权

评论回复
11
zhaoxqi| | 2016-5-13 20:30 | 只看该作者
只说明坛里搞图像处理的人较少而已

使用特权

评论回复
12
zhanghqi|  楼主 | 2016-5-13 20:34 | 只看该作者
搞图像的人应该挺多的啊

使用特权

评论回复
13
jlyuan| | 2016-5-13 20:36 | 只看该作者
继续顶   懂图像处理的进来看看

使用特权

评论回复
14
yszong| | 2016-5-13 20:40 | 只看该作者
不知道你打印信息出错在哪一步的?

使用特权

评论回复
15
dengdc| | 2016-5-13 20:43 | 只看该作者
内存分配合理不,BUF的属性赋的对不

使用特权

评论回复
16
zhanghqi|  楼主 | 2016-5-13 20:45 | 只看该作者
显示在LCD上要转换成RGB的,我转换了以后显示好像还是有点问题

使用特权

评论回复
17
lizye| | 2016-5-13 20:47 | 只看该作者
应该是图像数据指针的问题

使用特权

评论回复
18
zhanghqi|  楼主 | 2016-5-13 20:51 | 只看该作者
嗯,多谢大家啊,呵呵

使用特权

评论回复
19
zhanghqi|  楼主 | 2016-5-13 20:55 | 只看该作者
哦,我知道了,额多谢啊

使用特权

评论回复
20
tongbu2015| | 2016-5-14 11:29 | 只看该作者
这个还是多调试调试的就可以解决的。

使用特权

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

本版积分规则

852

主题

11757

帖子

5

粉丝