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 中文乱码问题深入分析
Mar 13 Python
python分析nignx访问日志脚本分享
Feb 26 Python
Python中使用logging模块打印log日志详解
Apr 05 Python
Python模拟用户登录验证
Sep 11 Python
Python3 模块、包调用&amp;路径详解
Oct 25 Python
python实现list由于numpy array的转换
Apr 04 Python
python 使用正则表达式按照多个空格分割字符的实例
Dec 20 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 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 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
在vue中使用jsx语法的使用方法
2019/09/30 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
简介Django框架中可使用的各类缓存
2015/07/23 Python
Python正则表达式知识汇总
2017/09/22 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
python 公共方法汇总解析
2019/09/16 Python
python编写猜数字小游戏
2019/10/06 Python
谈谈python垃圾回收机制
2020/09/27 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
悦木之源美国官网:Origins美国
2016/08/01 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
致百米运动员广播稿
2014/01/29 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
2014年创卫实施方案
2014/02/18 职场文书
协议书模板
2014/04/23 职场文书
视光学专业自荐信
2014/06/24 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
学校政风行风整改方案
2014/10/25 职场文书
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android
使用Nginx+Tomcat实现负载均衡的全过程
2022/05/30 Servers