USB Camera摄像头

来源:互联网 发布:湖南网络工程学院快递 编辑:程序博客网 时间:2024/04/29 05:22

 

http://weijb0606.blog.163.com/blog/static/131286274201063145356429/

我的摄像头终于出现图像了!

李迟按:本文章不是教程,不是心得总结,而是记录我在做毕业设计过程中遇到的一些问题,以及怎么去解决

(有些还是没有解决)。可能带有牢骚,可能带有某些让人不悦的话。希望大家见谅。

今晚很高兴,捣鼓了几天,郁闷了几天的事,今天解决了一些了。起码我能在linux下看到摄像头的图像了。

提起USB摄像在linux下的使用,无论是百度还是Google,出现的多数是法国人写的一个通用驱动程序,即spca5xx,

我也是找了很久才找到,——因为在网上看到的那个网站已经不能登陆了,就是说不再维护了(这个后来再作说明),所以

找了很久。可惜不能用。因为我make都不通过,出现的错误如下:

make -C /lib/modules/`uname -r`/build SUBDIRS=/usr/local/gspcav1-20071224 CC=cc modules

make[1]: Entering directory `/usr/src/linux-2.6.30.2'

CC [M] /usr/local/gspcav1-20071224/gspca_core.o

/usr/local/gspcav1-20071224/gspca_core.c:54:27: error: asm/semaphore.h: No such file or directory

In file included from /usr/local/gspcav1-20071224/gspca_core.c:845:

/usr/local/gspcav1-20071224/utils/spcausb.h: In function ‘spca5xxRegRead’:

/usr/local/gspcav1-20071224/utils/spcausb.h:95: error: implicit declaration of function ‘info’

/usr/local/gspcav1-20071224/utils/spcausb.h: In function ‘spca_set_interface’:

/usr/local/gspcav1-20071224/utils/spcausb.h:278: error: implicit declaration of function ‘warn’

In file included from /usr/local/gspcav1-20071224/gspca_core.c:853:

/usr/local/gspcav1-20071224/Sunplus-jpeg/sp5xxfw2.h: In function ‘sp5xxfw2_init’:

/usr/local/gspcav1-20071224/Sunplus-jpeg/sp5xxfw2.h:122: error: called object ‘info’ is not a function

/usr/local/gspcav1-20071224/Sunplus-jpeg/sp5xxfw2.h:136: error: called object ‘info’ is not a function

/usr/local/gspcav1-20071224/Sunplus-jpeg/sp5xxfw2.h:141: error: called object ‘info’ is not a function

/usr/local/gspcav1-20071224/Sunplus-jpeg/sp5xxfw2.h:148: error: called object ‘info’ is not a function

/usr/local/gspcav1-20071224/Sunplus-jpeg/sp5xxfw2.h:176: error: called object ‘info’ is not a function

/usr/local/gspcav1-20071224/Sunplus-jpeg/sp5xxfw2.h: In function ‘sp5xxfw2_start’:

/usr/local/gspcav1-20071224/Sunplus-jpeg/sp5xxfw2.h:214: error: called object ‘info’ is not a function

/usr/local/gspcav1-20071224/Sunplus-jpeg/sp5xxfw2.h:230: error: called object ‘info’ is not a function

/usr/local/gspcav1-20071224/gspca_core.c: In function ‘spca5xx_ioctl’:

/usr/local/gspcav1-20071224/gspca_core.c:2463: error: implicit declaration of function ‘video_usercopy’

/usr/local/gspcav1-20071224/gspca_core.c: At top level:

/usr/local/gspcav1-20071224/gspca_core.c:2609: error: unknown field ‘owner’ specified in initializer

/usr/local/gspcav1-20071224/gspca_core.c:2609: warning: initialization from incompatible pointer type

/usr/local/gspcav1-20071224/gspca_core.c:2611: error: unknown field ‘type’ specified in initializer

/usr/local/gspcav1-20071224/gspca_core.c:2615: warning: initialization from incompatible pointer type

/usr/local/gspcav1-20071224/gspca_core.c: In function ‘spca50x_create_sysfs’:

/usr/local/gspcav1-20071224/gspca_core.c:2769: error: implicit declaration of function ‘video_device_create_file’

/usr/local/gspcav1-20071224/gspca_core.c:2780: error: implicit declaration of function ‘video_device_remove_file’

/usr/local/gspcav1-20071224/gspca_core.c: In function ‘spca5xx_probe’:

/usr/local/gspcav1-20071224/gspca_core.c:4301: error: incompatible types in assignment

make[2]: *** [/usr/local/gspcav1-20071224/gspca_core.o] Error 1

make[1]: *** [_module_/usr/local/gspcav1-20071224] Error 2

make[1]: Leaving directory `/usr/src/linux-2.6.30.2'

make: *** [default] Error 2

以我现在的能力,我不能解决,我google过,但得不到好的解决方法。

更重要的是,现在想找一个几年前驱动支持的摄像头很难啊!现在都流行免驱了——根据OS相关理论,这是不成功的,

设备没有驱动哪能访问?他们说的是用户免去安装驱动程序这一步骤,——是这个“免驱”。我买的摄像头不

在spca5xx支持范围之中。我好容易找到一个,是小郭用的,摄像头ID刚好是上述驱动所支持的。当时很兴

奋,心想,万事俱备,只差编译、测试了。可惜,以失败告终。错误如上所述。

我试的几个版本为spca5xx-20060501和gspcav1-20071224,都不行。

在网上找了那么多文章看,但一个也行不通。我不知大家的感受是什么,反正我很郁闷,很无奈。

后来,在插入我买的摄像头时,使用了lsusb,将ID那一行复制到google中,一不小心,发现了一个

好网站:http://linux-uvc.berlios.de/。上面竟然有我摄像头的ID号!!继续研究,发现有UVC这个东东,

我在配置内核时也碰到过,但没有注意,没想到如此有用!后来在一个网站中找到有关使用UVC驱动摄像头的

文章,地址忘了,我也不知是怎么搜索到的。此外还下载一个观看图像的小软件(补充一下:luvcview 或者cheese[debian自带])。

结果成了!可以显示图像了!下面写一下过程:

如果你能在http://linux-uvc.berlios.de/找到你的摄像头的ID,即UVC支持的,那么就可以在linux下使用了。

至于从哪个版本开始内核支持UVC,官方的话是“Linux 2.6.26 and newer includes the Linux UVC driver natively.”

1、查看摄像头ID:

[root@151 dev]# lsusb

Bus 002 Device 013: ID 0ac8:3313 Z-Star Microelectronics Corp.

0xc8:3313在UVC中支持了。

2、插入摄像头后,就可以在/dev/下查看是否有video设备文件:

[root@151 dev]# ls | grep video

video

video0

其中,video是video0的连接。如果没有再现,可能UVC没有配置到内核中,重新配置就可以了

(大致在Device DriversàMultimedia devicesàVideo capture adaptersàV4L USB devices下面)。如果内核配置了,

还是不出现,可以使用modprobe uvcvideo来加载该模块。

3、先看看摄像头的相关信息:

lshal | grep Cam

出现:

info.product = 'Vega USB 2.0 Camera.' (string)

usb_device.product = 'Vega USB 2.0 Camera.' (string)

usb.interface.description = 'Vega USB 2.0 Camera.' (string)

info.product = 'Vega USB 2.0 Camera.' (string)

input.product = 'Vega USB 2.0 Camera.' (string)

info.product = 'Vega USB 2.0 Camera.' (string)

对USB有研究的,就很熟悉这些字段。

再看一下系统能不能识别出摄像头:

[root@151 log]# dmesg | grep Cam

uvcvideo: Found UVC 1.00 device Vega USB 2.0 Camera. (0ac8:3313)

input: Vega USB 2.0 Camera. as /class/input/input6

usb 2-7: Product: Vega USB 2.0 Camera.

uvcvideo: Found UVC 1.00 device Vega USB 2.0 Camera. (0ac8:3313)

input: Vega USB 2.0 Camera. as /class/input/input7

usb 2-7: Product: Vega USB 2.0 Camera.

uvcvideo: Found UVC 1.00 device Vega USB 2.0 Camera. (0ac8:3313)

input: Vega USB 2.0 Camera. as /class/input/input8

usb 2-7: Product: Vega USB 2.0 Camera.

[root@151 ~]# dmesg | grep video

pci 0000:05:00.0: Boot video device

Linux video capture interface: v2.00

usbcore: registered new interface driver uvcvideo

uvcvideo 2-7:1.0: usb_probe_interface

uvcvideo 2-7:1.0: usb_probe_interface - got id

uvcvideo: Found UVC 1.00 device Vega USB 2.0 Camera. (0ac8:3313)

uvcvideo 2-7:1.0: usb_probe_interface

uvcvideo 2-7:1.0: usb_probe_interface - got id

uvcvideo: Found UVC 1.00 device Vega USB 2.0 Camera. (0ac8:3313)

uvcvideo 2-7:1.0: usb_probe_interface

uvcvideo 2-7:1.0: usb_probe_interface - got id

uvcvideo: Found UVC 1.00 device Vega USB 2.0 Camera. (0ac8:3313)

哈哈,识别出来了!可以测试了。

4、我使用的软件是luvcview,这个软件google就可以找到的。安装过程很简单,——make,make install就可以了。(哈哈,这里才说)

下面这个过程是测试过程,从看到图像到结束的过程:

[root@151 dev]# luvcview -d /dev/video0 -f yuv -s 640x480   (直接运行luvcview也可)

uvcview verion 0.1.4

size width: 640 height: 480

Video driver: x11

A window manager is available

video /dev/video0

Stop asked

Clean Up done Quit

[root@151 dev]#

解释命令:

-d 设备名,这里/dev/video或/dev/video0都可以,因为它们都是一个文件

-f 格式,有yuv和jpg两种,后者测试不行

-s 大小,能支持的最大尺度可能由luvcview决定,也可能由摄像头决定,(应该是后者,暂没有研究)

更具体的参见luvcview目录下的README文件。

另外,如果没有插入摄像头,即使modprobe uvcvideo也不会出现/dev/video设备文件;插入摄像头,即使没有modprobe uvcvideo,

也会出现/dev/video设备文件,当然这是我的测试,没有代表性,也没有理论根据的。

注:

1、UVC:USB Video Class

2、gspcav不是不再维护,而是在某一版本开始已经纳入内核了,至于哪个版本(2.6.26),就不太清楚了。特此说明。

3、这次毕业设计所不再编译gspca到内核中了。不支持它,直接使用UVC。

第一张图:红旗6.2,内核2.6.28.8

USB Camera摄像头 - BEYOND ME - BEYOND ME500)this.width=500;" width="500" border="0">

虚拟机FC9,内核2.6.30

USB Camera摄像头 - BEYOND ME - BEYOND ME500)this.width=500;" width="500" border="0">

发表于: 2010-03-19,修改于:

我跟作者经历简直太相似了,起先搞了好几天真是有点摸不着头脑,哈哈!!

 

 

luvcview,软件,可在Linux系统下测试USB摄像头
 
免费下载地址在 http://linux.linuxidc.com/
 
用户名与密码都是www.linuxidc.com
 
具体下载目录在 /2012年资料/6月/8日/Linux下USB摄像头测试程序luvcview/

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-06/62341.htm

 

 

1
  luvcview是一个开源项目,专注于UVC摄像头的测试,只要您的摄像头支持UVC驱动,即可使用luvcview测试程序,如何知道自己的摄像头是不是支持UVC驱动呢?在这个网站上查一下,看看自己摄像头的ID是不是在支持的列表中,http://www.ideasonboard.org/uvc/

2  我们在luvcview这个项目的基础上进行了修改,使之能够在s3c6410平台上运行,采用了6410特有的硬件空间色彩转换和图像缩放功能,也就是 post processor功能。

3 另外需要说一下我们修改后的luvcview可以运行在PC Linux平台和s3c6410平台,源码里面有两个makefile文件,一个针对嵌入式版本一个针对PC Linux版本,
  嵌入式版本里面分硬件实现YUV to RGB和软件实现 YUV to RGB ,缺省配置是硬件实现YUV to RGB 及图像的缩放。

4  使用方法:

    把 luvcview拷贝到 /mnt目录下面,执行 ./luvcview -d /dev/video2  -f jpg -s 800x600 在LCD屏幕上即可看到采集到的图像。

    -d 指定摄像头的设备节点
    -f 指定摄像头传给系统的数据格式,-jpg代表为 mjpeg 码流,另外还有  -yuv 这样传给系统的数据yuv422格式的码流。
    -s 指定摄像头采集的分辨率为 800x600

    如何查看您的摄像头支持的分辨率呢?
    ./luvcview -d /dev/video2 -L

5   luvcview工作在mjpeg流模式下是可以录制AVI文件,抓图保存成.jpg文件的。avi文件在Ubuntu12.04系统下播放正常,在WindowXP下的暴风影音中播放会花屏,很可能跟播放器支持的视频编码格式
    有关系。
    yuv流模式下可以抓图保存成 .pnm格式的图像文件,在Ubuntu12.04下可以正常显示,该模式下不支持保存avi文件。

6   PC版本的luvcview,抓图和保存avi文件是通过界面上的按键和键盘按键操作的,具体的看一下源码,
    嵌入式版本的 luvcview,界面未增加按钮,抓图和保存avi文件是通过开关变量控制的,修改方法也很简单,简单修改一下源码即可,这个您是懂得的,  ^_^

7  如果您编译PC版本的luvcview,Ubuntu环境里面需要安装sdl环境,在终端环境里面执行: apt-get install libsdl1.2-dev  即可,嵌入式版本不需要的,直接make即可。注意,编译之前记得 make clean一下。

源码下载链接: :http://download.csdn.net/detail/yimiyangguang1314/4413767

 

luvcview在arm板上的移植
一直想着在自己的开发板上能回显摄像头中的内容,今天终于有点时间了,试着在网上找了一下,发现支持V4L的摄像头应用程序还真不少。我简单看了一下,luvcview是支持直接回显的。所以就尝试着移植了luvcview。  www.2cto.com 
开发环境: 主     机 VM & Ubuntu 10.04
                开 发 板 devkit8500 (arm-cortex a8 dm3730)
                交叉编译器 arm-2009q1
1. 首先就是要下载luvcview源代码,这个不用多说,到处都是。我这里使用的是 luvcview_20070512.orig.tar.gz,这个包需要SDL库的支持,在网上找找怎么移植就是了。
2. 将压缩包解压到自己的工作目录并进入源码目录:  www.2cto.com 
    #tar xvf /mnt/hgfs/share/luvcview_20070512.orig.tar.gz
3. 修改Makefile文件,这里有关键的几行是必须要修改的。
        CC=gcc
        CPP=g++
        INSTALL=install
        APP_BINARY=luvcview
        BIN=/usr/local/bin
        SDLLIBS = $(shell sdl-config --libs)
        SDLFLAGS = $(shell sdl-config --cflags)
        #LIBX11FLAGS= -I/usr/X11R6/include -L/usr/X11R6/lib
----->>>
       TARGET=arm-none-linux-gnueabi-
       CC=$(TARGET)gcc
       CPP=$(TARGET)g++
       INSTALL=install
       APP_BINARY=luvcview
       BIN=/usr/local/bin
       SDLLIBS = -L/work/prj/root-dev/usr/local/lib -lSDL
       SDLFLAGS = /work/prj/root-dev/usr/local/include
其中SDLLIBS和SDLFLAGS标识了SDL库的头文件和库文件所在的目录,我的放在/work/prj/root-dev/usr/local/下,这里顺便说一下,建议在家在移植一些库时,尽量将这些库安装在一个固定的目录下面,方便后面移植其它库时使用,例如我将前面移植的一些基础库全部安装到/work/prj/root-dev/目录下,后面再用时,就不用东找西找了。
3. 源代码修改 luvcview.c
       (1). #include <X11/Xlib.h>
--->>> //#include <X11/Xlib.h>
       (2). static Uint32 SDL_VIDEO_Flags =SDL_ANYFORMAT | SDL_DOUBLEBUF | SDL_RESIZABLE;
--->>> static Uint32 SDL_VIDEO_Flags = SDL_ANYFORMAT | SDL_RESIZABLE;// | SDL_DOUBLEBUF;
       (3). int format = V4L2_PIX_FMT_MJPEG;
--->>> int format = V4L2_PIX_FMT_YUYV;
4. 直接make编译就可以了,然后将luvcview拷到开发板上,插上USB摄像头,运行luvcview就可以在LCD上看到图像了。
****
(1) 注释掉SDL_DOUBLEBUF是因为在luvcview的代码里面没有调用SDL_Flip,所以用双buffer无法显示。如果不想注释掉SDL_DOUBLEBUF,那就需要在主循环里面增加一句
    /* main big loop */
    while (videoIn->signalquit) {
        ……
       
        SDL_Flip(pscreen);
        SDL_Delay(10);
    }
(2) V4L2_PIX_FMT_MJPEG改成V4L2_PIX_FMT_YUYV是因为通过V4L接口取出来的图像数据都是YUV格式的,除非你的摄像头支持mjpeg格式。当然也可以不修改源码,而在运行luvcview时增加一个参数运行,如:./luvcview -f yuv

 

 

 

原创粉丝点击