树莓派opencv python 实例教程一 颜色圆球跟踪机器人教程
人工智能和机器学习领域的发展日新月异,必将在不久的将来改变人类的生活方式。人们认为机器人可以通过传感器和机器学习处理来理解现实世界并与之互动。就像我们一样,图像识别是一种流行的方式,人们认为机器人可以通过使用摄像头观察现实世界来理解物体。在此项目中,让我们使用Raspberry Pi的功能来构建一个机器人,该机器人可以像跟踪足球的机器人一样跟踪并跟踪球。
OpenCV是一个非常著名的开源工具,用于图像处理,但是在本教程中,为使事情简单,我们使用了Processing IDE。由于针对ARM的处理还发布了用于处理的GPIO库,因此我们不再需要在python和处理之间进行切换以与Raspberry Pi一起使用。听起来不错吧?=现在让我们开始吧。
所需硬件:
- 树莓派
- 摄像头模块,带状电缆
- 机器人底盘
- 带轮齿轮电动机
- L293D电机驱动器
- 移动电源或任何其他便携式电源
编程要求:
- Raspberry pi的监视器或其他显示器
- Pi的键盘或鼠标
- 处理ARM软件
注意:在编程过程中必须通过电线将显示器连接到Pi,因为只有这样才能观看摄像机的视频
在Raspberry Pi上设置处理:
如前所述,我们将使用处理环境对Raspberry Pi进行编程,而不是使用python的默认方式。因此,请按照以下步骤操作:
步骤1:- 将Raspberry Pi连接到显示器,键盘和鼠标,然后将其打开。
步骤2:- 确保您的Pi已连接到活动的互联网连接,因为我们将要下载一些内容。
步骤3:-单击Processing ARM,以下载Raspberry Pi的处理IDE。下载将以ZIP文件的形式进行。
步骤4:-下载完成后,将文件解压缩到您首选目录的ZIP文件夹中。我只是将其提取到桌面上。
步骤5:-现在,打开提取的文件夹,然后单击名为processing的文件。它应该打开一个窗口,如下所示。
步骤6:-这是我们将在其中键入代码的环境。对于熟悉Arduino的人,请不要感到震惊,是的,IDE的确与Arduino类似,所以程序也是如此。
步骤7:-我们需要两个程序库来进行安装,然后单击Sketch-> Import Library-> Add Library进行安装。将打开以下对话框。
步骤 8:- 在最上边搜索 Raspberry Pi , 会u看到一些。
步骤9:-搜索名为“ GL Video”和“ Hardware I / O”的库,然后单击“安装”进行安装。确保安装了两个库。
步骤10:-根据您的互联网,安装将花费几分钟。完成后,我们就可以处理软件了。
电路原理图:
该Raspberry Pi球跟踪项目的电路图如下所示。
如您所见,该电路包含一个PI摄像头,一个电机驱动器模块和一对连接到Raspberry pi的电机。整个电路由移动电源(在上面的电路中以AAA电池表示)供电。
由于Raspberry Pi上未提及引脚的详细信息,因此我们需要使用下图验证引脚
要驱动电机, 我们需要四个引脚(A,B,A,B)。这四个引脚分别从GPIO14、4、17和18连接。橙色和白色电线共同构成一台电动机的连接。因此,对于两个电机,我们有两个这样的对。
如图所示,电动机已连接到 L293D电动机驱动器模块,并且驱动器模块由移动 电源供电。确保移动电源的接地端已连接至Raspberry Pi的接地端,然后您的连接才可以使用。
就是这样,我们已经完成了硬件连接,让我们回到处理环境并开始编程,教我们的机器人如何跟踪球。
Raspberry Pi球跟踪程序:
该项目的完整处理程序在页面末尾提供,您可以直接使用。在下面的内容中,我已经解释了代码的工作原理,以便您可以将其用于其他类似项目。
该计划的概念是很简单的。尽管该项目的目的是跟踪球,但实际上我们不会这样做。我们将使用颜色来识别球。众所周知,视频不过是连续的图片帧。因此,我们拍摄每张照片并将其拆分为像素。然后,我们将每个像素的颜色与球的颜色进行比较;如果找到比赛,那么我们可以说我们找到了球。利用此信息,我们还可以识别屏幕上球的位置(像素颜色)。如果位置在最左边,则将机器人向右移动;如果位置在最右边,则将机器人向左移动,以使像素位置始终位于屏幕中心。您可以观看Daniel希夫曼(Daniel shiffman)的Computer Vision视频,以获取清晰的图像。
与往常一样,我们首先导入我们下载的两个库。这可以通过以下两行完成。硬件I / O库用于直接从处理环境访问PI的GPIO引脚,glvideo库用于访问Raspberry Pi相机模块。
在设置功能中,我们初始化输出引脚以控制电机,还从pi摄像机获取视频,并在尺寸为320 * 240的窗口中对其进行尺寸设置。
void setup() { size(320, 240, P2D); video = new GLCapture(this); video.start(); trackColor = color(255, 0, 0); GPIO.pinMode(4, GPIO.OUTPUT); GPIO.pinMode(14, GPIO.OUTPUT); GPIO.pinMode(17, GPIO.OUTPUT); GPIO.pinMode(18, GPIO.OUTPUT); }
的空隙平局是像无限循环此循环内的代码将被只要程序终止执行。如果有摄像机源,我们会读取其中的视频.
void draw() { background(0); if (video.available()) { video.read(); }}
然后我们开始将视频帧分割为像素。每个像素都有一个红色,绿色和蓝色的值。这些值存储在变量r1,g1和b1中
for(int x = 0; x <video.width; x ++){ for(int y = 0; y <video.height; y ++){ int loc = x + y * video.width; //什么是当前颜色 color currentColor = video.pixels [loc]; float r1 =red(currentColor); float g1 = green(currentColor); float b1 = blue(currentColor);
要首先检测球的颜色,我们必须单击颜色。单击后,球的颜色将存储在名为trackColour的变量中。
void mousePressed(){ //将颜色保存在trackColor变量中单击鼠标的位置 int loc = mouseX + mouseY * video.width; trackColor = video.pixels [loc]; }
一旦获得了轨道颜色和当前颜色,我们就必须对其进行比较。此比较使用的是dist函数。它检查当前颜色与轨道颜色的接近程度。
float d = dist(r1,g1,b1,r2,g2,b2);
对于完全匹配,dist的值将为零。因此,如果dist的值小于指定的值(世界纪录),则我们假定已找到轨道颜色。然后我们获得该像素的位置,并将其存储在最接近X和最接近Y的变量中以找到球的位置.
if (d < worldRecord) { worldRecord = d; closestX = x; closestY = y; }
我们还将在找到的颜色周围绘制一个椭圆,以指示已找到该颜色。位置值也打印在控制台上,这在调试时会很有帮助。
if (worldRecord < 10) { // Draw a circle at the tracked pixel fill(trackColor); strokeWeight(4.0); stroke(0); ellipse(closestX, closestY, 16, 16); println(closestX,closestY);
最后,我们可以比较最接近的X和最接近的Y的位置,并以使颜色到达屏幕中心的方式调整马达。由于发现颜色的X位置在屏幕的左侧(<140),因此以下代码用于使机器人向左转.
if(closestX <140) { GPIO.digitalWrite(4,GPIO.HIGH); GPIO.digitalWrite(14,GPIO.HIGH); GPIO.digitalWrite(17,GPIO.HIGH); GPIO.digitalWrite(18,GPIO.LOW); delay(10); GPIO.digitalWrite(4,GPIO.HIGH); GPIO.digitalWrite(14,GPIO.HIGH); GPIO.digitalWrite(17,GPIO.HIGH); GPIO.digitalWrite(18,GPIO.HIGH); println(“turn right”); }
同样,我们可以检查X和Y的位置,以按所需方向控制电动机。与往常一样,您可以参考页面底部的完整程序。
Raspberry Pi球形跟踪机器人的工作:
一旦您准备好硬件和程序,就该找点乐子了。在地面上测试我们的机器人之前,我们应确保一切正常。连接您的Pi来监视并启动处理代码。您应该在一个小窗口上看到视频源。现在,将球放入框架中,然后单击该球,以告诉机器人它应该跟踪这种特定颜色。现在,将球绕屏幕移动,您应该注意到轮子在旋转。
如果一切正常,请释放机器人并开始使用它。 确保房间照明均匀 以获得最佳效果。以下视频显示了该项目的完整工作 。希望您理解该项目并喜欢构建类似的东西。如果您有任何问题,请随时将其发布在下面的评论部分或寻求帮助。