从开源项目聊鱼眼相机的“360全景拼接”

这篇具有很好参考价值的文章主要介绍了从开源项目聊鱼眼相机的“360全景拼接”。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

概述

从360全景的背景讲起

跨过参数标定聊透视变化

拼接图片后处理

参考文献


概述

        写这篇文章的原因完全源于开源项目(GitHub参阅参考文献1)。该项目涵盖了环视系统的较为全貌的制作过程,包含完整的标定、投影、拼接和实时运行流程。该篇文章主要是梳理全景拼接技术中的一些实现细节,并在些地方记录了自己的思考。鉴于该开源项目,后续将计划:(1)基于自动驾驶车辆环视相机标定参数(内外参), 完成360全景拼接demo;(2)这篇文章要跳过的参数标定环节,后面要单独拿出篇幅详析。

从360全景的背景讲起

        百度百科:“360度全景倒车影像,是一套通过车载显示屏幕观看汽车四周360度全景融合,超宽视角,无缝拼接的适时图像信息(鸟瞰图像),了解车辆周边视线盲区,帮助汽车驾驶员更为直观、更为安全地停泊车辆的泊车辅助系统,又叫全景泊车影像系统或全景停车影像系统(有别于市面上把汽车四周画面在显示屏幕上进行分割显示的“全景”系统)。”

鱼眼摄像头 四个拼接算法,自动驾驶,自动驾驶
源自网络,如侵联删

        说的通俗些,360全景影像给人视觉上呈现的就是鸟瞰图,即从天空望车顶或者地面的俯视图,但俯视效果的实现是通过多个视角的照片拼接而成的。如下图所示,我们观察自己的车就能发现在车的前后左右四个方向上都有一个鱼眼相机,一般左右方向的鱼眼相机因为视野的问题布置在后视镜下方的比较多。

鱼眼摄像头 四个拼接算法,自动驾驶,自动驾驶
源自网络,如侵联删

        把四个鱼眼相机通过一定的方法拼接到一张图上,再把车辆照片贴到图片中央,就能近似形成完成的全景图像。下图所示的就是开源项目中所使用的的四路鱼眼相机的前、后、左、右方向的照片。

鱼眼摄像头 四个拼接算法,自动驾驶,自动驾驶

跨过参数标定聊透视变化

        写这篇文章的重点是要梳理如何从鱼眼图片透视变换为全景图片,相机的内外参标定跳过。要完成从单目鱼眼图到鸟瞰图的变化,最重要的一步骤就是完成如下从左图到右图的投影变换,也叫做透视变换。

鱼眼摄像头 四个拼接算法,自动驾驶,自动驾驶

        从左侧到右侧的变化是通过如下表达式实现的。我这里插一句,有同学将透视矩阵叫做外参,我认为这种说法是牵强的。为了说明这个问题,我们就先在世界坐标系下讨论,其他坐标系一样的道理。

鱼眼摄像头 四个拼接算法,自动驾驶,自动驾驶
源自网络,如侵联删
  1. 请参上式,基于将像素坐标反投回世界坐标系,需要内外参。所以即便透视后就是世界坐标,透视矩阵能只叫外参吗?
  2. 其次透视转换后得到的坐标定义为世界坐标是否合适?因为每个视角的透视变换是分离的,并不在同一坐标下。
  3. 还有像素坐标到世界坐标得到的是归一化平面下的世界坐标,非严格意义的世界坐标,那透视转换后得到的坐标定义为世界坐标是否准确?

        以上三个问题抛砖引玉,愿与大家探讨。我也计划分别针对“相机内参”和“实车全景拼接”再写两篇文章专门从数据上来验证这个事情。

鱼眼摄像头 四个拼接算法,自动驾驶,自动驾驶
引用自: Perspective Transformation | TheAILearner
鱼眼摄像头 四个拼接算法,自动驾驶,自动驾驶
引用自: Perspective Transformation | TheAILearner

        上面的公式解释了透视变换矩阵及其元素物理意义,感兴趣可直接到原文地址拜读。下面对于透视变换的图例描述的也挺形象的

鱼眼摄像头 四个拼接算法,自动驾驶,自动驾驶
引用自: Perspective Transformation | TheAILearner

        作者针对四路鱼眼图都进行了同样的透视变换。但在实施投影之前还有个重要的工作,就是图像去畸变,并在去畸变的过程中做一些视野范围的校正。

鱼眼摄像头 四个拼接算法,自动驾驶,自动驾驶

鱼眼摄像头 四个拼接算法,自动驾驶,自动驾驶
源自网络,如侵联删

        关于CV库去畸变方法中的矫正矩阵:参考上式,如果你推导过内参矩阵对应元素位置数值的话,应该很清楚在对应非零元素位置乘系数的作用就是:完成像素坐标在各轴线的放缩及平移。而在图像大小已定义的情况下,这个变化的作用无异于“裁剪”的效果。这样一来,就完成了去畸变的工作。

def update_undistort_maps(self):
    new_matrix = self.camera_matrix.copy()
    # 校正内参
    new_matrix[0, 0] *= self.scale_xy[0]
    new_matrix[1, 1] *= self.scale_xy[1]
    new_matrix[0, 2] += self.shift_xy[0]
    new_matrix[1, 2] += self.shift_xy[1]
    width, height = self.resolution

    self.undistort_maps = cv2.fisheye.initUndistortRectifyMap(
        self.camera_matrix,
        self.dist_coeffs,
        np.eye(3),
        new_matrix,
        (width, height),
        cv2.CV_16SC2
    )
    return self

def undistort(self, image):
    print("undistort_maps: ", self.undistort_maps)
    result = cv2.remap(image, *self.undistort_maps, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
    return result

        进一步的我们开始处理透视变换:透视变换需要提供输入图片及其变换矩阵。变换矩阵的变换可参考源码,基本的道理就是假设真实世界中的标定布的尺寸缩放出几个点的对应坐标数值,将其作为dst、原鱼眼图片对应位置的坐标作为src,通过getPerspectiveTransform方法获取,此处不赘述,后续会写相关文章。 

def project(self, image):
    result = cv2.warpPerspective(image, self.project_matrix, self.project_shape)
    return result

        下一步要将各个视角的透视图拼起来:这里需要梳理清楚的主要是各个图的相对位置和方向的关系。由于各个视角的透视变换图都是单独处理的,相当于是摄像头的朝向,所以对于后方摄像头需要做中心变换贴在鸟瞰图的上方,左侧摄像头视图需要左旋放在左侧,右侧如法。

def flip(self, image):
    if self.camera_name == "front":
        return image.copy()
    elif self.camera_name == "back":
        return image.copy()[::-1, ::-1, :]
    elif self.camera_name == "left":
        return cv2.transpose(image)[::-1]
    else:
        return np.flip(cv2.transpose(image), 1)

拼接图片后处理

        最后阶段的鸟瞰图的拼接与平滑,不作为文章的重点赘述,但主要涉及到了几种策略:

birdview = BirdView()
Gmat, Mmat = birdview.get_weights_and_masks(projected)
birdview.update_frames(projected)
birdview.make_luminance_balance().stitch_all_parts()
birdview.make_white_balance()
birdview.copy_car_image()
  • 重叠区域中的像素值的加权平均处理
  • 为拼接图像的亮度一致性调整各区域的亮度
  • 通过色彩平衡改善摄像头不同通道的强度不同的问题

鱼眼摄像头 四个拼接算法,自动驾驶,自动驾驶

参考文献

[1]  https://github.com/neozhaoliang/surround-view-system-introduction文章来源地址https://www.toymoban.com/news/detail-763174.html

到了这里,关于从开源项目聊鱼眼相机的“360全景拼接”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA VR摄像机-拍摄和拼接立体 360 度视频

    本文介绍的是 FPGA VR 相机的第二个版本,第一个版本是下面这样: 第一版地址: ❝ https://hackaday.io/project/26974-vr-camera-fpga-stereoscopic-3d-360-camera ❞ 本文主要介绍第二版本,第二版本的 VR 摄像机,能够以 30fps 的速度拍摄 4k(3840 x 1920)立体 360 度视频,同时在摄像机上实时拼接

    2024年02月11日
    浏览(39)
  • AMEYA360报道:潜望式镜头解决手机摄像头模组挑战

    潜望式镜头的内部结构组成一部分是棱镜,棱镜通过反射光线使得原本垂直进入手机背部的光线能够弯折一定角度后平行于手机背板方向进入。第二部分是VCM音圈马达,可以实现自动对焦功能,调节镜头的位置呈现清晰的图像。第三部分是镜头模组,最后一部分则是CMOS。 潜

    2024年02月15日
    浏览(46)
  • Carla自动驾驶仿真六:pygame多个车辆摄像头画面拼接

    此文章主要介绍carla前后左右摄像头画面拼接到pygame上 1、使用carla做仿真测试或者开发时,如果能够将车辆周边的画面拼接并渲染,可以直观地查看周围地环境,便于调试。本文将介绍使用carla中的camera传感器监控自车周边的画面,并通过pygame可视化。 1、如果摄像头的横向分

    2024年01月16日
    浏览(51)
  • 7款家用智能摄像头横评:小米、乐橙、TP-LINK、海康威视、360、智汀、华为

    相信很多人都买过家用监控摄像头,有的是为了及时查看家里的老人孩子的动态,有的是为了看家里宠物,遇到小偷时还能拍下面貌。但市场上五花八门的监控摄像头,各种功能让人看花了眼。 于是呢?为了让大家更了解智能摄像头,今天我们来测下市面上比较靠前小米、乐

    2024年02月12日
    浏览(45)
  • macOS编译开源全景拼接库OpenPano

    1. 准备工具 clang与cmake 如果要处理png文件要下载安装libjpeg  安装相当依赖:    2.克隆源码 3.编译 创建编译目录build并进入build 然后cmake .. 开始生成makefile 最后make进行编译 编译中...   找不到omp.h  查找 omp.h 复制到src目录中    出现: ld: symbol(s) not found for architecture x86_64   出错

    2024年02月11日
    浏览(38)
  • Android相机调用-CameraX【外接摄像头】【USB摄像头】

    Android相机调用有原生的Camera和Camera2,我觉得调用代码都太复杂了,CameraX调用代码简洁很多。 说明文档:https://developer.android.com/jetpack/androidx/releases/camera?hl=zh-cn 现有查到的调用资料都不够新,对于外接摄像头(USB摄像头)这类非前置也非后置摄像头的设备调用,都说是没有实

    2024年02月09日
    浏览(55)
  • OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136616551 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、

    2024年03月13日
    浏览(48)
  • 将运动相机作为电脑摄像头 - 以Windows+SJCAM C100+为例

    确保相机是 关机状态 (因为接下来要取出SD卡,为保证数据安全)。 取出SD卡。 SD卡会让你的电脑认为它是U盘,所以不需要SD卡。 注意: SD卡移除的方式是按压弹出。 使用MicroUSB线连接你的电脑。 打开Windows自带的相机app。 等待显示画面。 看不懂的可以直接参考这个视频:

    2024年02月16日
    浏览(78)
  • Android中相机(Camera)画面旋转角度分析:手机摄像头的“正向”、手机画面自然方向、相机画面的偏转角度

    #.概述:     1.如同人眼看东西分上下一样,摄像头也有其“正向”,正常情况下,Android手机后置、前置摄像头的“正向”朝向为手机的“右侧”(默认如此,除非手机厂商修改设置)。 (这里运行代码做过测试发现,前置摄像头也是以右侧为正向,而不是有些资料上说的

    2024年02月14日
    浏览(81)
  • ubuntu20.04下的USB摄像头使用与标定(单目相机)一.使用

    A.查找摄像头接口 B.在该路径下修改launch文件,换成你自己的摄像头接口 C.运行摄像头节点(此时就能看到画面了) ⭐可能会出现的错误 1.终端会warning是因为还没有进行摄像头标定,后续会进行讲解 2.若用的是虚拟机但发出了error,看看你的usb是接入3.0还是2.0处,然后在如下

    2024年02月04日
    浏览(170)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包