ROS机器视觉自学笔记(1)

本文档记录了使用ROS和OpenCV进行目标检测和跟踪的步骤。首先介绍了如何在ROS中安装OpenCV库,接着通过HSV颜色通道进行目标物体的颜色识别,详细讲解了HSV颜色模型和USB摄像头驱动的安装。然后通过获取目标物体的HSV值并设置阈值进行目标检测,展示了目标检测的代码实现。最后,简述了基于检测到的目标位置信息进行目标跟踪的原理和代码。整个过程中,作者分享了学习ROS和视觉处理的经验,并鼓励读者互动交流。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近在做毕设,内容是交通信号灯和交通标识识别,并作出相应的移动。需要用到ROS以及Opencv的一些相关知识,用优快云也两三年了,但是没有自己发过帖子,于是突发奇想开个帖子分享一下学习进度,记录一下学习过程有利最后的论文写作的同时,遇到问题也可以向大佬们寻求一下帮助。也欢迎朋友在评论区进行一些讨论,毕竟相互学习才能进步更快。
我也是第一次用ROS做开发,在虚拟机上用Ubuntu20.04学习的.作为一个编程基础差的,在ros入门阶段就遇到很多问题。目前对于ROS的了解也不多,只是自学了一下官网的第一章基本教程和在B站看了古月居的ROS21讲,了解了一下基本的一些ROS通讯原理,自己执行了一下官网的python节点和话题定义,服务和客户定义。中文ROS官网的链接是这个ros中文入门教程
下面的学习笔记全是基于古月居的机器人视觉入门的教程来进行展开的。


一、ros中安装Opencv

首先就是安装Opencv库到ros中,只需要在终端中输入以下命令,将其中的noetic换成自己所用ros的版本名就可以安装函数库了。

sudo apt-get install ros-noetic-vision-opencv libopencv-dev python3-opencv

我这边因为之前装过,所以显示没有更新的。
在这里插入图片描述

二、使用HSV通道实现目标检测

这里我用的是古月的机器人视觉入门的教程,github的链接在这里古月居机器人视觉入门

1.HSV颜色通道简介

下面是百度百科对于HSV颜色通道的介绍:HSV颜色通道
我对于它的理解是一个更加符合人眼对颜色描述的通道,不同于RGB或则其他通道,HSV通道是直接面向用户,能更好的直接描述颜色,比如什么颜色,饱和度是多少,亮度是多少。HSV通道也有三个值,分别为色调(H)、饱和度(S)和明度(V)。

色调(H)使用的HSV锥形模型进行定义,取值范围是0°~360°。开始0°为红色,逆时针旋转计算,绿色为120°,蓝色为240°。
饱和度(S)取值范围为0-100,值越大,颜色饱和度越高。
亮度(V)取值范围也是0-100,值越大,颜色越明亮。

2. 安装USB摄像头驱动

首先安装ROS的usb驱动,在终端输入以下命令

sudo apt-get install ros-noetic-usb-cam

显示安装成功就可以运行usb摄像头驱动了。因为我目前没有拿到实物的小车,所以摄像头用的是笔记本自带的。这里运行一下自带的测试文件。

roslaunch usb_cam usb_cam-test.launch

运行后就可以看到摄像头被打开,框里的图像就是目前ros发布的图像话题内的内容。
在这里插入图片描述
然后就可以用ros中的小工具Image_view(在一个新的终端输入rqt_image_view)来做进行话题的订阅和显示。
在这里插入图片描述
可以看到有五个不同的话题,针对不同的需求可以选择订阅。到此ros摄像头驱动安装成功,其他节点可以通过订阅该节点来获取摄像头的实时数据。


3. 获取HSV值

下一步要学习的就是怎么获得目标物体的HSV值,这里用的目标物的图片直接是教程里给到的一张图,我们的目的是提取图中红色部分的HSV值。这样在后面进行目标物体阈值设置的时候就可以将所有含有目标物体颜色像素点提取出来。这里提取目标HSV值的方法的是用一个叫做hsv_test.py的脚本,代码如下:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import cv2

img = cv2.imread('image.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 转化为灰度通道
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 转化为HSV通道


def mouse_click(event, x, y, flags, para):
    if event == cv2.EVENT_LBUTTONDOWN:  # 左边鼠标点击,可以根据自己的需求来选择想要的通道值
        #print('PIX:', x, y)
        #print("BGR:", img[y, x])
        #print("GRAY:", gray[y, x])
        print("HSV:", hsv[y, x])


if __name__ == '__main__':
    cv2.namedWindow("img")# 创建一个名为img的图片窗口
    cv2.setMouseCallback("img", mouse_click)
    while True:
        cv2.imshow('img', img)
        if cv2.waitKey() == ord('q'):
            break
    cv2.destroyAllWindows()

使用以下命令行即可将limo_visions/scripts目录下的图像读取出来。

roscd limo_visions/scripts/&& python hsv_test.py

这个代码运行不了可以试试将python改成python3. 运行后的效果如下
在这里插入图片描述
可以看到通过点击图片窗口可以得到任意像素点的HSV通道值。可以看到,虽然肉眼看到的颜色差不多,但是HSV值还是存在一定的差异,所以在后面的代码中设置阈值是会设置一个范围而不是单纯的设置一个值。

4.目标检测

现在得到目标的颜色阈值以后就可以代码来实现目标的检测并返回目标物的位置信息了。整体的思路是根据目标物体的颜色设置一个HSV的阈值范围。第一步通过高斯滤波将图片平滑化,在转化到HSV通道,这时将阈值范围内的像素点保留,将阈值范围外的像素点去除。然后就是找到所有保留下的像素点的轮框。这时还会存在除主要目标物轮框外的其他轮框,可以选择将较小的方框剔除,保留最大的,就是我们需要目标物体的轮框。

这里使用到关于ROS的内容是,这个节点会发布一个名叫object_detect_image的话题,话题的内容有两个,self.image_pub 和self.target_pub,分别代表着检测到目标物后的图像和检测到的目标物的位置信息。通过该节点还会订阅一个话题/camera/rgb/image_raw,就是上面提到的摄像头发布的话题数据。需要注意的是,从摄像头直接得到的话题数据并不能直接用来进行Opencv的一些操作,需要用到一个cv_bridge的功能包进行转化。所以需要在订阅到图片时和完成图像处理后分别进行两次转换。

具体的代码如下所示:

`#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2021 PS-Micro, Co. Ltd.
#
# SPDX-License-Identifier: Apache-2.0
#

import time

import rospy
import cv2
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import</
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值