前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >实践干货 | 自动化视觉跟踪

实践干货 | 自动化视觉跟踪

作者头像
AI研习社
发布于 2019-08-29 08:27:36
发布于 2019-08-29 08:27:36
1.1K00
代码可运行
举报
文章被收录于专栏:AI研习社AI研习社
运行总次数:0
代码可运行

这次,我们将使用你的设备来帮助相机自动地跟踪某种颜色的物体。

原标题 | Automatic Vision Object Tracking

作者 | Marcelo Rovai

编辑 | Pita

01. 导语

在之前的某个教程里,我们探讨了如何控制Pan/Tilt Servo设备来安置一个PiCam(树莓派的相机)。这次,我们将使用你的设备来帮助相机自动地跟踪某种颜色的物体,像下边的动图里那样:

尽管这是我第一次使用OpenCV,但我必须承认,我已经爱上了这个“开源计算机视觉库”。

OpenCV对学术用途和商业用途都免费。它有C++、C、PythonJava的接口,并且支持WindowsLinuxMacOSiOSAndroid系统。在我的OpenCV教程系列中,我们将专注于使用树莓派(当然,操作系统就是Raspbian了)和Python。OpenCV为高效计算而生,极大地专注于实时应用。因此,它对于物理计算(即使用可以感知和响应模拟世界的软件和硬件来构建交互式物理系统)项目来说,简直再适合不过了!

02. 安装 OpenCV 3 库

我使用的是安装着目前最新的Raspbian版本(Stretch)的树莓派V3。安装OpenCV最好的办法就是按照Adrian Rosebrock的这篇极棒的教程:Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi。

我在我的树莓派上试了好几种不同的OpenCV安装教程,其中Adrian的是最棒的一篇。我建议各位读者一步一步按照这篇教程的步骤做。

当你完成了Adrian的教程后,你的树莓派应该已经安装好了OpenCV的虚拟环境,并且可以进行我们的实验了。

让我们再次检查一下虚拟环境并确认OpenCV 3已经正确安装了。

Adrian建议每次打开新的终端都执行一次“source”命令,从而确保你的系统变量已经正确设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
source ~/.profile

接下来,进入我们的虚拟环境:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
workon cv

如果你看到你的命令提示符之前多了个(cv),那说明你已经进入虚拟环境“cv”了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(cv) pi@raspberry:~$

Adrian强调,Python虚拟环境“cv”是和Raspbian Stretch系统自带的Python版本完全独立的。也就是说,系统Python的site-packages目录中的那些库在虚拟环境“cv”中并不能使用——同样,这个虚拟环境中的包在系统全局的Python版本中也是无法使用的。

现在,Python翻译器,启动!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python

同时,请确认你是用的是Python 3.5版本或者更高版本。

在翻译器中(应该会有“>>>”提示符),导入OpenCV库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2

如果没有出现任何错误信息,说明OpenCV在你的虚拟环境中已经正确安装~

03. 测试你的相机

既然你的树莓派已经安装好OpenCV了,那就先测试一下你的相机是否正常工作吧~(假设你已经在你的树莓派上安装PiCam了)

在你的IDE中输入以下代码:

代码语言:javascript
代码运行次数:0
运行
复制

上述代码将捕获你的PiCam的视频流并使用BGR三色模式和灰度模式显示。

请注意,我的相机在组装过程中是上下颠倒的,所以我把得到的图片垂直翻转了。如果你并没有我的情况,请删掉frame = cv2.flip(frame, -1)那一行。

或者,你可以直接从我的GitHub下载该代码:simpleCamTest.py

要执行我的代码,运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python simpleCamTest.py

要结束程序,请按键盘上的[q]键或[Ctrl]+[C]键。

下图是我的结果:

要学习OpenCV的更多知识,可以参考以下教程:loading -video-python-opencv-tutorial

04. 使用 Python 与 OpenCV 进行颜色检测

我们想做的一件事情就是检测并跟踪某种颜色的物体。为此,我们必须理解一点OpenCV是如何翻译颜色的。

关于颜色检测,Henri Dang写了一篇很棒的教程:Color Detection in Python with OpenCV。

通常,我们的相机是使用RGB颜色模式工作的。RGB颜色模式可以这样认为:我们看到的所有可能的颜色都可以被三种颜色的光(红,绿,蓝)组成。然而,这里我们使用的OpenCV默认是BGR颜色模式,也就是将RGB的顺序进行了调整。

正如以上所述,使用BGR颜色模式,每一个像素可以由三个参数——蓝、绿、红组成。每个参数通常是一个0~255之间的值(或者十六进制下0x00到0xFF)。比如,电脑屏幕上的纯蓝色的BGR值分别为:蓝255,绿0,红0。

OpenCV还使用一种RGB模型的替代——HSV(Hue色相,Saturation色度,Value色值)颜色模型,它是70年代的计算机图形学研究者为了更好地与人类视觉对颜色属性的感知方式相匹配而提出的。

好。如果你想要使用OpenCV跟踪某一种确定的颜色,你必须使用HSV模型定义它。

示例

比如说,我想要跟踪下图中的黄色塑料盒。首先要做的就是找出它的BGR值。你可以用很多办法采样(这里我用的是PowerPoint)。

我这里找到的是:

  • 蓝色:71
  • 绿色:234
  • 红色:213

下面,我们需要将BGR模型(71, 234, 213)转换为HSV模型,这将被定义为上下界取值范围的形式。让我们执行以下代码:

代码语言:javascript
代码运行次数:0
运行
复制

你也可以到GitHub下载我的这段代码:bgr_hsv_converter.py

要执行我的脚本,运行以下命令并把BGR值作为参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python bgr_hsv_converter.py 71 234 213

这个程序将会计算我们目标物体HSV值的上下界。给定以上参数会得到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lower bound: [24, 100, 100]

以及

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
upper bound: [44, 255, 255]

以上结果将显示在终端中。

最后让我们看看OpenCV如何根据给出的颜色来选择出我们的物体。

代码语言:javascript
代码运行次数:0
运行
复制

你也可以到GitHub下载我的这段代码: colorDetection.py

要执行我的脚本,运行以下命令并把图片名作为参数(我这里的图片为yellow_object.JPG):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python colorDetection.py  

这个脚本将显示原图(“image”窗口)和OpenCV使用颜色范围过滤后的掩膜(“mask”窗口)。

05. 移动物体跟踪

既然我们已经知道了如何用掩膜来选择出我们的物体,那就让我们用相机来实时跟踪他的移动吧。为此,我基于Adrian Rosebrock的OpenCV小球目标跟踪教程写了我的代码。

我强烈建议你详细阅读Adrian的教程。

首先,请确认你已经安装了imutils库。它是Adrian基于OpenCV自制的图像处理基本任务(如修改尺寸、翻转等)的易用函数集合。如果你还没有安装,请在你的Python虚拟环境中运行下面的命令安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install imutils

下面,从我的GitHub下载ball_tracking.py代码并用下面的命令执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python ball_traking.py

你将会看到类似于下面的gif的结果:

总体而言,我与Adrian的代码除了“视频垂直翻转”之外没有什么不同:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
frame = imutils.rotate(frame, angle=180)

请注意,这里使用的颜色掩膜的边界值是我们在上一步得到的。

06. 测试通用 IO

现在我们已经搞定OpenCV的基础了,是时候给树莓派装个LED来试一下通用IO了。

请按照上图的电路做:LED的负极接到GPIO 21口,正极接一个220Ω的电阻再连接GND。

现在使用我们的Python虚拟环境测试一下这个LED吧!

请注意,有可能你的Python虚拟环境还没有安装树莓派的RPi.GPIO。如果还没有的话,运行下面的命令即可使用pip安装(请先确定自己在虚拟环境“cv”中):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install RPi.GPIO

现在用一个Python脚本来做个简单的测试:

代码语言:javascript
代码运行次数:0
运行
复制

上边的代码需要一个GPIO端口号和一个LED闪烁频率作为参数。LED闪烁5次后程序结束。结束之前记得释放GPIO。

也就是说,运行脚本时要给出两个参数:“LED GPIO”和frequency。举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python LED_simple_test.py 21 1

上边的指令意味着使用“GPIO 21”上连接的LED灯,并且每1秒闪烁一次,总共闪烁五次。

同样,上边这段代码也可以在GitHub下载:GPIO_LED_test.py

上边的图片显示了我的程序结果。至于LED灯亮不亮,就要各位自己去检验啦。

好,下面让我们把OpenCV和基本GPIO操作一起耍起来~

07. 识别颜色和GPIO(General-purpose input/output:通用型输入输出)交互

让我们开始集成 OpenCV 代码和 GPIO 进行交互。我们会从 最后的OpenCV 代码开始,并且我们将会把 GPIO_RPI 库集成到代码中,其目的是在摄像头检测到我们的着色物体时,能使红色LED常亮。 这一步骤使用的代码是基于 Adrian 写得非常不错的教程OpenCV, RPi.GPIO, and GPIO Zero on the Raspberry Pi

第一件需要做的事情是:”创建“我们的LED对象,目的是为了连接上指定的GPIO。

代码语言:javascript
代码运行次数:0
运行
复制

第二,我们必须初始化LED(关灯状态):

代码语言:javascript
代码运行次数:0
运行
复制

现在,在代码循环体中,当物体被检测到,”圆“被创建时,我们会把LED灯打开

代码语言:javascript
代码运行次数:0
运行
复制

你可以在我的GitHub库中下载到完整的代码:object_detection_LED.py

运行代码使用到的命令行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python object_detection_LED.py

下面的图片就是实现的效果。提示:当物体被检测到时,在图片左下方的LED灯就会亮着。

试试不同颜色,不同形式的物体,你会发现一旦颜色和掩码范围内匹配的话,LED灯就会亮起来。

下面的视频显示了一些经验。要注意的是,只有在色值一定范围内的黄色物体才会被检测到,LED等会亮起来。而其他不同颜色的物体则会被略过。

正如最后一步解释的那样,我们只是用到了LED灯。但是在视频中,摄像头却集成了云台(Pan Tilt:指摄像头可全方位左右/上下移动),所以不妨先忽略它。我们会下一步骤中实现云台机制。

08. 云台机制

现在我们已经用上了基本的 OpenCV 和 GPIO,那么接下来我们升级一下云台机制。

获取更多细节,请查看我的教程:Pan-Tilt-Multi-Servo-Control

伺服(servo:一种微型电子与机械产品的合体转置)需要连接额外的 5V 电力供应模块,并且这些伺服使用它们的数据插口(在我这边,它们是黄色的布线)连接草莓派的 GPIO,连接方式如下:

  • GPIO 17 ==> 倾斜伺服
  • GPIO 27 ==> 水平伺服

不要忘记了将 GND(GND:ground,接地端)引脚 也连到一起 ==> 草莓派——伺服——额外电力供应模块

你有个可选项:在草莓派 GPIO 和 服务端的数据输入引脚之间串联一个 1K 欧姆的电阻。这个举措可以在伺服发生问题时保护你的草莓派。

让我们一起用这个机会在 虚拟 Python 环境中测试一下我们的伺服。 我们执行 Python 脚本来测试一下驱动器。

代码语言:javascript
代码运行次数:0
运行
复制

上面代码的核心是 setServoAngle(servo, angle)方法。这个方法会接收的参数有:一个 GPIO 数字,一个伺服被定位的角度值。一旦把角度值输入到这个方法中,我们必须将其转换到等效的工作周期中(duty cycle:指伺服进入角度变化的时间段)。

执行脚本时,你要输入两个参数值:GPIO 伺服对应的端口以及角度值。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python angleServoCtrl.py 17 45

上面的命令行会将在 连接在GPIO 17端口的伺服(倾斜伺服)定位到45度的”海拔“上。

angleServoCtrl.py 文件可以在我的GitHub上下载到。

09. 实时获取物体位置

将物体定位到屏幕中央的想法会使用到云台机制。实现这个想法坏消息是 我们必须实时地定位到物体的位置,但好消息是 如果我们已经知道了物体中心坐标点,这将会很容易。

首先,我们使用之前用过的”object_detect_LED“代码,以及修改该代码,以打印出检测物体的 x,y坐标点。

代码可以从我的GitHub中下载到:objectDetectCoord.py

代码核心逻辑是:在检测到的物体区域画出一个圆,并且在圆的中心画一个红点。

代码语言:javascript
代码运行次数:0
运行
复制

我们输出中心点坐标到 mapObjectPosition(int(x), int(y)) 方法中,目的是打印这些坐标点。方法如下:

代码语言:javascript
代码运行次数:0
运行
复制

在跑这个程序时,我们会看到在命令行终端上输出的 (x,y)坐标点,如下图所示:

太好了!我们可以使用这些坐标点作为云台追踪系统的开始点。

10. 物体位置追踪系统

我们想要目标始终在屏幕的中央,我们来定义一下,例如:假如满足下方条件,我们就认为物体在中央:

  • 220 < x < 280
  • 160 < y < 210

而在这个界限之外的话,我们就需要通过移动云台装置来修正偏差。基于这个逻辑,我们可以构建如下方法mapServoPosition(x, y)。需要注意的是,该方法中使用到的”x“和”y“是和我们之前打印出来的中心位置一样的。

代码语言:javascript
代码运行次数:0
运行
复制

基于这些(x,y)坐标点,并使用方法positionServo(servo, angle) ,伺服位置命令已经产生了。举个例子:假如”y“的位置是”50“,这就意味着我们的物体几乎在屏幕的顶部,也就是说 摄像头的视野是往下的(比如说倾斜装置处于120°上),所以要调低倾斜装置的角度(比如说调到100°),如此一来,摄像头的视野将会抬高,进而使得物体在屏幕上就会往下方移动(比如 y坐标提高到190的位置)。

上面的图例在几何上解释了举的例子。

思考一下水平装置上的摄像头如何移动的。要注意的是 屏幕并不是镜像映射的,也就是说,当你面对着摄像头时,如果你将物体移动到”你的左边“,但在屏幕上看,物体却会在”你的右边“移动。

positionServo(servo, angle)方法可以写成这样:

代码语言:javascript
代码运行次数:0
运行
复制

上面的代码中,我们将会调用之前展示的伺服移动脚本。

注意: angleServoCtrl.py一定要和 objectDetectTrac.py 在同一个目录下。

完整的代码可以从我的GitHub上下载:objectDetectTrack.py

下面的gif 展示了我们的项目运行的效果:

11. 结论

我一如既往地希望这个项目能帮助其他人找到进入激动人心的电子世界的入口。

想要获取项目细节以及最终的代码,可以浏览我的GitHub仓库:OpenCV-Object-Face-Tracking 。

而想了解更多的项目,请浏览我博客:MJRoBot.org

下面是我下一篇教程的预告,我们将会探索”人脸追踪和检测“。

向你们发出来自世界南半球的问候!

我们下篇文章见!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Android自动化构建之Ant多渠道打包实践(下)
前言 上一篇(Android自动化构建之Ant多渠道打包实践(上))已经介绍了Android的apk是如何构建的,本篇博客继续Ant打包的实践过程。 集成友盟统计SDK 这里以友盟统计为例,对各个渠道进行统计,我们需要先集成它的SDK 配置权限 <!-- 权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permis
巫山老妖
2018/07/20
4500
AndroidStudio3.0多渠道打包:我用一行命令打出N个包
csdn: http://blog.csdn.net/k_bb_666
蜻蜓队长
2018/08/03
4090
AndroidStudio3.0多渠道打包:我用一行命令打出N个包
使用Gradle管理你的Android Studio工程
关于Android Gradle更多详细内容已经出书《Android Gradle权威指南》,大家可以购买,看更多没有介绍的知识点和内容,购买链接如下
飞雪无情
2018/08/28
1.1K0
studio多渠道打包
由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这事就简单了。 友盟多渠道打包 废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段: <meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID" /> 里面的 Channel_ID 就是渠道标示。我们的目标就是在编译的时
xiangzhihong
2018/01/30
7670
Android Studio 使用Gradle多渠道打包
我们都知道国内应用市场非常多,为了统计各个应用市场的app下载量和使用情况,我们需要多渠道的打包。如果一个一个的手动去打包岂不烦死了,要多麻烦就有多麻烦。这就要求我们学会使用Gradle进行多渠道打包。废话不多说了,直接进入正题吧! 第一步:配置AndroidManifest.xml 以友盟渠道为例,渠道信息一般都是写在 AndroidManifest.xml文件中,大约如下: <meta-data android:name="UMENG_CHANNEL" android:value="xiaomi" />
非著名程序员
2018/02/02
9660
Android开发Gradle高级技巧、自定义Gradle Task、打包完成自动签名、执行Shell脚本
先说下为什么有这篇文章吧,最近在写一个应用需要进行系统签名;每次我都需要先将apk生成然后使用sign.jar和系统证书进行签名,非常的麻烦而且tmd还是搞两个系统也就是每次都需要用两个系统证书分别进行签名…
Android技术干货分享
2019/03/27
4.7K0
Android开发Gradle高级技巧、自定义Gradle Task、打包完成自动签名、执行Shell脚本
android友盟统计分渠道打包
什么是多渠道包 渠道包就是要在安装包中添加渠道信息,也就是channel,对应不同的渠道,例如:小米市场、360市场、应用宝市场等 产品在不同的应用市场可能有不同的统计需求,需要为每个应用市场的Android包设定一个可以区分应用市场的标识,这个为Android包设定应用市场标识的过程就是多渠道打包。
再见孙悟空_
2023/02/10
6430
android友盟统计分渠道打包
Android项目实战(三十五):多渠道打包
多渠道打包:   可以理解为:同时发布多个渠道的apk。分别上架不同的应用商店。这些apk带有各自渠道的标签,用于统计分析各个商店的下载次数等数据。   实现步骤 一、添加友盟渠道标签     添加位置:app目录下的 AndroidManifest.xml文件      添加语句:     <!--多渠道打包--> <meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/>     示
听着music睡
2018/05/18
1K0
360加固apk并自动签名
我们知道Android加混淆之后,代码的安全性得到了提高,即使你hook,反编译得到的也是乱码的,对于阅读性造成了影响,为了增强代码的破解难度,我们通常退对apk进行加固,常见的有腾讯,360,爱加密
xiangzhihong
2018/02/05
2.7K0
360加固apk并自动签名
Gradle多渠道打包
国内Android应用市场品种太多,血统不纯,每次上线App都打包打到手软,上传上到吐血!好在我们有了Android studio和gradle,一条命令打包各种渠道版本App!
GitOPEN
2019/03/01
1.1K0
Android开发笔记(七十)反编译初步
Android的内核源码很大,有几个G,仔细找找网上有许多下载的地方。作为普通开发者,一般不需要阅读内核源码,但一点都不了解好像也不行,因为实际开发中有时候就得会那么一点点。下面几个源码目录,是开发者在实际开发中可以参考的: \system\core\toolbox : linux后台命令的源码,如ls、rm、kill、chmod、top、netstat等等。 \packages\apps : Android自带的应用程序的源码,如计算器、日历、相机、浏览器、联系人、音乐、拨号、设置等等。 \sdk : Android开发的辅助工具源码,如eclipse插件、emulator模拟器、ddms管理工具、draw9patch点九制图工具。 \frameworks\base\core\java\android : 提供给开发者的SDK开发框架的源码,基本与“Android SDK Manager”上下载的SDK一致。
aqi00
2019/01/18
9510
APK多渠道加固打包笔记之360加固宝
首先需要知道V1,V2,V3签名的区别,可以参考之前的文章:AndroidV1,V2,V3签名原理详解
小柔
2022/10/09
1.6K0
APK多渠道加固打包笔记之360加固宝
关于Gradle配置的小结
使用 Android Studio 来开发 Android 工程的过程中,接触 Gradle 是不可避免的,比如配置签名、引入依赖等。那么 Gradle 到底是什么东西呢? Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化建构工具。它使用一种基于 Groovy 的特定领域语言 (DSL) 来声明项目设置,抛弃了基于 XML 的各种繁琐配置 (此定义来自于百度百科-_- !) 。啰里啰唆一堆,幸运的是,一般来说 Android 开发者只要会配置 Gradle 就可以了,并不需要深入了解。那么下面我们就来揭开 Gradle 的面纱吧。
俞其荣
2022/07/28
6590
关于Gradle配置的小结
Ant打包安卓apk(4)-多渠道(配置)打包方案
目前我需要一个boolean, 一个请求的url, config.url =http://10.1.64.42:9082/insure-pad/padServer.do, config.bool = false 我想加快apk打包速度啊, 一方面是还在用eclipse, 二来如果用普通的gradle的farvor方式还是不够快,美团都有v2方案了, 自己搞一搞比较有意思而已
acc8226
2022/05/17
1.3K0
Ant打包安卓apk(4)-多渠道(配置)打包方案
gradle打包android (实现外部导入签名文件、多渠道打包、导入ant脚本)
       最近一直在做android自动打包,之前已经完成了用纯命令行的形式打包、原生态ant脚本打包,和基于android的SDK的打包,并且实现了多渠道打包,后来同事推荐了gradle,网上的资料说gradle各种好,自己也感兴趣是实现一下,其实一般来说由于android对eclipse的支持减弱,大部分的人都是用gradle与android studio融合,这样面的例子也会比较多,但笔者所在的项目还是在eclipse的比较多,由于开发人员在移植过程中发现报错比较多所以一直没有完全移植(好吧,其实早晚会移植),所以笔者是用eclipse的IDE做的实验,下面先贴几个基础知识
粲然忧生
2022/08/02
8030
写给小白的android基础面试笔试题(一)
序言:由于公司的某些方面原因,LZ最近都处于找工作的状态,年关了,最关键的LZ还只是个没毕业的孩子,所以工作越来越不好找了,到哪里投简历都是动不动就好几年经验,这让我们这些没经验的渣渣还怎么活啊!好了,也不吐槽那么多了,这几天到处去投简历,到处去面试,培训机构,外包公司这些都经历了个遍,总结了一下面试的时候的面试笔试题(如有错误,请及时纠正)
用户2802329
2018/08/07
9630
乐固加固FAQ
加固过程中会破坏apk的签名文件,此时直接安装时会出错,找不到签名。因此需要重新签名,重签名后的apk签名文件和原来的保持一致就不会影响更新应用。
腾讯云@移动安全
2018/05/25
16.7K8
乐固加固FAQ
相关推荐
Android自动化构建之Ant多渠道打包实践(下)
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 既然你的树莓派已经安装好OpenCV了,那就先测试一下你的相机是否正常工作吧~(假设你已经在你的树莓派上安装PiCam了)
    • 现在我们已经用上了基本的 OpenCV 和 GPIO,那么接下来我们升级一下云台机制。
    • 获取更多细节,请查看我的教程:Pan-Tilt-Multi-Servo-Control
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档