更新1:使用ros工具包标定USB单目相机
没哈前言,第一篇博客,多多关照
环境:Ubuntu20.04
已安装ros
暂时还没有使用anaconda进行python环境管理
要安装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/
修改源方法:
pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
创建~/.pip/pip.config文件,在里面写:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com
直接安装就能成功:
pip install opencv-python
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:指定摄像机节点
在可视化标定工具中不断移动标定板,直到x,y,size,skew下面的进度条全部为绿色,标定完成
完成后点击save,可以保存配置,在终端界面可以看到标定的参数,以及保存路径:
找到保存路径下的压缩包,解压后可以看到:
其中ost.yaml文件即为我们需要的相机畸变矫正配置文件,将其放在自己工作空间下使用即可。
安装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
以后在更新,最近挺忙。