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 mysqldb连接数据库
Mar 16 Python
Python实现的二维码生成小软件
Jul 11 Python
Python中zip()函数用法实例教程
Jul 31 Python
Python中使用ConfigParser解析ini配置文件实例
Aug 30 Python
Python字符串转换成浮点数函数分享
Jul 24 Python
获取python文件扩展名和文件名方法
Feb 02 Python
10 分钟快速入门 Python3的教程
Jan 29 Python
python从子线程中获得返回值的方法
Jan 30 Python
基于Python的Post请求数据爬取的方法详解
Jun 14 Python
python如何读取bin文件并下发串口
Jul 05 Python
django 扩展user用户字段inlines方式
Mar 30 Python
python神经网络学习 使用Keras进行简单分类
May 04 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/02/15 PHP
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
浅谈php serialize()与unserialize()的用法
2013/06/05 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
Jquery修改页面标题title其它JS失效的解决方法
2014/10/31 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
常用的JavaScript模板引擎介绍
2015/02/28 Javascript
必备的JS调试技巧汇总
2016/07/20 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
在Windows8上的搭建Python和Django环境
2014/07/03 Python
利用Python绘制MySQL数据图实现数据可视化
2015/03/30 Python
Python返回真假值(True or False)小技巧
2015/04/10 Python
使用python实现省市三级菜单效果
2016/01/20 Python
最近Python有点火? 给你7个学习它的理由!
2017/06/26 Python
python绘制直线的方法
2018/06/30 Python
Python中修改字符串的四种方法
2018/11/02 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
关于礼仪的演讲稿
2014/01/04 职场文书
业务部主管岗位职责
2014/01/29 职场文书
面试后的感谢信范文
2014/02/01 职场文书
2014超市双十一活动策划方案
2014/09/29 职场文书
购房个人委托书范本
2014/10/11 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
2016年大学迎新晚会工作总结
2015/10/15 职场文书
用Python实现屏幕截图详解
2022/01/22 Python