1. UVC,V4L2, H.264有什么关系
理解基本正确,但是不够准确。准确的来说:
UVC是一种usb视频设备驱动。用来支持usb视频设备,凡是usb接口的摄像头都能够支持
V4L2是linux下的视频采集框架。用来统一接口,向应用层提供API
H.264是一种视频编码技术。用来压缩原始图像,以方便存储
2. 怎样在嵌入式Linux系统中使用摄像头
我觉得linux下无论是USB也好,网卡也好,你的摄像头也好,入门首先要做得就是驱动,因为这些东西最基本的地方就在于驱动程序的设计,而现在网上有关驱动的源码相当成熟,无论是USB还是摄像头,都有可执行的C代码,(可能因为linux是开源的缘故),接下来我建议你做的就是下载下经典的驱动源码,然后简化之,将不是必须的、附加的模块去掉,这个过程一开始是很痛苦的,但是它最大的好处是通过你的删减过程你会完全了解该驱动的构架,最最基本的构架,你会明白摄像头驱动所需要的所有模块,这样底层的东西明了了,上层的模块化设计、接口定义都能做到有的放矢
3. 想学习Linux 驱动,需要什么知识
首先,接触linux操作系统,在你的电脑上装一个linxu操作系统(建议ubuntu,比
较友好),熟悉经常要用的命令,熟悉环境(建议看“鸟哥的linux私房菜”)。
其次,阅读经典书籍是不可少的,建议先看ldd前四章,大概了解linux驱动的框架
,驱动是做什么的,该如何写驱动,那本书上有一些例子,可以在你的电脑上编译
,执行看看。后面的章节在结合自己的情况而定。
第三,建议阅读ulk(understanding the linux kernel)所有的内容,了解linux
内核的一些基本知识,在心中建立一个框架,不必完全懂,深入了解就好,以后经
常翻翻,受益无穷!
第四,别着急,这才是你真的进入linux驱动的第一步,花点钱买个开发板吧,然
后了解代码的编译,下载,看看板子的datasheet,针对自己感兴趣的深入研究。
建议学习流程,led灯控制---tp---i2c总线-----lcd-----camera----flash----
wifi/bt等。因为这个里面牵涉了甚多内核的子系统(input,v4l2,fb等
),所以可能要多话时间看代码,了解代码的框架,设计的思想等,只要一步一个
脚印,一定会有所成。
第五,因为现在的移动设备大多数都是android的了,所以你就要看看linux
kernel在android的作用,然后往上看看,看看hal层的代码,这些在调试中都是需
要的,如果有兴趣,更加可以看看framework的代码了,学习android一些工作机制
,类似于surfaceflinger,audioflinger等等。。
《linux就该这么学》免费提供最新Linux技术教程书籍,为开源技术爱好者努力做
得更多更好
4. v4l2写opencv有什么联系吗,做嵌入式视频识别开发应先学什么
V4L2 (video 4 linux 2)是 linux系统中的视频驱动
所以,你的opencv应该在嵌入式系统中使用
Qt 号称多系统兼容,
那么 你搭建一个 linux pt opencv 的环境就可以了
5. 如何在Linux下开发摄像头驱动
在linux下所有设备都是文件。所以对摄像头的操作其实就是对文件的操作。USB摄像头的设备文件就是在/dev目录下的video0(假如只有一个摄像头)。在linux下操作摄像头就是使用v4l2对摄像头进行视频的操作,操作步骤如下
1. 打开设备文件。
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:
//……
}
6. 如何查看linux是否支持v4l2
它于2002年11 月,发布2.5.46 时,融入了内核主干之中。然而直到今天,仍有一部分内核驱动不支持新的API,这种新旧API 的转换工作仍在进行。同时,V4L2 API也在发展,并在2.6.18 版本中进行了一些重大的改变。支持V4L2的应用依旧相对较少。V4L2在设计时,是要支持很多广泛的设备的,它们之中只有一部分在本质上是真正的视频设备
7. Android 开发,使用ndk调用v4l2来读取Android摄像头的数据靠谱吗
一、用NDK进行C代码的调取(已熟悉此调取技术)
二、摄像头的获取,这个不能用SDK来调,因为用SDK来调头部跟踪程序很难获得我们的
数据,也不大能考虑AIDL跨进程通信的方案,因为这样数据交互可能太慢。
问题:
头部跟踪移植到Android系统中,跟踪程序需通过核心程序(C实现)调取Camera而不是通过Android SDK进行调取Camera。
前提:
Android的四个层次如下,
一个完成的Android应用,一般都是有java框架的,虽然NDK(Native Development Kit,一系列工具的集合)提供了一系列的工具,帮助开发者快速开发 C (或 C++ )的动态库,并能自动将 so 和 java 应用一起打包成 apk 。但是NDK 并没有提供各种系统事件处理支持,也没有提供应用程序生命周期维护。此外,在本次发布的 NDK 中,应用程序 UI 方面的 API 也没有提供。至少目前来说,使用纯 C 、 C++ 开发一个完整应用的条件还不完备。所以,就目前来说,必须依赖上层Java框架的支持。
解决方案:
初步考虑有三种方式可以实现:
一、由于Android是运行在Linux上的,所以可以考虑让C程序调V4L2
接口来获取摄像头数据。Video4linux2(简称V4L2),是linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video0下。,不过可移植性差,因为不同厂家的设备驱动接口可能不完全一样,另外也要求开发者熟悉Linux内核编译。
二、SDK获取摄像头数据,再用JNI调C来处理图像,也就是使用JNI来调取跟踪程序并进行数据交互。
三、通过查看Android系统的底层代码,发现Android系统调摄像头也是通过JNI编程来实现的,所以考虑到是否能在JNI调用的Android底层Camera的底层流程中增加一步添加自己的业务逻辑。具体表现在调取Camera之前先启动头像识别程序,让头像识别程序去调Camera设备并获得进行数据交互,比如可以考虑在人像识别中调取android_hardware_Camera.cpp。Camera进程机制如下图:
在Android中,Camera的代码主要在以下的目录中:
Camera的JAVA程序的路径:packages/apps/Camera/src/com/android/camera/
在其中Camera.java是主要实现的文件
Camera的JAVA本地调用部分(JNI):
frameworks/base/core/jni/android_hardware_Camera.cpp
这部分内容编译成为目标是libandroid_runtime.so
。
Camera底层库在以下的目录中:
frameworks/base/libs/ui/
这部分的内容被编译成库libui.so。
Camera服务部分:
frameworks/base/camera/libcameraservice/
这部分内容被编译成库libcameraservice.so。
为了实现一个具体功能的Camera,在最底层还需要一个硬件相关的Camer库(例如通过调用video for linux驱动程序和Jpeg编码程序实现)。这个库将被Camera的服务库libcameraservice.so调用。
在 Camera系统的各个库中,libui.so位于核心的位置,它对上层的提供的接口主要是Camera类,类 libandroid_runtime.so通过调用Camera类提供对JAVA的接口,并且实现了android.hardware.camera 类。 libcameraservice.so是Camera的服务器程序,它通过继承libui.so的类实现服务器的功能,并且与libui.so中的另外一部分内容则通过进程间通讯(即Binder机制)的方式进行通讯。
libandroid_runtime.so和libui.so两个库是公用的,其中除了Camera还有其他方面的功能。
特别说明:Camera在模拟器上无法运行,以上所述方案暂时不能做测试,而且底层调取Camera属于系统开发和嵌入开发的范畴,需要的知识面比较广,我也只是在初步研究中,以上所述,如有错误,还请批评指正及包涵。
8. usb摄像头struct v4l2_capability 中的capabilities参数结果是0x4000001代表了什么
查看摄像头驱动的头文件定义,里面有宏定义说明各个值代表的意思
我只有Linux的V4L2内核驱动 /linux-xx.xx.xx/include/linux/Videodev2.h
你自己看下吧
/* Values for 'capabilities' field */
#define V4L2_CAP_VIDEO_CAPTURE 0x00000001 /* Is a video capture device */
#define V4L2_CAP_VIDEO_OUTPUT 0x00000002 /* Is a video output device */
#define V4L2_CAP_VIDEO_OVERLAY 0x00000004 /* Can do video overlay */
#define V4L2_CAP_VBI_CAPTURE 0x00000010 /* Is a raw VBI capture device */
#define V4L2_CAP_VBI_OUTPUT 0x00000020 /* Is a raw VBI output device */
#define V4L2_CAP_SLICED_VBI_CAPTURE 0x00000040 /* Is a sliced VBI capture device */
#define V4L2_CAP_SLICED_VBI_OUTPUT 0x00000080 /* Is a sliced VBI output device */
#define V4L2_CAP_RDS_CAPTURE 0x00000100 /* RDS data capture */
#define V4L2_CAP_VIDEO_OUTPUT_OVERLAY 0x00000200 /* Can do video output overlay */
#define V4L2_CAP_HW_FREQ_SEEK 0x00000400 /* Can do hardware frequency seek */
#define V4L2_CAP_RDS_OUTPUT 0x00000800 /* Is an RDS encoder */
#define V4L2_CAP_TUNER 0x00010000 /* has a tuner */
#define V4L2_CAP_AUDIO 0x00020000 /* has audio support */
#define V4L2_CAP_RADIO 0x00040000 /* is a radio device */
#define V4L2_CAP_MODULATOR 0x00080000 /* has a molator */
#define V4L2_CAP_READWRITE 0x01000000 /* read/write systemcalls */
#define V4L2_CAP_ASYNCIO 0x02000000 /* async I/O */
#define V4L2_CAP_STREAMING 0x04000000 /* streaming I/O ioctls */
9. linux3.0.1内核有v4l2驱动吗
Linux3.0有V4L2驱动,视频采集测试请参考我们的多媒体测试程序,另外音频部分我们采用的是ALSA价格,ALSA架构里面提供了OSS API支持,可以兼容使用OSS的上层程序,我们的Qtopia2.2.0音频部分就是使用的OSS API调用,可以实现音频播放和录音功能。
10. Linux v4l2图片采集问题
源码中:
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
ioctl (fd, VIDIOC_S_FMT, &fmt);
指定了采集图像的格式为YUYV格式。
要像采集成JPEG图像,得查询一下摄像头是否有相应功能,如果没有相应功能即使将fmt设置为jpeg最终采集到的还是yuyv格式。
yuyv可以转换为bmp数据,然后调用jpeglib库转换为jpg图像,稍稍有些麻烦,但没办法硬件不足就要用软件来弥补了。
至于你说的read没读到数据,我现在没有开发环境,没法测试。