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 27 Python
python简单实现基数排序算法
May 16 Python
Python元字符的用法实例解析
Jan 17 Python
在Python中增加和插入元素的示例
Nov 01 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
pycharm访问mysql数据库的方法步骤
Jun 18 Python
python实现大文件分割与合并
Jul 22 Python
python将字典列表导出为Excel文件的方法
Sep 02 Python
如何使用python代码操作git代码
Feb 29 Python
Python Scrapy多页数据爬取实现过程解析
Jun 12 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
Nov 28 Python
Python绘画好看的星空图
Mar 17 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
一些星际专用术语解释
2020/03/04 星际争霸
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
php 购物车完整实现代码
2014/06/05 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
phpinfo的知识点总结
2019/10/10 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
javascript jq 弹出层实例
2013/08/25 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
基于javascript代码实现通过点击图片显示原图片
2015/11/29 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
vue实现路由不变的情况下,刷新页面操作示例
2020/02/02 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
[01:01:22]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python 图片验证码代码分享
2012/07/04 Python
python简单实现刷新智联简历
2016/03/30 Python
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
幼儿生日活动方案
2014/08/27 职场文书
项目建议书
2015/02/04 职场文书
Python开发五子棋小游戏
2022/05/02 Python