本篇介绍USB摄像头的使用,实现的功能是通过摄像头进行拍照,生成jpg格式图片。
2.环境介绍2.1.硬件1) NUC972开发板
2) USB摄像头
2.2.软件1) Uboot继续使用之前文章用的,无须改动。
2) Kernel在上一篇基础上,要做一定的修改,用来支持USB摄像头识别。
3) Rootfs在上一篇用Buildroot生成的基础上,无须改动。
3.内核配置Linux 内核中已经包含了USB摄像头的驱动,只要勾选上相关配置即可。
Device Drivers -->
<*> Multimedia support --->
[*] Cameras/video grabbers support
<*> V4L2 int device (DEPRECATED)
[*] Media USB Adapters --->
<*> USB Video Class (UVC)
[*] UVC input events device support (NEW)
<M> GSPCA based webcams (NEW) --->
<*> USB Philips Cameras
[ ] USB Philips Cameras verbose debug (NEW)
[*] USB Philips Cameras input events device support (NEW)
<*> CPiA2 Video For Linux
<*> USB ZR364XX Camera support
<*> USB Syntek DC1125 Camera support
<*> USB Sensoray 2255 video capture device
<*> USB SN9C1xx PC Camera Controller support (DEPRECATED)
[*] V4L platform devices --->
配置完,保存,编译,之后下载到板子里。
插入USB摄像头,打印信息如下:
说明驱动已经OK了。
4.libjpeg库安装之前buildroot编出来的根文件系统里是有jpeglib库的,版本是libjpeg.so.9.1.0,由于我们应用程序依赖的版本是8.0,所以单独编译了一个。
步骤如下:
1) 解压jpegsrc.v8b.tar.gz
2) 进入到解压后的jpeg-8b目录里,执行
./configure CC=arm-linux-gcc LD=arm-linux-ld --host=arm-linux --prefix=/home/topsemic/nuc972/toolchain/arm_linux_4.8/usr --exec-prefix=/home/topsemic/nuc972/toolchain/arm_linux_4.8/usr
其中:
–prefix参数是强制设定install之后生成文件的存放目录,这里将其放到了交叉编译工具链文件夹的/usr 目录下,放到这里的原因是因为后面编译应用程序时会在交叉工具链的目录下查找相关的库。
topsemic@topsemic-virtual-machine:~/nuc972/tool/jpeg-v8b/jpeg-8b$ ./configure CC=arm-linux-gcc LD=arm-linux-ld --host=arm-linux --prefix=/home/topsemic/nuc972/toolchain/arm_linux_4.8/usr --exec-prefix=/home/topsemic/nuc972/toolchain/arm_linux_4.8/usr
3)make 编译
topsemic@topsemic-virtual-machine:~/nuc972/tool/jpeg-v8b/jpeg-8b$ make
4)最后make install
topsemic@topsemic-virtual-machine:~/nuc972/tool/jpeg-v8b/jpeg-8b$ make install
在/home/topsemic/nuc972/toolchain/arm_linux_4.8/usr/lib下生成相应的库。
注:之前buildroot生成的文件系统里其实已经有了libjpeg,在上面可以看到文件为libjpeg.so.9.1.0,或者我们登陆到板子上
find / -name "libjpeg*" 查找下,在/usr/lib目录下也可以看到
这三者的关系是:
使用ls -al 查看
其中libjpeg.so 和libjpeg.so.9是软连接文件,相当于windows下的快捷方式,如果我们在winscp下查看,可以看到他们的图标上有个箭头
真正使用的库文件是libjpeg.so.9.2.0
5)我们需要将新编译的libjpeg库放到板子上,方法是先把板子上原有的三个文件删掉,然后通过winscp拷贝libjpeg.so.8.0.2到板子的/usr/lib目录下,
最后使用ln -s 源文件 目标文件 命令,新建两个软连接
5.应用程序
应用程序的编译步骤如下:
1) 进入到v4l2_demo目录
2) make编译
3) 生成的可执行文件是bin目录下的mainapp
4) 将其放到板子里,运行结果如下:
# ./mainapp
----------- connected --------------
v4l2_open function open /dev/video0 success!
driver: uvcvideo
card: USB2.0 PC CAMERA
bus_info: usb-nuc970-ehci-2
version: 199276
capabilities: 84000001
Device /dev/video0: supports capture.
Device /dev/video0: supports streaming.
fmt.type: 1
pix.pixelformat: YUYV
pix.width: 640
pix.height: 480
pix.field: 1
Frame buffer 5: address = 0xb6c88000, length = 614400
Frame buffer 5: address = 0xb6bf2000, length = 614400
Frame buffer 5: address = 0xb6b5c000, length = 614400
Frame buffer 5: address = 0xb6ac6000, length = 614400
Frame buffer 5: address = 0xb6a30000, length = 614400
open /dev/video success!
------------- 0
call yuyv_to_rgb function
yuyv_to_rgb function excute OK!
2222222
333333
44444
555555
666666
777777
path3=./jpeg1.jpg 1
8888888
9999999
程序在不断的拍摄并保存图像,图像名称为jpegx.jpeg(x为1,2,3 依次增加)
6.结束语
本篇为大家介绍了Linux下USB摄像头的简单使用,欢迎大家多交流。
TopSemic 让芯片使用更简单
,