【问题标题】:How to get bird view image which is synthized four side images?(get AVM: around view monitoring)如何获得四面图像合成的鸟瞰图?(获取AVM:环视监控)
【发布时间】:2021-04-13 19:08:03
【问题描述】:

您好,我正在通过从四个鱼眼摄像头获取四个侧面图像来制作 avm(环视监控)图像。这是 AVM 的示例图像。

这个过程分为三个部分:

  1. 校准鱼眼图像/视频/流媒体
  2. 获取俯视图(鸟瞰图)图像
  3. 合成四张侧图得到avm图像

我已经完成了第 1 部分和第 2 部分,但我在做第三部分时遇到了麻烦。我对其进行了研究,发现它可能与“拼接”或“numpy 数组”有关。但是虽然我阅读了文档,但我不知道该怎么做。

存在 4 个角重叠(左上、右上、左下、右下)。固定了 4 个摄像头。我不知道如何合成四张图片,目前的结果图片如下:

enter image description here

我使用 np.hstack 缝合三个视图(左视图、中间视图、右视图) (见鸟瞰图)

如果您对此有所了解,请发表评论并分享您的想法。

感谢您的阅读。 (我用的是opencv、python、raspberrypi 4B)

代码:

import cv2
import numpy as np
import imutils
from Camera.Undistortion import UndistortFisheye
from Camera.PerspectiveTransformation import EagleView
# from Camera.Stitcher import stitchTwoImages
import time

class avm:
    def __init__(self):
        self.__leftCamera = UndistortFisheye("left_Camera")
        self.__rightCamera = UndistortFisheye("right_Camera")

        self.__leftEagle = EagleView()
        self.__rightEagle = EagleView()
        # self.__frontEagle.setDimensions((149, 195), (439, 207), (528, 380), (37, 374))
        # self.__backEagle.setDimensions((164, 229), (469, 229), (588, 430), (45, 435))
        
        #reset left/right setDimensions
        self.__leftEagle.setDimensions((186, 195), (484, 207), (588, 402), (97, 363))
        self.__rightEagle.setDimensions((171, 240), (469, 240), (603, 452), (52, 441))
        # self.__leftEagle.setDimensions((186, 195), (484, 207), (588, 402), (97, 363))
        # self.__rightEagle.setDimensions((171, 240), (469, 240), (603, 452), (52, 441))

        self.__middleView = None
        self.__counter = 0

        # self.stitcher = stitchTwoImages("Bottom2Upper")
        # self.upper = None
        # self.bottom = None
    
    def runAVM(self, leftFrame, rightFrame):
        leftView = self.__leftCamera.undistort(leftFrame)
        topDown_left = self.__leftEagle.transfrom(leftView)
        rightView = self.__rightCamera.undistort(rightFrame)
        topDown_right = self.__rightEagle.transfrom(rightView)
        # topDown_Back = cv2.flip(topDown_Back, 1) #flip left/right

        topDown_left , topDown_right = self.__reScale(topDown_left, topDown_right)
        # stitchingResult = self.__startStitching(topDown_Front)
        middleView = self.__getMiddleView(topDown_left)
        birdView = np.hstack((topDown_left, middleView, topDown_right))
        return birdView
    
    def __reScale(self, topDown_left, topDown_right):
        width_leftView = topDown_left.shape[1]
        width_rightView = topDown_right.shape[1]
        height_leftView = topDown_left.shape[0]
        height_rightView = topDown_right.shape[0]
        if height_leftView > height_rightView:
            newHeight = height_rightView
            ratio = height_rightView/height_leftView
            newWidth = int(ratio * width_leftView)
            topDown_left = cv2.resize(topDown_left, (newWidth, newHeight))
        else:
            newHeight = height_leftView
            ratio = height_leftView/height_rightView
            newWidth = int(ratio * width_rightView)
            topDown_right = cv2.resize(topDown_right, (newWidth, newHeight))
        
        return topDown_left, topDown_right
    
    def __getMiddleView(self, topDown_left):
        # the length of the image represents the distance in front or back of the car
        width_leftView = topDown_left.shape[1]
        if self.__middleView is None:
            realWidth_leftView = 13 # unit is cm
            realWidth_MiddleView = 29.5 # unit is cm
            ratio = int(width_leftView/realWidth_leftView)
            width_MiddleView = int(realWidth_MiddleView * ratio)
            height_MiddleView = int(topDown_left.shape[0])  
            self.__middleView = np.zeros((height_MiddleView, width_MiddleView//2, 3), np.uint8)
            # print(ratio)
        # else:
        #     #  self.__middleView[0:stitchingResult.shape[0], :]

        return self.__middleView

    # def __startStitching(self, accView):
    #     if self.bottom is None:
    #         self.bottom = accView
    #         return None
    #     else:
    #         # time.sleep(0.5)
    #         self.upper = accView
    #         self.bottom = self.stitcher.stitch(self.bottom, self.upper)
    #         cv2.imshow("Result", self.bottom)
    #         height = accView.shape[0]
    #         return self.bottom[height:self.bottom.shape[0], :]

标签: python opencv computer-vision


【解决方案1】:

您可以使用hstackvstack 来获取您正在寻找的awm 视图。只需确保各个图像的方向与我正在创建的以下随机图像相同。 (如果需要,请使用np.rot90

#Assume you have 4 views
leftview = np.random.random((508, 221, 3)) #tall image
rightview = np.random.random((508, 221, 3)) #tall image
frontview = np.random.random((221, 508, 3)) #wide image
backview = np.random.random((221, 508, 3)) #wide image

#Creating color differences to view better. 
#IGNORE THIS PART OF CODE
leftview[:,:,0]=1
rightview[:,:,1]=1
frontview[:,:,0:2]=1
backview[:,:,1:3]=1

#Calculate centerview size
width = frontview.shape[1]-(leftview.shape[1]*2)
height = leftview.shape[0]
centerview = np.zeros((height,width,3))

#Hstack the l,c,r views and then Vstack it between the f, b views
lr = np.hstack([leftview,centerview,rightview])
ud = np.vstack([frontview, lr, backview])

#Plot the new image
fig = plt.figure(figsize=(5,8))
plt.imshow(ud)

【讨论】:

  • 哇。这就是我期望创造的。十分感谢!!!更进一步,我会将图像输入到随机图像站点。以后有什么问题我会再联系的。
  • 当然,很高兴为您提供帮助。它解决了您的问题,然后标记解决方案,因为它鼓励我帮助您解决未来的问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多