十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
具体方法:
创新互联公司为您提适合企业的网站设计 让您的网站在搜索引擎具有高度排名,让您的网站具备超强的网络竞争力!结合企业自身,进行网站设计及把握,最后结合企业文化和具体宗旨等,才能创作出一份性化解决方案。从网站策划到成都做网站、网站设计, 我们的网页设计师为您提供的解决方案。
另外一个就是UVC的一个测试软件luvcview,在资料光盘中的路径为:Linux-3.0.1\apptest\摄像头测试\USB摄像头\USBCamera- linux+android\linux3.0.1系统下-2012-07-05,通过这个可以查看和测试UVC摄像头。
查看摄像头信息:./luvcview -d /dev/video2 –L 结果如下:
由此可以看出摄像头的一些基本信息,更多的不太了解,起码清楚了输出格式YUV,以及分辨率,接下来通过这些信息来测试。
[root@FORLINX6410]# ./luvcview -d /dev/video2 -f yuv -s 320x240
即可运行。
说明书上,应该有一个管理摄像头的IP地址,你用网线把摄像头直接连到你电脑上,你在电脑上输入IP地址段与摄像头的管理IP地址段一个网段就可以了。然后在浏览器里输入摄像头的IP地址,就应该可以进入到摄像头的管理界面了。
升级内核:
1.这里我用的内核是linux-2.6.32.59 版本的,首先下载这个内核
2.下载完毕之后拷贝到Linux中进行解压,tar jxvf linux-2.6.32.59.tar
3.进入linux-2.6.32.59 目录把当前内核的配置文件拷贝到当前目录下cp /boot/config-2.6.18-238.e15 。/.config 因为我当前用的内核是linux-2.6.18版本的`
4.在配置视频所需要的驱动 make menuconfig 进入之后找到Device Drivers 按回车进入 找到MultiMedia Support先按空格键进行选中 再按回车键进入找到 Video For Linux 按回车键选中 再按空格键选中 Video capture adapters 将此选项选中之后按回车键进入找到V4L USB devices 按空格键选中再按回车键进入 找到USB ZC0301[P] ImageProcessor and Control Chip support 按空格键选中 再找到《M》GSPCA based webcamsà先按空格键选中再按回车键进入在最后一项的菜单下选中ZC3XX USB Camera Driver
5.以上配置好之后再次回到顶层菜单,找到General setup-à按回车键进入找到[]enable deprecated sysfs features which may confuse old usersp 按空格键选中
6.经过4 ,5 两步骤已经将视频的驱动配置好退出保存
7.下面进行编译 make 此步骤大概需要一个小时左右
8.再次进行 make modules_install
9.再次进行 make install
10.此时查看将摄像头插入USB 再次查看设备文件中是否已经有了 video0 用ls /dev/ 命令查看
11.如果有说明安装成功
下面是将摄像头的内容显示出来
1首先安装SDL库在此下载
2.进行解压tar zxvf SDL-1.2.15.tar
3.进入目录 cd SDL-1.2.15 再进入 test目录 cd test 在test 目录下配置 。/configure再进行make 则会有许多编译好的程序随便运行一个试试
4.在我上传的资料文件夹中找到servfox-R1_1_3 文件夹进入之后首先将Makefile.i386的名字改为 Makefile ,
5.编译 make
6. 在我上传的资料文件夹中找到spcaview-20061208 文件夹进入之后直接make
7.之后将摄像头插入到USB 接口首先运行servfox-R1_1_3 文件夹中的servfox。/servfox 如果提示出现错误则要把打印的错误语句在spcav4l.c中找到将错误信息删除知道没有错误出现,再次运行。/servfox -g –w 127.0.0.1:7070 –d /dev/video0
8. 再次运行spcaview 。/ spcaview –g –w 127.0.0.1:7070此时应该在你的虚拟机上就会显示摄像头拍出来的视频注意此时的项目支持网络
1. 摄像头的安装
在Linux下常用的摄像头驱动是spca5xx。这个网站还给出了这款驱动支持的摄像头的种类。另外,ov511芯片直接就支持Linux,使用者款芯片的摄像头有网眼V2000。我使用的是网眼V2000的摄像头,和Z-Star
301p+现代7131R芯片的摄像头。后一种需要spca5xx的驱动。关于spca5xx的安装方法,网上有很多介绍,这里就不说了。
2. 摄像头的调试
安装好摄像头后,为了测试摄像头能否正常工作,可以用一下软件。比较著名的是xawtv,在网上搜以下可以下载到。安装好后,打开xawtv则可以调试摄像头。
3. Video4Linux 编程获取数据
现有的video4linux有两个版本,v4l和v4l2。本文主要是关于v4l的编程。利用v4l API获取视频图像一般有以下几步:
a 打开设备
b 设置设备的属性,比如图像的亮度,对比度等等
c 设定传输格式和传输方式
d 开始传输数据,一般是一个循环,用以连续的传输数据
e 关闭设备
下面具体介绍v4l编程的过程。首先指出,在video4linux编程时要包含头文件,其中包含了video4linux的数据结构和函数定义。
1)v4l的数据结构
在video4linux API中定义了如下数据结构,详细的数据结构定义可以参考v4l API的文档,这里就编程中经常使用的数据结构作出说明。
首先我们定义一个描述设备的数据结构,它包含了v4l中定义的所有数据结构:
typedef struct
_v4ldevice
{int fd;//设备号
struct video_capability capability;
struct
video_channel channel[10];
struct video_picture picture;
struct video_clip
clip;
struct video_window window;
struct video_capture capture;
struct
video_buffer buffer;
struct video_mmap mmap;
struct video_mbuf
mbuf;
struct video_unit unit;
unsigned char
*map;//mmap方式获取数据时,数据的首地址
pthread_mutex_t mutex;
int frame;
int
framestat[2];
int overlay;
}v4ldevice;
下面解释上面这个数据结构中包含的数据结构,这些结构的定义都在中。
* struct
video_capability
name[32] Canonical name for this interface
type Type of
interface
channels Number of radio/tv channels if appropriate
audios
Number of audio devices if appropriate
maxwidth Maximum capture width in
pixels
maxheight Maximum capture height in pixels
minwidth Minimum capture
width in pixels
minheight Minimum capture height in pixels
这一个数据结构是包含了摄像头的属性,name是摄像头的名字,maxwidth maxheight是摄像头所能获取的最大图像大小,用像素作单位。
在程序中,通过ioctl函数的VIDIOCGCAP控制命令读写设备通道已获取这个结构,有关ioctl的使用,比较复杂,这里就不说了。下面列出获取这一数据结构的代码:
int v4lgetcapability(v4ldevice *vd)
{
if(ioctl(vd-fd,
VIDIOCGCAP, (vd-capability)) 0)
{
v4lperror("v4lopen:VIDIOCGCAP");
return -1;
}
return 0;
}
*
struct video_picture
brightness Picture brightness
hue Picture hue (colour
only)
colour Picture colour (colour only)
contrast Picture
contrast
whiteness The whiteness (greyscale only)
depth The capture depth
(may need to match the frame buffer depth)
palette Reports the palette that
should be used for this image
这个数据结构主要定义了图像的属性,诸如亮度,对比度,等等。这一结构的获取通过ioctl发出VIDIOCGPICT控制命令获取。
* struct video_mbuf
size The number of bytes to
map
frames The number of frames
offsets The offset of each frame
这个数据结构在用mmap方式获取数据时很重要:
size表示图像的大小,如果是640*480的彩色图像,size=640*480*3
frames表示帧数
offsets表示每一帧在内存中的偏移地址,通过这个值可以得到数据在图像中的地址。
得到这个结构的数据可以用ioctl的VIDIOCGMBUF命令。源码如下:
int v4lgetmbuf(v4ldevice
*vd)
{
if(ioctl(vd-fd, VIDIOCGMBUF, (vd-mbuf))0)
{
v4lperror("v4lgetmbuf:VIDIOCGMBUF");
return -1;
}
return
0;
}
而数据的地址可以有以下方式计算:
unsigned char
*v4lgetaddress(v4ldevice *vd)
{
return (vd-map +
vd-mbuf.offsets[vd-frame]);
}
2)获取影像mmap方式。
在video4Linux下获取影像有两种方式:overlay和mmap。由于我的摄像头不支持overlay方式,所以这里只谈mmap方式。
mmap方式是通过内存映射的方式获取数据,系统调用ioctl的VIDIOCMCAPTURE后,将图像映射到内存中,然后可以通过前面的v4lgetmbuf(vd)函数和v4lgetaddress(vd)函数获得数据的首地址,这是李可以选择是将它显示出来还是放到别的什么地方。
下面给出获取连续影像的最简单的方法(为了简化,将一些可去掉的属性操作都去掉了):
char*
devicename="/dev/video0";
char* buffer;
v4ldevice device;
int width =
640;
int height = 480;
int frame =
0;
v4lopen("/dev/video0",device);//打开设备
v4lgrabinit(device,width,height);//初始化设备,定义获取的影像的大小
v4lmmap(device);//内存映射
v4lgrabstart(device,frame);//开始获取影像
while(1){
v4lsync(device,frame);//等待传完一帧
frame
= (frame+1)%2;//下一帧的frame
v4lcapture(device,frame);//获取下一帧
buffer =
(char*)v4lgetaddress(device);//得到这一帧的地址
//buffer给出了图像的首地址,你可以选择将图像显示或保存......
//图像的大小为
width*height*3
..........................
}
转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦
在linux下所有设备都是文件。所以对摄像头的操作其实就是对文件的操作。USB摄像头的设备文件就是在/dev目录下的video0(假如只有一个摄像头)。在linux下操作摄像头就是使用v4l2对摄像头进行的操作,操作步骤如下
打开设备文件。
int fd=open(”/dev/video0″,O_RDWR);
2. 取得设备的capability,看看设备具有什么功能,比如是否具有输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct v4l2_capability
v4l2_std_id std;
do {
ret= ioctl(fd, VIDIOC_QUERYSTD, std);
} while (ret == -1 errno == EAGAIN);
switch (std) {
case V4L2_STD_NTSC:
//……
case V4L2_STD_PAL:
//……
}
3. 选择输入,一个设备可以有多个输入。VIDIOC_S_INPUT,struct v4l2_input(可不要)
4. 设置的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等。
VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format
struct v4l2_format fmt;
memset ( fmt, 0, sizeof(fmt) );
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 320;
fmt.fmt.pix.height = 240;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
if (ioctl(fd, VIDIOC_S_FMT, fmt) 0)
{
printf("set format failed\n");
//return 0;
}
5. 向驱动申请帧缓冲,一般不超过5个。struct v4l2_requestbuffers
struct v4l2_requestbuffers req;
memset(req, 0, sizeof (req));
req.count = 4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
if (ioctl(fd,VIDIOC_REQBUFS,req) == -1)
{
perror("VIDIOC_REQBUFS error \n");
//return -1;
}
6.申请物理内存
将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。将申请到的帧缓冲全部入队列,以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_buffer
VideoBuffer* buffers = calloc( req.count, sizeof(VideoBuffer) );
printf("sizeof(VideoBuffer) is %d\n",sizeof(VideoBuffer));
struct v4l2_buffer buf;
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) 0)
{
printf("VIDIOC_QUERYBUF error\n");
//return -1;
}
printf("buf len is %d\n",sizeof(buf));
//内存映射
buffers[numBufs].length = buf.length;
buffers[numBufs].offset = (size_t) buf.m.offset;
buffers[numBufs].start = mmap (NULL, buf.length,PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset);
printf("buffers.length = %d,buffers.offset = %d ,buffers.start[0] = %d\n",buffers[numBufs].length,buffers[numBufs].offset,buffers[numBufs].start[0]);
printf("buf2 len is %d\n",sizeof(buffers[numBufs].start));
if (buffers[numBufs].start == MAP_FAILED)
{
perror("buffers error\n");
//return -1;
}
if (ioctl (fd, VIDIOC_QBUF, buf) 0)
{
printf("VIDIOC_QBUF error\n");
//return -1;
}
}
7. 开始的采集。
enum v4l2_buf_type type;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl (fd, VIDIOC_STREAMON, type) 0)
{
printf("VIDIOC_STREAMON error\n");
// return -1;
}
8. 出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF, 将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF
if (ioctl(fd, VIDIOC_DQBUF, buf) 0)
{
perror("VIDIOC_DQBUF failed.\n");
//return -1;
}
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
unsigned char *ptcur = buffers[numBufs].start;
DEBUG("buf.bytesused = %d \n",buf.bytesused);
int i1;
for(i1=0; i1buf.bytesused; i1++)
{
if((buffers[numBufs].start[i1] == 0xFF) (buffers[numBufs].start[i1+1] == 0xC4))
{
DEBUG("huffman table finded! \nbuf.bytesused = %d\nFFC4 = %d \n",buf.bytesused,i1);
break;
}
}
if(i1 == buf.bytesused)printf("huffman table don't exist! \n");
int i;
for(i=0; ibuf.bytesused; i++)
{
if((buffers[numBufs].start[i] == 0xFF) (buffers[numBufs].start[i+1] == 0xD8)) break;
ptcur++;
}
DEBUG("i=%d,FF=%02x,D8=%02x\n",i,buffers[numBufs].start[i],buffers[numBufs].start[i+1]);
int imagesize =buf.bytesused - i;
DEBUG("buf.bytesused = %d \n",buf.bytesused);
DEBUG ("imagesize = %d \n",imagesize);
9. 停止的采集。VIDIOC_STREAMOFF
10. 关闭设备。close(fd);
这种情况则主要出现在系统或者软件设置方面,比如QQ视频摄像头被占用就很容易出现这种情况。
首先确保自己并没有打开本地摄像头XP系统在我的电脑里可以打开,Win7系统相对麻烦些,打开开始菜单,右键“计算机”选择“管理”。
网络摄像头简称WEBCAM,英文全称为WEBCAMERA,是一种结合传统摄像机与网络技术所产生的新一代摄像机,只要标准的网络浏览器(如MicrosoftIE或Netscape),即可监视其影像。