ubuntu系统THETA S全景相机 通过ROS图像变换

本文介绍如何在Ubuntu系统中,通过ROS订阅THETA S全景相机的/image_raw话题,并对其进行图像变换,提升从鱼眼图像到全景图像的转换效率。文章提到了对原始Python程序的优化,加快了每张图片的变换速度,并推荐了等距摄影的变换方法,以获得最佳效果。同时,指出了OpenCV版本对程序运行的影响,建议使用3.x版本,并给出了C++程序示例,进一步减少了延迟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python / C++

上一篇博客,Theta S相机连通到ROS系统后,图像矩阵发布到了 /image_raw话题上。我们先启动一下上一篇博客中的 libuvc_camera.launch 文件,这时图像已经传到了 /image_raw 话题上,开一个新的终端用rostopic list查看一下存在的话题。在这里插入图片描述
图像信息就在 /image_raw 话题上, 写一个下面这样的程序订阅一下。原图像就可以看到是下面这样的。

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*
import rospy
from sensor_msgs.msg import Image
import cv2
import cv_bridge


class ImgTran:
  def __init__(self):
    self.bridge = cv_bridge.CvBridge()
    self.image_sub = rospy.Subscriber('/image_raw', Image, self.image_callback)

  def image_callback(self,msg):
    image = self.bridge.imgmsg_to_cv2(msg,desired_encoding='bgr8')
    cv2.imshow("a",image)
    cv2.waitKey(1)
    
if __name__ == "__main__":    
    rospy.init_node('Transform')
    it = ImgTran()
    rospy.spin()

在这里插入图片描述
然而,这样的图像并不是全景图像,只是Theta S相机正反两个镜头的鱼眼图像。需要对两个图像进行变换, 具体方法在一个日本博客上找到了方法有好几种(总共有5种),数学原理没怎么仔细看懂,但是博主写的python程序效率偏低(基本全是for循环),实时变换效果不好。我把原程序改进了一下每张图片变换速度差不多提升了n多倍。程序如下。

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*
import rospy
from sensor_msgs.msg import Image
import cv2
import cv_bridge
import numpy as np

# 全局变量
vertex = 640
map_x = np.zeros((vertex, vertex*2))
map_y = np.zeros((vertex, vertex*2))

def initMatrix():
    src_cx = 319
    src_cy = 319
    src_r = 283 
    src_cx2 = 961 

    range_arr_y = np.array([range(vertex)])
    range_arr_x = np.array([range(vertex*2)])
    phi1 = (np.pi * range_arr_x) / vertex
    theta1 = (np.pi * range_arr_y.T) / vertex

    X = np.sin(theta1) * np.cos(phi1)
    Y = np.sin(theta1) * np.sin(phi1)
    Z = np.cos(theta1)

    phi2 = np.arccos(
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值