+ -
当前位置:首页 → 问答吧 → Linux设备驱动程序简介

Linux设备驱动程序简介

时间:2011-01-16

来源:互联网

平台:ubuntu10.10
目的:要实现获取笔记本的摄像头的图像
简单描述:获取/dev/video0(我认为我的本本的摄像头是它)的一帧图像,保存到test.jpg

遇到的问题:test.jpg显示的大小是600K,但是我用图像查看器,却是空的,图像什么内容都没有,是黑色的,
请问是什么原因,求解答!!!!这个问题困绕了好几天了,一直没解决.........

自己的分析:我怀疑是不是,获取的时候,我的摄像头没有打开,但是 fd=open (dev_name, O_RDWR | O_NONBLOCK, 0);是打开了的,
fd=4,

备注:我的本本的摄像头是可用的,用cheese打开是正常的

代码如下:
#define CLEAR(x) memset (&x, 0, sizeof(x))
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 GetSinglePic()
{
struct v4l2_capability cap;
struct v4l2_format fmt;

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

fd = open (dev_name, O_RDWR | 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);


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;

}

作者: vikichen   发布时间: 2011-01-16

热门下载

更多