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运算符重载用法实例分析
Jun 01 Python
python中getaddrinfo()基本用法实例分析
Jun 28 Python
剖析Django中模版标签的解析与参数传递
Jul 21 Python
浅谈Python里面小数点精度的控制
Jul 16 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
pygame实现成语填空游戏
Oct 29 Python
Python3 元组tuple入门基础
Feb 09 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
Apr 14 Python
jupyter lab文件导出/下载方式
Apr 22 Python
在服务器上安装python3.8.2环境的教程详解
Apr 26 Python
Python 通过监听端口实现唯一脚本运行方式
May 05 Python
基于Tensorflow一维卷积用法详解
May 22 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
第九节--绑定
2006/11/16 PHP
PHP解析目录路径的3个函数总结
2014/11/18 PHP
解决php表单重复提交实现方法
2015/09/29 PHP
8个必备的PHP功能开发
2015/10/02 PHP
JSON 数据格式介绍
2012/01/13 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
Highcharts入门之简介
2016/08/02 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
JS实现留言板功能
2017/06/17 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
node.js基础知识小结
2018/02/26 Javascript
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
Python基础语言学习笔记总结(精华)
2017/11/14 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
python 等差数列末项计算方式
2020/05/03 Python
后勤人员自我评价怎么写
2013/09/19 职场文书
测绘工程本科生求职信
2013/10/10 职场文书
管理科学大学生求职信
2013/11/13 职场文书
应届本科生推荐信范文
2013/12/25 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
读书小明星事迹材料
2014/05/03 职场文书
初中学习计划书范文
2014/09/15 职场文书
学校重阳节活动总结
2015/03/24 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
交通事故案件代理词
2015/05/23 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript