实验日期: 2024 年 11 月 12 日 报告退发 (订正 、 重做)
一、实验目的
1、掌握摄像头查看工具v4l2-ctl的使用 ;
2、掌握通过V4L2接口使用C代码读取usb摄像头图片的方法;
二、实验内容
1、启动嵌入式Linux开发宿主主机Ubuntu12.04, 使用root帐号登录;
2、配置Ubuntu12.04 Linux虚拟机连接上网,通过apt-get安装v4l-utils工具包,并测试图片显示工具display、gpicview图片查看工具命令的使用,如果缺少gpicview命令,可以通过apt安装gpicview包、
4、使用gcc编译v4l2-yuyv-nmap、v4l2-mjpeg-nmap两份代码,阅读并查看代码,使用代码比较软件”Beyond Compare”尝试比较两个代码的区别,了解V4L接口读取图片的两种不同格式代码的调用方法。
5、阅读并编译运行v4l2-yuyv-nmap代码,捕获一张YUYV格式图片,使用windows下的yuv图片查看工具yuvplayer.exe查看捕获后的YUYV图片。
6、阅读并编译运行v4l2-mjpeg-nmap代码,看能否正常捕获一张JPEG格式的图片,检查能否正常显示。
三、实验环境
安装有vmware软件的window主机,Ubuntu12.04 Linux虚拟机,USB摄像头一个。
四、实验步骤
(描述实验步骤及中间的结果或现象。在实验中做了什么事情,怎么做的,发生的现象和中间结果)
1、启动嵌入式Linux开发宿主主机Ubuntu12.04, 使用root帐号登录;
1)、安装v4l2开发库
apt-get install libv4l-dev
apt-get install v4l-utils
apt-get install gpicview
apt-get install imagemagick
- 在Ubuntu12.04中,接入USB 接口的摄像头(Sony PS3 EYE或者罗技C270或者其他),执行dmesg、lsusb 、v4l2-ctl找出相关的摄像头硬件及其性能信息,在/dev/目录中找出对应的摄像头设备名。
- dmesg结果(部分截图):
-
- lsusb:
- 使用gcc编译v4l2-yuyv-nmap、v4l2-mjpeg-nmap两份代码,阅读并查看代码,使用代码比较软件”Beyond Compare”尝试比较两个代码的区别,了解V4L接口读取图片的两种不同格式代码的调用方法。
两段代码的主要区别:
- 像素格式设置:
- 在第一段代码(v4l2-mjpeg-nmap)中,像素格式被设置为V4L2_PIX_FMT_MJPEG,这意味着摄像头将以Motion JPEG格式输出图像。
- 在第二段代码(v4l2-yuyv-nmap)中,像素格式被设置为V4L2_PIX_FMT_YUYV,这是一个平面格式,其中YUV分量交错存储。
- 文件保存扩展名:
- 第一段代码保存的文件扩展名为.jpg,这与Motion JPEG格式相匹配。
- 第二段代码保存的文件扩展名为.yuyv,这与YUYV格式相匹配。
- 阅读并编译运行v4l2-yuyv-nmap代码,捕获一张YUYV格式图片,使用windows下的yuv图片查看工具yuvplayer.exe查看捕获后的YUYV图片。
- 编译运行v4l2-yuyv-nmap代码,捕获一张YUYV格式图片
-
- 使用windows下的yuv图片查看工具yuvplayer.exe查看捕获后的YUYV图片
- 常规查看yuyv V4L抓取的图片,设置分辨率为640 480 ,格式选YUYV
- 阅读并编译运行v4l2-mjpeg-nmap代码,看能否正常捕获一张JPEG格式的图片,检查能否正常显示。
- 编译运行v4l2-mjpeg-nmap代码(见上题)
- 检查能否正常显示:不能,缺少Huffman编码表
五、实验结果与讨论
(描述最终得到的结果,并进行分析说明,可能的误差原因)
在本次Linux V4L摄像头图片捕获实验中,我们成功完成了以下目标:
- 工具掌握:我们熟练掌握了v4l2-ctl工具的使用,能够查询摄像头的硬件信息和性能参数。
- 软件安装:我们成功在Ubuntu 12.04虚拟机上安装了v4l-utils工具包和gpicview图片查看工具,这些工具对于摄像头操作和图片查看提供了便利。
- 摄像头识别:我们通过执行dmesg、lsusb和v4l2-ctl命令,成功识别了连接到Ubuntu系统的USB摄像头,并找到了对应的设备文件(如/dev/video0)。
- 代码编译与比较:我们使用gcc编译了v4l2-yuyv-nmap和v4l2-mjpeg-nmap两份代码,并使用Beyond Compare软件比较了两者的区别。我们发现主要区别在于像素格式的设置和文件保存的扩展名。
- YUYV格式图片捕获:我们成功运行v4l2-yuyv-nmap代码,捕获了YUYV格式的图片,并使用Windows下的yuvplayer.exe工具查看了捕获的图片,验证了代码的正确性。
- JPEG格式图片捕获:我们尝试运行v4l2-mjpeg-nmap代码捕获JPEG格式的图片,但发现无法正常显示。分析原因可能是缺少Huffman编码表,导致JPEG图片无法被标准图像查看器识别。
- 可能的误差原因:
- JPEG格式问题:JPEG图片无法显示可能是由于摄像头输出的JPEG数据不完整或格式不正确,缺少必要的Huffman编码信息,导致图片无法被解码。
- 摄像头驱动或兼容性问题:某些摄像头可能与V4L2接口的兼容性不佳,导致无法正确捕获或显示特定格式的图片。
- 代码实现问题:代码中可能存在逻辑错误或对V4L2接口的使用不当,导致无法正确处理摄像头数据。
六、总结
(说明实验过程中遇到的问题及解决办法;新发现或个人的收获;未解决/需进一步研讨的问题或建议新实验方法等)
- 实验过程中遇到的问题及解决办法:
问题:JPEG图片无法正常显示。
解决办法:我们通过分析代码和查阅资料,发现问题可能出在Huffman编码上。我们计划进一步研究JPEG的编码原理,并尝试实现自己的JPEG解码器或者使用支持JPEG解码的库。
- 新发现或个人的收获:
- 学会了如何使用v4l2-ctl工具和如何通过V4L2接口编程捕获摄像头图片。
- 了解了YUYV和JPEG两种不同格式的图像捕获方法和区别。
- 学会了如何使用代码比较工具来分析和比较代码。
- 未解决/需进一步研讨的问题或建议新实验方法:
- JPEG图片的Huffman编码问题需要进一步研究,以便能够正确捕获并显示JPEG格式的图片。
- 可以考虑使用其他图像处理库,如OpenCV,来进行图像捕获和处理,可能会有更好的效果。
- 对于JPEG图片的Huffman编码问题,可以深入研究JPEG的编码原理,并尝试实现自己的JPEG解码器。
- 建议进行更多的实验,以测试不同摄像头和不同环境条件下的图像捕获效果,以便更好地理解V4L2接口和摄像头的工作机制。