OpenCV实现机器人对物体进行移动跟随的方法实例

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()

实际效果图

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机器人对物体移动跟随内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • OpenCV利用背景建模检测运动物体

    本文实例为大家分享了OpenCV利用背景建模检测运动物体的具体代码,供大家参考,具体内容如下 #include <opencv\highgui.h> #include <stdio.h> int main( int argc, char** argv ){ IplImage* pFrame = NULL; IplImage* pFrImg = NULL; IplImage* pBkImg = NULL; CvMat* pFrameMat = NULL; CvMat* pFrMat

  • opencv+arduino实现物体点追踪效果

    本文所要实现的结果是:通过在摄像头中选择一个追踪点,通过pc控制摄像头的舵机,使这一点始终在图像的中心. 要点:使用光流法在舵机旋转的同时进行追踪,若该点运动,则摄像头跟踪联动. #include<opencv2\opencv.hpp> #include<opencv\cv.h> #include<opencv\highgui.h> #include<math.h> #include<Windows.h> #include<string.h

  • OpenCV3.0+Python3.6实现特定颜色的物体追踪

    一.环境 win10.Python3.6.OpenCV3.x:编译器:pycharm5.0.3 二.实现目标 根据需要追踪的物体颜色,设定阈值,在视频中框选出需要追踪的物体. 三.实现步骤 1)根据需要追踪的物体颜色,设定颜色阈值,获取追踪物体的掩膜 代码:generate_threshold.py # -*- coding : utf-8 -*- # Author: Tom Yu import cv2 import numpy as np cap = cv2.VideoCapture(0)#获

  • 使用Python和OpenCV检测图像中的物体并将物体裁剪下来

    介绍 硕士阶段的毕设是关于昆虫图像分类的,代码写到一半,上周五导师又给我新的昆虫图片数据集了,新图片中很多图片很大,但是图片中的昆虫却很小,所以我就想着先处理一下图片,把图片中的昆虫裁剪下来,这样除去大部分无关背景,应该可以提高识别率. 原图片举例(将红色矩形框部分裁剪出来)): step1:加载图片,转成灰度图 image = cv2.imread("353.jpg") gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) step2:用Sob

  • python+opencv实现动态物体识别

    注意:这种方法十分受光线变化影响 自己在家拿着手机瞎晃的成果图: 源代码: # -*- coding: utf-8 -*- """ Created on Wed Sep 27 15:47:54 2017 @author: tina """ import cv2 import numpy as np camera = cv2.VideoCapture(0) # 参数0表示第一个摄像头 # 判断视频是否打开 if (camera.isOpened()

  • python+opencv实现动态物体追踪

    简单几行就可以实现对动态物体的追踪,足见opencv在图像处理上的强大. python代码: import cv2 import numpy as np camera=cv2.VideoCapture(0) firstframe=None while True: ret,frame = camera.read() if not ret: break gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) gray=cv2.GaussianBlur(gray,(21

  • python3+opencv3识别图片中的物体并截取的方法

    如下所示: 运行环境:python3.6.4 opencv3.4.0 # -*- coding:utf-8 -*- """ Note: 使用Python和OpenCV检测图像中的物体并将物体裁剪下来 """ import cv2 import numpy as np # step1:加载图片,转成灰度图 image = cv2.imread("353.jpg") gray = cv2.cvtColor(image, cv2.C

  • Opencv光流运动物体追踪详解

    光流的概念是由一个叫Gibson的哥们在1950年提出来的.它描述是空间运动物体在观察成像平面上的像素运动的瞬时速度,利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法.那么所说的光流到底是什么? 简单来说,上图表现的就是光流,光流描述的是图像上每个像素点的灰度的位置(速度)变化情况,光流的研究是利用图像序列中的像素强度数据的时域变化和相关性来确定各自像素位置的"运动".研究光流场的目的就是为了从

  • 如何用OpenCV -python3实现视频物体追踪

    opencv OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口.该库也有大量的Python.Java and MATLAB/OCTAVE(版本2.

  • 基于OpenCv的运动物体检测算法

    基于一个实现的基于OpenCv的运动物体检测算法,可以用于检测行人或者其他运动物体. #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> int main( int argc, char** argv ) //声明IplImage指针 IplImage* pFrame = NULL; IplImage* pFrImg = NULL; IplImage* pBk

随机推荐