OpenCV实现机器人对物体进行移动跟随的方法实例


Posted in Python onNovember 09, 2020

1.物体识别

本案例实现对特殊颜色物体的识别,并实现根据物体位置的改变进行控制跟随。

import cv2 as cv

# 定义结构元素
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
# print kernel

capture = cv.VideoCapture(0)		
print capture.isOpened()
ok, frame = capture.read()
lower_b = (65, 43, 46)
upper_b = (110, 255, 255)

height, width = frame.shape[0:2]
screen_center = width / 2
offset = 50

while ok:
 # 将图像转成HSV颜色空间
 hsv_frame = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
 # 基于颜色的物体提取
 mask = cv.inRange(hsv_frame, lower_b, upper_b)
 mask2 = cv.morphologyEx(mask, cv.MORPH_OPEN, kernel)
 mask3 = cv.morphologyEx(mask2, cv.MORPH_CLOSE, kernel)
 
 # 找出面积最大的区域
 _, contours, _ = cv.findContours(mask3, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

 maxArea = 0
 maxIndex = 0
 for i, c in enumerate(contours):
 area = cv.contourArea(c)
 if area > maxArea:
 maxArea = area
 maxIndex = i
	# 绘制
 cv.drawContours(frame, contours, maxIndex, (255, 255, 0), 2)
 # 获取外切矩形
 x, y, w, h = cv.boundingRect(contours[maxIndex])
 cv.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
 # 获取中心像素点
 center_x = int(x + w/2)
 center_y = int(y + h/2)
 cv.circle(frame, (center_x, center_y), 5, (0, 0, 255), -1)

 # 简单的打印反馈数据,之后补充运动控制
 if center_x < screen_center - offset:
 print "turn left"
 elif screen_center - offset <= center_x <= screen_center + offset:
 print "keep"
 elif center_x > screen_center + offset:
 print "turn right"

 cv.imshow("mask4", mask3)
 cv.imshow("frame", frame)
 cv.waitKey(1)
 ok, frame = capture.read()

实际效果图

OpenCV实现机器人对物体进行移动跟随的方法实例

2.移动跟随

结合ROS控制turtlebot3或其他机器人运动,turtlebot3机器人的教程见我另一个博文:ROS控制Turtlebot3

首先启动turtlebot3,如下代码可以放在机器人的树莓派中,将相机插在USB口即可

代码示例:

import rospy
import cv2 as cv
from geometry_msgs.msg import Twist


def shutdown():
 twist = Twist()
 twist.linear.x = 0
 twist.angular.z = 0
 cmd_vel_Publisher.publish(twist)
 print "stop"


if __name__ == '__main__':
 rospy.init_node("follow_node")
 rospy.on_shutdown(shutdown)
 rate = rospy.Rate(100)

 cmd_vel_Publisher = rospy.Publisher("/cmd_vel", Twist, queue_size=1)
 # 定义结构元素
 kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
 # print kernel

 capture = cv.VideoCapture(0)
 print capture.isOpened()
 ok, frame = capture.read()
 lower_b = (65, 43, 46)
 upper_b = (110, 255, 255)

 height, width = frame.shape[0:2]
 screen_center = width / 2
 offset = 50

 while not rospy.is_shutdown():
 # 将图像转成HSV颜色空间
 hsv_frame = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
 # 基于颜色的物体提取
 mask = cv.inRange(hsv_frame, lower_b, upper_b)
 mask2 = cv.morphologyEx(mask, cv.MORPH_OPEN, kernel)
 mask3 = cv.morphologyEx(mask2, cv.MORPH_CLOSE, kernel)

 # 找出面积最大的区域
 _, contours, _ = cv.findContours(mask3, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

 maxArea = 0
 maxIndex = 0
 for i, c in enumerate(contours):
 area = cv.contourArea(c)
 if area > maxArea:
 maxArea = area
 maxIndex = i
 # 绘制
 cv.drawContours(frame, contours, maxIndex, (255, 255, 0), 2)
 # 获取外切矩形
 x, y, w, h = cv.boundingRect(contours[maxIndex])
 cv.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
 # 获取中心像素点
 center_x = int(x + w / 2)
 center_y = int(y + h / 2)
 cv.circle(frame, (center_x, center_y), 5, (0, 0, 255), -1)

 # 简单的打印反馈数据,之后补充运动控制
 twist = Twist()
 if center_x < screen_center - offset:
 twist.linear.x = 0.1
 twist.angular.z = 0.5
 print "turn left"
 elif screen_center - offset <= center_x <= screen_center + offset:
 twist.linear.x = 0.3
 twist.angular.z = 0
 print "keep"
 elif center_x > screen_center + offset:
 twist.linear.x = 0.1
 twist.angular.z = -0.5
 print "turn right"
 else:
 twist.linear.x = 0
 twist.angular.z = 0
 print "stop"

 # 将速度发出
 cmd_vel_Publisher.publish(twist)

 # cv.imshow("mask4", mask3)
 # cv.imshow("frame", frame)
 cv.waitKey(1)
 rate.sleep()
 ok, frame = capture.read()

总结

到此这篇关于OpenCV实现机器人对物体进行移动跟随的文章就介绍到这了,更多相关OpenCV机器人对物体移动跟随内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
Windows下PyCharm安装图文教程
Aug 27 Python
python采集微信公众号文章
Dec 20 Python
Python/Django后端使用PIL Image生成头像缩略图
Apr 30 Python
python 多线程对post请求服务器测试并发的方法
Jun 13 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
Aug 17 Python
Python-openCV读RGB通道图实例
Jan 17 Python
python判断两个序列的成员是否一样的实例代码
Mar 01 Python
python+requests接口压力测试500次,查看响应时间的实例
Apr 30 Python
浅析python实现动态规划背包问题
Dec 31 Python
OpenCV项目实践之停车场车位实时检测
Apr 11 Python
基于python爬取梨视频实现过程解析
Nov 09 #Python
Python eval函数介绍及用法
Nov 09 #Python
python tkinter的消息框模块(messagebox,simpledialog)
Nov 07 #Python
python 用struct模块解决黏包问题
Nov 07 #Python
python hmac模块验证客户端的合法性
Nov 07 #Python
python如何利用paramiko执行服务器命令
Nov 07 #Python
基于python模拟TCP3次握手连接及发送数据
Nov 06 #Python
You might like
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
WordPress中限制非管理员用户在文章后只能评论一次
2015/12/31 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
javascript 写类方式之五
2009/07/05 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
JavaScript类的写法
2016/09/17 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
原生js实现可拖拽效果
2017/02/28 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
利用js将ajax获取到的后台数据动态加载至网页中的方法
2018/08/08 Javascript
[47:53]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#2COL VS Spirit
2016/03/02 DOTA
Python实例之wxpython中Frame使用方法
2014/06/09 Python
python静态方法实例
2015/01/14 Python
python显示生日是星期几的方法
2015/05/27 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
Pandas 按索引合并数据集的方法
2018/11/15 Python
Keras之自定义损失(loss)函数用法说明
2020/06/10 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
澳大利亚百货公司:David Jones
2018/02/08 全球购物
请说出几个常用的异常类
2013/01/08 面试题
我们的节日端午节活动方案
2014/03/02 职场文书
身边的榜样活动方案
2014/08/20 职场文书
群众路线自我剖析及整改措施
2014/11/04 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
详解Golang如何优雅的终止一个服务
2022/03/21 Golang
Python 全局空间和局部空间
2022/04/06 Python