最近项目中使用到ov9650的摄像头,但是原驱动是个简单字符设备,不支持ioctl切换编码方式和分辨率。
驱动中默认是用的是 p通道,即预览通道,支持的最发分辨率为640*512. 如果强行修改参数,最后的结果是系统停止响应,抓取的图片也是不完整的.
但是ov9650物理器件上支持130万像素,则原驱动并没有发挥其的最大性能,所以果断的只能修改驱动了。
让其支持通过c通道输出,其支持的分辨率为4096*4096,这下对于1280*1024来说,就足够用了。
驱动,国外有团体已经改写成支持v4l2 形式的驱动了。连接地址http://code.google.com/p/s3c2440camera/downloads/list
我是下载源码后编译的。编译过程中遇到的是小麻烦,倒是不怎么费时间。
其中包含测试代码,我就是根据测试代码进行修改的。 测试代码中把Y部分和uv部分分开存储了,其实写入一个文件就正好。
图像编码这一块,只识得rgb,对yuv并没有太多的了解,了解到yuv444,yuv420等等,还有打包模式..
自己去实践一下,很快就能理解了。
图像采集的默认输出格式也说了,是yuv422p。
在文件s3c2440cammif.c 中的代码 赋值 pcam->v2f.fmt.pix.pixelformat= V4L2_PIX_FMT_YUV42P.
下面的连接时对宏定义说明的比较清楚。
http://lxr.free-electrons.com/source/include/uapi/linux/videodev2.h#L327
320 #define V4L2_PIX_FMT_YVU410 v4l2_fourcc('Y', 'V', 'U', '9') /* 9 YVU 4:1:0 */ 321 #define V4L2_PIX_FMT_YVU420 v4l2_fourcc('Y', 'V', '1', '2') /* 12 YVU 4:2:0 */ 322 #define V4L2_PIX_FMT_YUYV v4l2_fourcc('Y', 'U', 'Y', 'V') /* 16 YUV 4:2:2 */ 323 #define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y', 'Y', 'U', 'V') /* 16 YUV 4:2:2 */ 324 #define V4L2_PIX_FMT_YVYU v4l2_fourcc('Y', 'V', 'Y', 'U') /* 16 YVU 4:2:2 */ 325 #define V4L2_PIX_FMT_UYVY v4l2_fourcc('U', 'Y', 'V', 'Y') /* 16 YUV 4:2:2 */ 326 #define V4L2_PIX_FMT_VYUY v4l2_fourcc('V', 'Y', 'U', 'Y') /* 16 YUV 4:2:2 */ 327 #define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4', '2', '2', 'P') /* 16 YVU422 planar */ 328 #define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4', '1', '1', 'P') /* 16 YVU411 planar */ 329 #define V4L2_PIX_FMT_Y41P v4l2_fourcc('Y', '4', '1', 'P') /* 12 YUV 4:1:1 */
那UV 在前还是在后?
http://blog.youkuaiyun.com/jmq_0000/article/details/7536805#V4L2-PIX-FMT-YUV422P
这篇链接里清清楚楚的说明了其定义
-
V4L2_PIX_FMT_YUV422P ('422P') -- Format with ½ horizontal chroma resolution,also known as YUV 4:2:2. Planar layout as opposed to
V4L2_PIX_FMT_YUYV
自己的测试代码中用到jpeglib库(修改过的,网络上很多,支持从内存中存储图片为jpg形式),这样就可以直接从摄像头中读取数据然后转存成jpg查看了。yuv格式查看是相当的不方便,好不容易搜到一个软件,也是试用期已过的。还是在自己的代码中转吧。
yuv转rgb转换方式网络上也很多。不知道yuv能不能直接存储为jpg图像,我这里是先转换成rgb,然后再存储为jpg的。
最后效果能够出来了,图片也比较清晰,毕竟是1280*1024的,不过底色是绿色的,这个就让我比较纳闷了。
不知道哪里还有问题,等待继续修改了。