V4L2摄像头获取单幅图片测试程序(read/write模式)

Android 驱动 专栏收录该内容
22 篇文章 0 订阅

#根据网上常见的一个测试程序修改而来 by rockie cheng
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#include <getopt.h>           

#include <fcntl.h>            
#include <unistd.h>
#include <errno.h>
#include <malloc.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>

#include <asm/types.h>        
#include <linux/videodev2.h>

#define CLEAR(x) memset (&(x), 0, sizeof (x))

struct buffer {
        void *                  start;
        size_t                  length;
};

static char *           dev_name        = "/dev/video0";
static int              fd              = -1;
struct buffer *         buffers         = NULL;

FILE *file_fd;
static unsigned long file_length;
static unsigned char *file_name;

int main (int argc,char ** argv)
{
struct v4l2_capability cap;
struct v4l2_format fmt;

file_fd = fopen("test.jpg", "w");

fd = open (dev_name, O_RDWR /* required */ | O_NONBLOCK, 0);

ioctl (fd, VIDIOC_QUERYCAP, &cap);

CLEAR (fmt);
fmt.type                = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width       = 640;
fmt.fmt.pix.height      = 480;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field       = V4L2_FIELD_INTERLACED;
ioctl (fd, VIDIOC_S_FMT, &fmt);

file_length = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height;

buffers = calloc (1, sizeof (*buffers));

buffers[0].length = file_length;
buffers[0].start = malloc (file_length);

for (;;)
{
   fd_set fds;
   struct timeval tv;
   int r;

   FD_ZERO (&fds);
   FD_SET (fd, &fds);

   /* Timeout. */
   tv.tv_sec = 3;
   tv.tv_usec = 0;

   r = select (fd + 1, &fds, NULL, NULL, &tv);

   if (-1 == r) {
    if (EINTR == errno)
     continue;
    printf ("select");
                        }

   if (0 == r) {
    fprintf (stderr, "select timeout/n");
    exit (EXIT_FAILURE);
                        }

   if (read (fd, buffers[0].start, buffers[0].length))
   break;
}

fwrite(buffers[0].start, buffers[0].length, 1, file_fd);

free (buffers[0].start);
close (fd);
fclose (file_fd);
exit (EXIT_SUCCESS);
return 0;
}

  • 0
    点赞
  • 1
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

zjc0888

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值