在真正开始编写程序前,我作了大量工作,包括了解Linux支持的摄像头类型、Linux摄像头驱动程序、摄像头采集模型,等等,——当然,还包括去买个摄像头。网上流行的是gspca驱动以及一些老式摄像头的程序,这些摄像头目前市面上比较难找了。而且驱动、应用程序的安装也比较麻烦。此外,网上能搜索到的资料绝大部分均为转载而不注明出处,因此许多资料十分相似。而且许多资料都是介绍基本的流程,每当涉及到关键算法及代码时,均一句话带过。因此,只参考网上资料很难写出一个可能使用的程序。
我相信网上有许多人已经做出来了,不过我未查到能直接使用的程序。因此我决定将我所做的一切公布出来,——这是我的习惯,每当遇到难题而别人没有解决(或自己找不到牛人帮忙),我都会由着自己的性子将解决问题的过程写出来。这不是为了炫耀自己的能力,而是心中有一种怨气,觉得不爽,需要找个地方(用某种方式)发泄一下(下面讲到的那篇文章中,其实我已经删除了部分文字)。
我以“嵌入式 Linux 视频采集”等为关键字查阅许多期刊、论文(在学校的一大好处是可以免费下载万方的期刊、论文),但这些文章都是在一个很高很抽象的层次来讲解,动不动就涉及到系统设计、框架,如果想找点能使用的代码,基本上没有。当然,这是论文的最大特色。但是,我们还没有达到那么高的层次,我们需要的是代码,真正能使用的代码。
经过一段时候的搜索,我终于知道了一些专业名词,比如“UVC”、“V4L2”等,也看了一些介绍视采集的介绍。不过我还是有选择地查阅了V4L2官方的文档,将其中一些用得到的章节反复看几次。我曾一时心血来潮想翻译这个文档,甚至还到论坛上发帖想跟别人一起翻译,然而由于能力及时间问题,还是没有做成这件事(当时翻译了一些IBM developerworks上的文章,有点上瘾了)。这个时候,我发现网上那些号称xx的程序,不过是人家文档中给出的例子,——有意思的是,这个例子中处理图像的函数是空函数。同时,我找到了一个叫luvcview的开源项目,并阅读其中的代码,不过由于一些处理函数太过复杂,自己没能力理解(比如huffman、rgb、yuyv这些东西)。后面将这个项目中采集及显示的部分抽出来,自己整理,成为自己的程序——从中可以看到,这是站在别人肩膀上得到的结果。但不可否认,这中间有我的心血。
这次重新修改以前的代码,由于在编码风格上下了比较大的力气,因此还算顺利,没有遇到连自己也不认识的函数、变量名。此外,为了方便doxygen生成文档,在doxygen风格的注释中使用了中文。大部分相关的源代码文件使用了”UFT-8 无BOM格式编码“保存(实际使用的编辑器为notepad++)。注释也不是一件好差事,它也要讲究技巧及内容。当然,在发布之前必须做一些测试,至少要保证在自己的平台中测试没有问题才敢发布。下面是测试的环境:
虚拟机fc10
内核版本:
[latelee@latelee camera-pc-utf]$ uname -a
Linux latelee.latelee.org 2.6.27.5-117.fc10.i686 #1 SMP Tue Nov 18 12:19:59 EST 2008 i686 i686 i386 GNU/Linux
SDL版本:
[latelee@latelee camera-pc-utf]$ rpm -q "SDL"
SDL-1.2.13-6.fc10.i386
glibc版本:
[latelee@latelee camera-pc-utf]$ rpm -q "glibc"
glibc-2.9-2.i686
gcc版本:
[latelee@latelee camera-pc-utf]$ gcc --version
gcc (GCC) 4.3.2 20081105 (Red Hat 4.3.2-7)
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software ; see the source for copying conditions. There is NO
warranty ; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.