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多线程编程简单介绍
Apr 13 Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 Python
Python reduce()函数的用法小结
Nov 15 Python
TensorFlow 合并/连接数组的方法
Jul 27 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
Python爬虫学习之翻译小程序
Jul 30 Python
基于python实现微信好友数据分析(简单)
Feb 16 Python
python 轮询执行某函数的2种方式
May 03 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
Nov 12 Python
图文详解matlab原始处理图像几何变换
Jul 09 Python
聊聊Python String型列表求最值的问题
Jan 18 Python
python 学习GCN图卷积神经网络
May 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中的PHP_EOL换行符详细解析
2013/10/26 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
node.js中的querystring.parse方法使用说明
2014/12/10 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
学习javascript的闭包,原型,和匿名函数之旅
2015/10/18 Javascript
Json解析的方法小结
2016/06/22 Javascript
ajax异步请求详解
2017/01/06 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
修改vue+webpack run build的路径方法
2018/09/01 Javascript
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
微信小程序如何实现在线客服功能
2019/10/16 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
仓库理货员岗位职责
2013/12/18 职场文书
大二学生学习个人自我评价
2014/01/19 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
标准毕业生自荐信
2014/06/24 职场文书
七夕情人节问候语
2015/11/11 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python