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;
}
目的:要实现获取笔记本的摄像头的图像
简单描述:获取/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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28