【ros学习-课设-人脸识别追踪】

课程设计开发空间

更新1:使用ros工具包标定USB单目相机


文章目录

  • 课程设计开发空间
  • 前言
  • 一、pip换源
  • 二、安装opencv-python
  • 三、相机标定
    • 安装ros标定功能包
    • 相机标定
  • 三、opencv调用摄像头视频流
  • 总结


前言

没哈前言,第一篇博客,多多关照
环境:Ubuntu20.04
已安装ros
暂时还没有使用anaconda进行python环境管理


一、pip换源

要安装opencv-python,先换个源:
pip国内的一些镜像
  阿里云 http://mirrors.aliyun.com/pypi/simple/
  中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
  豆瓣(douban) http://pypi.douban.com/simple/
  清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
  中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
  
修改源方法:

  1. 临时使用:
    可以在使用pip的时候在后面加上-i参数,指定pip源
pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
  1. 永久换源:

创建~/.pip/pip.config文件,在里面写:

[global]

index-url = https://pypi.tuna.tsinghua.edu.cn/simple

[install]

trusted-host=mirrors.aliyun.com

二、安装opencv-python

直接安装就能成功:

pip install opencv-python

三、相机标定

安装ros标定功能包

sudo apt-get install ros-noetic-camera-calibration

运行指令:

终端1:roslaunch usb_cam usb_cam-test.launch
终端2:rosrun camera_calibration cameracalibrator.py  --size 8x6 --square 0.019 image:=/usb_cam/image_raw camera:=/usb_cam

参数说明:
size:为棋盘格格数比 square:为棋盘格长度
image:ros中视频流话题,此处我们使用usb_cam功能包发布了话题:/usb_cam/image_raw,对应数据类型:sensor_msgs/Image
camera:指定摄像机节点

使用rqt_graph可视化工具可以看出订阅关系:
【ros学习-课设-人脸识别追踪】_第1张图片

相机标定

在可视化标定工具中不断移动标定板,直到x,y,size,skew下面的进度条全部为绿色,标定完成

【ros学习-课设-人脸识别追踪】_第2张图片完成后点击save,可以保存配置,在终端界面可以看到标定的参数,以及保存路径:
【ros学习-课设-人脸识别追踪】_第3张图片找到保存路径下的压缩包,解压后可以看到:
【ros学习-课设-人脸识别追踪】_第4张图片其中ost.yaml文件即为我们需要的相机畸变矫正配置文件,将其放在自己工作空间下使用即可。

三、opencv调用摄像头视频流

安装oepncv-python,以及ros中的opencv

sudo apt-get install ros-noetic-vision-opencv libopencv-dev 
pip install opencv-python

ROS与Opencv之间的数据连接是通过CvBridge来实现的。
上代码:

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
# 代码实现使用usb_cam包获取usb视频流后,将其从ros数据格式转换为opencv数据格式,然后又转换为了ros发布出去
import rospy
import cv2
from cv_bridge import CvBridge,CvBridgeError
from sensor_msgs.msg import Image

class image_converter:
    def __init__(self):    
        # 创建cv_bridge,声明图像的发布者和订阅者
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)
    def callback(self,data):
        # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
        except CvBridgeError as e:
            print(e)
        # 在opencv的显示窗口中绘制一个圆,作为标记
        (rows,cols,channels) = cv_image.shape
        if cols > 60 and rows > 60 :
            cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)
        # 显示Opencv格式的图像
        cv2.imshow("Image window", cv_image)
        cv2.waitKey(3)
        # 再将opencv格式额数据转换成ros image格式的数据发布
        try:
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
        except CvBridgeError as e:
            print(e)


if __name__ == '__main__':
    try:
        # 初始化ros节点
        rospy.init_node("cv_bridge_test")
        rospy.loginfo("Starting cv_bridge_test node")
        image_converter()
        rospy.spin()
    except KeyboardInterrupt:
        print("Shutting down cv_bridge_test node.")
        cv2.destroyAllWindows()

上命令:

roslaunch usb_cam usb_cam-test.launch
rosrun 以上python文件

总结

`借鉴博主:https://zhiqianghe.blog.csdn.net/article/details/84100948

以后在更新,最近挺忙。

你可能感兴趣的:(自动驾驶,python,ubuntu)