查看: 8223|回复: 3

调用V4L2 API使用USB摄像头截图的程序 C语言

[复制链接]
  • TA的每日心情
    开心
    2015-4-19 12:59
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2015-2-4 23:37:22 | 显示全部楼层 |阅读模式
    分享到:
    自从大学随着兴趣做了几个单片机和arm的小DIY之后就没有接触过c语言了,这两年一直在搞java和c#,现在编c语言的程序还得经常百度各种用法,虽然会用python但是感到对底层api不了解的话难以根治这个帖子中的问题,所以决定写一个c语言的程序研究一下v4l2。
    这个程序还会更新,分享出来是因为网上代码虽然很多但是比较杂乱而且没有注释(对大神来说扫一眼就能看明白么??),也没有按照结构分块。希望能帮助到需要帮助的人,顺便希望如果高手们有空的话能给我一些指点。
    说说这两天的心得:
    因为希望在windows上完成开发和调试,经过各种查找发现Visual Studio+WinGDB还是蛮好用的,这里有关于安装和配置的教程
    调试的时候如果想看到printf的数据,可以这样-在菜单栏WinGDB下选择Show process console。

    现在遇到的问题:
    我用的摄像头是罗技C270,测试V4L2对它只支持MJPEG和YUYV格式。
    使用YUYV格式截图,截图格式是*.ppm  写到这里想到是不是MJPEG格式就能截成jpg了呢???
    貌似截图成*.ppm需要用fprint写个文件头(是应该这么叫吧)
    fprintf(file_fd, "P6\n%d %d\n 255\n",imageWidth, imageHeight);
    网上有的例程没有这一句,干脆打不开截图。
    现在截图是附件中这种效果,我 觉得 是在读写buffer的时候哪里有问题,但buffer操作算是我比较薄弱的部分
    希望能得到指点


    不知道程序是这样分成几个文件方便大家参考阅读还是合成一个.c比较好?觉得一个文件好的话回复一下,我合并一下再传一份传上来。

    每次编辑帖子都要重新审核,不知道什么级别能直接发出来帖子?????

    下面附上一般操作流程
    ① 打开设备文件。 int fd=open(”/dev/video0″,O_RDWR)。
    ② 取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。命令VIDIOC_QUERYCAP,结构体struct v4l2_capability。
    ③ 设置视频的帧格式,帧的格式个包括宽度和高度等。命令VIDIOC_S_FMT,结构体struct v4l2_format。
    ④ 向驱动申请帧缓冲,一般不超过5个。结构体struct v4l2_requestbuffers。
    ⑤ 将申请到的帧缓冲映射到用户空间,直接操作采集到的帧。
    ⑥ 开始视频的采集。命令VIDIOC_STREAMON。
    ⑦ 出队列以取得已采集数据的帧缓冲,取得原始采集数据。命令VIDIOC_DQBUF。
    ⑧ 将缓冲重新入队列尾,这样可以循环采集。命令VIDIOC_QBUF。
    ⑨ 停止视频的采集,命令VIDIOC_STREAMOFF。
    ⑩ 关闭视频设备,close(fd)。


    BufferCam.jpg

    USBCam_V4L2_V0204.rar

    4.02 KB, 下载次数: 22

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2015-4-19 12:59
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

     楼主| 发表于 2015-2-8 21:27:26 | 显示全部楼层
    发现自己犯了个很低级的错误,因为对linux的编译方式不够熟悉。
    在最初移植这个例程的时候,没有按照说明加 -lv4l2,导致编译不过去,之后改写了一下,去掉了各种函数上的v4l2_  (很多其他例程这么做)  编译成功了,但是我发现其中open等函数用的是fcntl.h里面的。运行程序就会出现帖子中的效果。如果gcc -lv4l2就不会有这个问题了,.ppm文件可以直接用phototshop打开,是正常图片了。
    不知道有没有什么特殊写法使得程序在编译的时候不用加-lv4l2这个参数???
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-4-19 12:59
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

     楼主| 发表于 2015-2-10 14:00:12 | 显示全部楼层
    本帖最后由 Edwardwx 于 2015-3-12 09:49 编辑

    最终确定原因:fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB24;
    在生成.ppm格式的时候如果用YUYV就会花
    但是如果要在程序里转换成jpg格式,就得用YUYV格式
    再重新传附件又要审核等很久,代码发到一个Git平台了,需要的可以去下载
    https://coding.net/u/Edwardwx/p/USBCamCapture-on-Raspberry-Pi
    还有另一个视频编码的项目
    https://coding.net/u/Edwardwx/p/Raspberry-PI-Video-Project/git
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-9-4 21:11
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2015-2-22 21:48:53 | 显示全部楼层
    mark
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 15:35 , Processed in 0.144365 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.