关于camera的处理。
参考上面的接口就行了。函数简单易懂,该有的都有了。
v4l2是现在linux下面标准的video的框架了,camera也是使用这个的,
上层的应用软件可以直接使用gstreamer,gstreamer有v4lsrc的
当然也有v4l的sink,不过camera来说,我们都是作为输入的,
v4l的中文的文档也相当多了,
一般desktop上面都可以直接使用gstreamer。pc版本的一些录像软件大多都是使用gstreamer的,
当然也有直接使用v4l的接口的,只是gstreamer是一个框架,可以很方便的使用既有的插件来做一些处理,
比如色彩空间的转换,缩放,旋转,filter等等。可以自由的选择sink,
直接使用v4l的接口的话,直接参考最上面的例子,
有几个需要注意的地方就是。
1:大多数camera所支持的颜色空间都是yuv的,有些是yuv420,有些是yuv422,
当然yuv422也有多种。具体可以参考这里
这些是已经定义的,但是还有一些是没有定义,有些硬件厂家有自己专有的格式。
我们主要需要的操作就是yuv转rgb了。有些硬件直接支持转换,有些就不行。
比如有些设备可以直接把yuv的数据blend到rgb的framebuffer去,这样就很方便了,性能上也提高不少,
提高主要表现在如下几个方面
1:硬件转换
2 :存储空间减少,不用倒腾数据,直接写到framebuffer去了。
我们性能的提高主要就是cpu和内存
至于硬件的转换,总是和硬件相关的,不同的硬件接口不一样。
shader也可以
可以参考
fccyvrgb.php
如果不知道yuv和rgb的区别,可以到网上找找,很多文章的,简单一点描述的话,
就是大多数的摄像机,电视机(早期的吧比如我们小时候看的黑白电视)都是按照yuv模式来运转的,一个y就可以显示出图像了,u,v用来调整这个点的亮度和饱和度。
而计算机这边一直用的是RGB的色彩空间。这个大家应该都知道的。所有的运算也都是使用rgb的。
opengl也都是rgb的,部分厂家有yuv的支持,nvidia的好像就有yuv的支持,比如nv12,nv21,但是这个也不是标准的yuv格式,当然无所谓标准不标准,
如果一个东西用的多,用的广泛也就成了事实上的标准,或者就会被标准化。
除了这两种颜色空间还有不少其他的颜色空间,可以参考计算机图形学上面的一些知识,比如<计算机图形学opengl描述>一般的图形学的书上面都会讲到这些
yuv转rgb都是浮点的,所以pc cpu算也是比较慢的,
就算转成定点,也不够快,这些还是交给显卡处理比较好,
计算机说白了还是输入,中央处理,输出这些逻辑。
现在的图形处理来说,用的比较多的也就是图形运算,多媒体处理,
图形运算主要是一些,像素运算,图形学的运算(blend),矢量图形生成,
多媒体这边,一般就是输入图形,camera,扫描仪,视频音频处理(比如看电影,视频压缩编码解码等等)
通信,
这个代码已经很简单了,应该不用怎么说了,一个简单的应用的话,我们改一下image的处理部分就行了,
比如我们把yuv的转成rgb的然后输出到屏幕上面,
1:yuv转rgb上面已经说了,可以使用cpu或者shader来算。
2:输出部分,如果已经转成了RGB,我们可以直接使用xputimage,或者xvputimage等等输出到一个window里面,当然也可以直接输出到framebuffer
看需求了。另外就是rgb是分多种的,比如rgb565,rgb888等等,如果是写到framebuffer,需要是和framebuffer一样的格式。如果是灰度的framebuffer,则需要把rgb
再转成灰度图像,至于rgb怎么转灰度,google上可以找到很多,baidu也能找到一些,不过广告太多了,垃圾信息居多。
如果系统支持xvideo,那么我们可以直接输出yuv的数据,
xvideo的输出机制之前好像已经说过了,再简单描述一下,
我们可以查询系统里面xvideo是否支持,支持哪些格式
以我的pc来说
ailantian@vax:~$ xvinfo
X-Video Extension version 2.2
screen #0
Adaptor #0: "NV17 Video Texture"
number of ports: 32
port base: 280
operations supported: PutImage
supported visuals:
depth 24, visualID 0x21
depth 24, visualID 0x24
depth 24, visualID 0x25
depth 24, visualID 0x26
depth 24, visualID 0x27
depth 24, visualID 0x28
depth 24, visualID 0x29
depth 24, visualID 0x2a
depth 24, visualID 0x2b
depth 24, visualID 0x2c
depth 24, visualID 0x2d
depth 24, visualID 0x2e
depth 24, visualID 0x2f
depth 24, visualID 0x30
depth 24, visualID 0x31
depth 24, visualID 0x32
depth 24, visualID 0x33
depth 24, visualID 0x34
depth 24, visualID 0x35
depth 24, visualID 0x36
depth 24, visualID 0x37
depth 24, visualID 0x38
depth 24, visualID 0x39
depth 24, visualID 0x3a
depth 24, visualID 0x3b
depth 24, visualID 0x3c
depth 24, visualID 0x3d
depth 24, visualID 0x3e
depth 24, visualID 0x22
depth 24, visualID 0x3f
depth 24, visualID 0x40
depth 24, visualID 0x41
depth 24, visualID 0x42
depth 24, visualID 0x43
depth 24, visualID 0x44
depth 24, visualID 0x45
depth 24, visualID 0x46
depth 24, visualID 0x47
depth 24, visualID 0x48
depth 24, visualID 0x49
depth 24, visualID 0x4a
depth 24, visualID 0x4b
depth 24, visualID 0x4c
depth 24, visualID 0x4d
depth 24, visualID 0x4e
depth 24, visualID 0x4f
depth 24, visualID 0x50
depth 24, visualID 0x51
depth 24, visualID 0x52
depth 24, visualID 0x53
depth 24, visualID 0x54
depth 24, visualID 0x55
depth 24, visualID 0x56
depth 24, visualID 0x57
depth 24, visualID 0x58
depth 24, visualID 0x59
number of attributes: 7
"XV_SET_DEFAULTS" (range 0 to 0)
client settable attribute
"XV_ITURBT_709" (range 0 to 1)
client settable attribute
client gettable attribute (current value is 0)
"XV_SYNC_TO_VBLANK" (range 0 to 1)
client settable attribute
client gettable attribute (current value is 1)
"XV_BRIGHTNESS" (range -1000 to 1000)
client settable attribute
client gettable attribute (current value is 0)
"XV_CONTRAST" (range -1000 to 1000)
client settable attribute
client gettable attribute (current value is 0)
"XV_SATURATION" (range -1000 to 1000)
client settable attribute
client gettable attribute (current value is 0)
"XV_HUE" (range -1000 to 1000)
client settable attribute
client gettable attribute (current value is 0)
maximum XvImage size: 2046 x 2046
Number of image formats: 4
id: 0x32595559 (YUY2)
guid: 59555932-0000-0010-8000-00aa00389b71
bits per pixel: 16
number of planes: 1
type: YUV (packed)
id: 0x32315659 (YV12)
guid: 59563132-0000-0010-8000-00aa00389b71
bits per pixel: 12
number of planes: 3
type: YUV (planar)
id: 0x59565955 (UYVY)
guid: 55595659-0000-0010-8000-00aa00389b71
bits per pixel: 16
number of planes: 1
type: YUV (packed)
id: 0x30323449 (I420)
guid: 49343230-0000-0010-8000-00aa00389b71
bits per pixel: 12
number of planes: 3
type: YUV (planar)
ailantian@vax:~$
支持这四种,
Number of image formats: 4
id: 0x32595559 (YUY2)
guid: 59555932-0000-0010-8000-00aa00389b71
bits per pixel: 16
number of planes: 1
type: YUV (packed)
id: 0x32315659 (YV12)
guid: 59563132-0000-0010-8000-00aa00389b71
bits per pixel: 12
number of planes: 3
type: YUV (planar)
id: 0x59565955 (UYVY)
guid: 55595659-0000-0010-8000-00aa00389b71
bits per pixel: 16
number of planes: 1
type: YUV (packed)
id: 0x30323449 (I420)
guid: 49343230-0000-0010-8000-00aa00389b71
bits per pixel: 12
number of planes: 3
type: YUV (planar)
也是xorg里面标准的4种,当然可以支持更多,需要在驱动里面实现,具体怎么实现请参考之前xvideo实现的文档。
现在我们支持yuy2了,实际上很多camera就是直接输出yuy2的数据的,我们可以直接使用xvideo输出到屏幕上面
至于输出的流程,实际上还是要转换的,只不过gpu做了这个转换,至于gpu怎么做的转换,有些gpu有这样的硬件单元。
如果是其他的格式,比如camera要是输出yuy2,但是我们的显卡不支持,但是支持nv12,
我们可以先把camera这边的数据转换成nv12,然后再显示出去,
注意pack的时间是比较短的,并且可以使用cpu汇编优化,但是yuv转rgb和scale的时间是很长的,所以我们还是尽量使用硬件支持的。
关于xvideo的更多介绍请看之前的文章。
v4l也是可以做输出的,camera是做输入的例子,
做输出的例子,可能大家见到的比较少,不过有些厂家会使用v4l来做输出。
比如xxxxx,他们使用v4l来做高清解码视频的输出。
看,gstreamer也可以使用video2linux来做sink的。
ailantian@vax:/usr/lib/gstreamer-0.10$ gst-inspect-0.10 |grep video4
video4linux: v4lsrc: Video (video4linux/raw) Source
video4linux2: v4l2sink: Video (video4linux2) Sink
video4linux2: v4l2src: Video (video4linux2) Source
ailantian@vax:/usr/lib/gstreamer-0.10$
关于定点和浮点的选择,恩,怎么说呢,如果性能允许的话,浮点吧,opengl里面都是浮点,如果用定点运算,然后传递给opengles一些参数,
后来你就会发现误差大到眼睛能够看出来。clutter以前都是定点的,现在也都有浮点了,额,总之定点运算的误差太大了,记得clutter用的是0->65535来模拟的0->1
但是很多算法你就会发现,正向运算之后你再逆向算回来的时候就差了很多。
阅读(2062) | 评论(0) | 转发(0) |