电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
Leez P710开发板OpenCV捕获USB摄像头填坑记
分 享
扫描二维码分享
Leez P710开发板OpenCV捕获USB摄像头填坑记
Leez
OpenCV
USB摄像头
xukejing
关注
发布时间: 2019-09-02
丨
阅读: 3324
# 1 问题的发现 最近试用了Leez P710开发板,但是OpenCV读取USB摄像头一直不太顺。 这次使用的摄像头是一款USB摄像头,型号罗技C270i。我发现一个问题,在linaro(Leez原版的debian)镜像下,无法通过VideoCapture capture(摄像头编号,这里是8)读取画面。报错信息如下: ![报错信息](https://cf01.ickimg.com/bbsimages/201908/e0c83c47a2d44a1e54e38d38bdb03ff0.png "报错信息") 过去测试友善之臂RK3399的摄像头很顺利,并没有遭遇过这种问题。这导致我一度怀疑是不是Leez开发板故障了。出于常识,新产品的发布道路肯定不会太一帆风顺,会遗留点BUG等待填坑,试用者在踩到坑的过程中也不必太过沮丧。 我们收到的本来就是新产品P710的测试样品,如果不踩几个坑,那跟正式发布版还有什么区别,坑都踩完了,就体现不出我们芯吧客试用者的意义了,不是吗。 我认为,Leez P710是一款新产品,在试用阶段有些问题是很正常的。我们这些试用者可以从两种角度帮助产品完善。一是提交BUG,等厂家技术修复;二是提出解决方案。 # 2 问题的解决思路 既然OpenCV不能直接捕获video8,有没有其他软件可以读取这个外设的图像呢? 如果别的软件能捕获到图像,是不是可以做个接口把图像再转给OpenCV? 有没有现成的开源软件读取USB摄像头呢?我找了Leez技术交流群里的最热心最助人为乐的大虾——Andy,他教了我用mjpg-streamer。它让我试试能不能用这个读取到图像。Andy已经为我写了一篇教程了(没错,就是特地为我写的,这个牛我又可以吹一年了),大家可以去联想栗子社区围观,顺便也表达一下我们芯吧客社区的感谢。 [https://leez.lenovo.com/forum/forum.php?mod=viewthread&&tid=253](https://leez.lenovo.com/forum/forum.php?mod=viewthread&&tid=253 "https://leez.lenovo.com/forum/forum.php?mod=viewthread&&tid=253") # 3 我的操作过程 我看完Andy的文章,觉得这条路或许走得通,于是尝试着输入了以下命令。 结果。。。。。喜大普奔地翻车了。。。。。 尽信书不如无书,我们应该更加侧重于分析Andy为什么在教程中打出了那几句代码,而不是直接复制黏贴代码本身。 我当时输入的命令是这样的。 ```shell cd /mnt/ud git clone https://github.com/andyshrk/mjpg-streamer.git cd mjpg-streamer/mjpg-streamer-experimental/ apt install cmake libjpeg62-turbo-dev make -j6 ``` Andy提供的make是单线程。而我贪心的输入了make -j6,用6个线程来编译;接着,我气定神闲地按下了回车。 然后,我收到了一堆喜闻乐见的报错。。。。 这是因为我用的是Leez原版的debian镜像(与Andy所用的Armbian不同),少很多依赖库,所以难免地,过程会异常艰辛。 根据一条条报错信息,我依次找到缺少的库,然后用apt安装或搜索。 第一个库比较简单,直接用apt安装就成了 ```shell apt-get install libgphoto2 ``` 继续make,还是报错,提示少SDL。 这一步有些挫折,因为要猜软件包的名字,我连续试了两个名字,都提示不对,还好试第三个名字的时候试出来了。 ```shell apt-get install SDL//提示没有 apt-get install libsdl//提示没有 apt-get install libsdl-dev//总算试出来了 ``` 继续make,又报错少protobuf-c。这把我有经验了,一次就猜对了名字。 ```shell apt-get install libprotobuf-c-dev ``` 如果你实在猜不出软件包的名字,那就只能老老实实地用search搜索了,比如搜protobuf-c的安装包 ```shell apt-cache search protobuf-c ``` 以上软件包的依赖问题都解决后,眼看着都没问题了吧,一make,又提示opencv出错了。原来,我的opencv是用apt安装的,但是版本只有2.4,导致mjpg streamer源代码里有几句语句发生了代码兼容性问题。 于是只好把mjpg streamer对opencv的支持功能给禁用了再编译(这招是Andy教我的,再次表示感谢)。 ```shell cd _build cmake -D PLUGIN_INPUT_OPENCV=OFF .. make make install //这句非必须,但我用了 ``` 以上都不再报错了,成功编译后,我尝试用命令行打开mjpg streamer。 ```shell mjpg_streamer -o "output_http.so -w ./www" -i "input_uvc.so" //这条命令会报错 ``` 果不其然,又报错了。。。。然后,我懒癌发作了,实在是不想看软件手册了,于是又恬不知耻地赖着乐于助人的Andy教我。(Andy表示,这个学生实在是太难带了) Andy也看出我懒癌发作了,但是为了测试一下我的自主学习能力,他还是让我自己去看help命令。 于是我输入了以下命令,查看了各项输入参数的意义。 ```shell mjpg_streamer -i 'input_uvc.so --help' ``` 经过思考,我想出了以下这条命令,确认不会爆炸以后,我颤抖地按下了回车 ```shell mjpg_streamer -o "output_http.so -w ./www" -i "input_uvc.so -d /dev/video8" ``` 成功啦! ![开启mjpgstream](https://cf01.ickimg.com/bbsimages/201908/31f1d3955fdf287a3a45468f6e8738a7.jpg "开启mjpgstream") 用浏览器访问[http://192.168.1.103:8080/?action=stream](http://192.168.1.103:8080/?action=stream "http://192.168.1.103:8080/?action=stream")(这是我的Leez P710的地址)图像捕获正常,流畅无卡顿 ![捕获到图像](https://cf01.ickimg.com/bbsimages/201908/4b5f8d3433bfbff757bde3a3fb9993d9.jpg "捕获到图像") 下面,我想用opencv读取摄像头。怎么办呢? 这时候,我的编程技术终于可以发挥一下了。 既然OpenCV不能直接访问video8,那我们就把脑子活络一下,让OpenCV读取mjpg stream的图像吧。 下面,我们来写个C++代码吧,开始我的表演。 ```cpp #include <iostream> #include <string> #include <stdio.h> #include <stdlib.h> #include "opencv2/opencv.hpp" using namespace cv; using namespace std; int main(int argc, char**argv) { Mat frame; int i=0; VideoCapture cap("http://192.168.1.103:8080/?action=stream"); char filename[256]; while (i < 10) { i++; sprintf(filename, "/mnt/ud/detec/%06d.jpg", i); cap >> frame; imwrite(filename, frame); } return 0; } ``` 上面的代码中,cap变量打开了mjpg stream视频流,对于VideoCapture来说,打开视频流就像打开一个视频文件一样,输入地址就可以。 然后,定义一个filename字符串变量用来生成保存照片的文件名。 接着,依次把捕获图像放入frame变量并保存到照片文件,共捕获10张。 把代码编译并执行 ```cpp g++ -ggdb mycvtest.cpp -o aaaaa `pkg-config --cflags --libs opencv` ./aaaaa ``` 我们可以发现照片被成功捕获到detec目录,且文件名正确 ![捕获得到的照片](https://cf01.ickimg.com/bbsimages/201908/d740ae7661e51d33c76b9b51decc7f16.jpg "捕获得到的照片") 照片可以打开看一下,没问题。 ![具体的照片](https://cf01.ickimg.com/bbsimages/201908/b86eaebef430853fdfbc9317accd2801.jpg "具体的照片") 至此,opencv读取USB摄像头时成功了。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
1
)
xukejing
擅长:其他应用
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交