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实现的百度站长自动URL提交小工具
Jun 27 Python
Python基础语法(Python基础知识点)
Feb 28 Python
Python中time模块和datetime模块的用法示例
Feb 28 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
微信跳一跳辅助python代码实现
Jan 05 Python
Python常见MongoDB数据库操作实例总结
Jul 24 Python
Python实现的统计文章单词次数功能示例
Jul 08 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
Python Dict找出value大于某值或key大于某值的所有项方式
Jun 05 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 Python
python 实现的IP 存活扫描脚本
Dec 10 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修改session_id示例代码
2014/01/08 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
js判断变量是否未定义的代码
2020/03/28 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
JS中数组重排序方法
2016/11/11 Javascript
Bootstrap table使用方法详细介绍
2016/12/09 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
python 判断自定义对象类型
2009/03/21 Python
python 多线程应用介绍
2012/12/19 Python
python打开文件并获取文件相关属性的方法
2015/04/23 Python
Python复数属性和方法运算操作示例
2017/07/21 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
商务会议邀请函
2014/01/09 职场文书
学校读书活动总结
2014/06/30 职场文书
模具设计与制造专业自荐书
2014/07/01 职场文书
学习三严三实心得体会
2014/10/13 职场文书
老龙头导游词
2015/02/11 职场文书
金陵十三钗观后感
2015/06/04 职场文书
电影红河谷观后感
2015/06/11 职场文书
高中生综合素质评价范文
2015/08/18 职场文书