Carla自動駕駛仿真六:pygame多個車輛攝像頭畫面拼接

此文章主要介紹carla前后左右攝像頭畫面拼接到pygame上

文章目錄

  • 前言
  • 一、要點分析
  • 二、完整代碼
  • 三、拼接效果
  • 四、總結


前言

1、使用carla做仿真測試或者開發時,如果能夠將車輛周邊的畫面拼接并渲染,可以直觀地查看周圍地環境,便于調試。本文將介紹使用carla中的camera傳感器監控自車周邊的畫面,并通過pygame可視化。

一、要點分析

1、如果攝像頭的橫向分辨率image_x如果不為192的倍數,可能會導致內存對齊問題,拼接效果則會出現閃屏;調試了很久才發現這個規律,知道具體原因的大佬可以交流下,猜測是顯卡解析相關導致。即:Image_x = 192 * N (N為正整數),下圖為分辨率不為192倍數的拼接情況。

在這里插入圖片描述

2、camera.listen(lambda data : callback(data)),listen方法是carla中用于設置攝像頭傳感器的回調函數的。當攝像頭傳感器捕獲到新的圖像數據image時,它會調用這個回調函數,并將圖像數據image作為參數傳遞給它。下圖中的cala.SensorData就是carla.Image,具體更多內容可以到carla官網查看。

在這里插入圖片描述
在這里插入圖片描述

3、使用np.concatenate拼接不同攝像頭的數據。
1)numpy.concatenate是一個用于將多個數組沿指定軸連接在一起的函數。它的基本語法如下:

numpy.concatenate((a1, a2, ...), axis=0)

2)其中,a1, a2, …是你想要連接的數組,axis參數指定了連接的軸。默認情況下,axis是0,這意味著數組將在垂直方向上(即行方向)連接,當axis=1時,數組將在水平方向上(即列方向)連接。

import numpy as npa = np.array([1, 2])
b = np.array([3, 4])
c = np.concatenate((a, b), axis=0)print(c)  # 輸出:[1 2 3 4]==============================a1 = np.array([[1, 2], [3, 4]])
a2 = np.array([[5, 6], [7, 8]])c = np.concatenate((a1, a2), axis=1)print(c)
#輸出
[[1 2 5 6][3 4 7 8]]

二、完整代碼

import carla
import random
import pygame
import numpy as np# 渲染對象來保持和傳遞 PyGame 表面
class RenderObject(object):def __init__(self, width, height):init_image = np.random.randint(0, 255, (height, width, 3), dtype='uint8')self.surface = pygame.surfarray.make_surface(init_image.swapaxes(0, 1))# 相機傳感器回調,將相機的原始數據重塑為 2D RGB,并應用于 PyGame 表面
def pygame_callback(image, side):img = np.reshape(np.copy(image.raw_data), (image.height, image.width, 4))img = img[:, :, :3]img = img[:, :, ::-1]if side == 'Front':global FrontFront = imgelif side == 'Rear':global RearRear = imgelif side == 'Left':global LeftLeft = imgelif side == 'Right':global RightRight = imgif ('Front' in globals() and 'Rear' in globals()and "Left" in globals()and 'Right' in globals()):# 橫向拼接(前后)(左右)攝像頭的畫面img_combined_front = np.concatenate((Front, Rear), axis=1)img_combined_rear = np.concatenate((Left, Right), axis=1)# 縱向拼接(前后)(左右)攝像頭的畫面img_combined = np.concatenate((img_combined_front, img_combined_rear), axis=0)renderObject.surface = pygame.surfarray.make_surface(img_combined.swapaxes(0, 1))class cameraManage():def __init__(self, world, ego_vehicle, pygame_size):self.world = worldself.cameras = {}self.ego_vehicle = ego_vehicleself.image_size_x = int(pygame_size.get("image_x") / 2)  # 橫向放置兩個攝像頭的畫面self.image_size_y = int(pygame_size.get("image_y") / 2)  # 縱向放置兩個攝像頭的畫面def camaraGenarate(self):cameras_transform = [(carla.Transform(carla.Location(x=2.0, y=0.0, z=1.3),  # 前側攝像頭安裝位置carla.Rotation(pitch=0, yaw=0, roll=0)), "Front"),(carla.Transform(carla.Location(x=-2.0, y=0.0, z=1.3),  # 后側攝像頭安裝位置carla.Rotation(pitch=0, yaw=180, roll=0)), "Rear"),(carla.Transform(carla.Location(x=0.0, y=2.0, z=1.3),  # 左側攝像頭安裝位置carla.Rotation(pitch=0, yaw=90, roll=0)), "Left"),(carla.Transform(carla.Location(x=0.0, y=-2.0, z=1.3),  # 右側的攝像頭安裝位置carla.Rotation(pitch=0, yaw=-90, roll=0)), "Right")]# 查找RGB相機藍圖camera_bp = self.world.get_blueprint_library().find('sensor.camera.rgb')# 設置攝像頭的fov為90°camera_bp.set_attribute('fov', "90")# 設置攝像頭的分辨率camera_bp.set_attribute('image_size_x', str(self.image_size_x))camera_bp.set_attribute('image_size_y', str(self.image_size_y))# 生成攝像頭for index, (camera_ts, camera_sd) in enumerate(cameras_transform):camera = self.world.spawn_actor(camera_bp, camera_ts, attach_to=self.ego_vehicle)self.cameras[camera_sd] = camerareturn self.camerasif __name__ == "__main__":# 連接到客戶端并檢索世界對象client = carla.Client('localhost', 2000)world = client.get_world()# 獲取地圖的刷出點spawn_point = random.choice(world.get_map().get_spawn_points())# 生成車輛并設置自動駕駛vehicle_bp = world.get_blueprint_library().filter('*vehicle*').filter('vehicle.tesla.*')[0]ego_vehicle = world.spawn_actor(vehicle_bp, spawn_point)# ego_vehicle.set_autopilot(True)#設置pygame窗口size,image_x為192的整數倍,用其他分辨率會閃屏,可能是顯卡解析原因導致。pygame_size = {"image_x": 1152,"image_y": 600}#調用cameraManage類,生成攝像頭cameras = cameraManage(world, ego_vehicle, pygame_size).camaraGenarate()#采集carla世界中camera的圖像cameras.get("Front").listen(lambda image: pygame_callback(image, 'Front'))cameras.get("Rear").listen(lambda image: pygame_callback(image, 'Rear'))cameras.get("Left").listen(lambda image: pygame_callback(image, 'Left'))cameras.get("Right").listen(lambda image: pygame_callback(image, 'Right'))# 為渲染實例化對象renderObject = RenderObject(pygame_size.get("image_x"), pygame_size.get("image_y"))# 初始化pygame顯示pygame.init()gameDisplay = pygame.display.set_mode((pygame_size.get("image_x"), pygame_size.get("image_y")),pygame.HWSURFACE | pygame.DOUBLEBUF)# 循環執行crashed = Falsewhile not crashed:# 等待同步world.tick()# 按幀更新渲染的 Camera 畫面gameDisplay.blit(renderObject.surface, (0, 0))pygame.display.flip()# 獲取 pygame 事件for event in pygame.event.get():# If the window is closed, break the while loopif event.type == pygame.QUIT:crashed = True# 結束ego_vehicle.destroy()camera = cameras.values()for cam in camera:cam.stoppygame.quit()

三、拼接效果

在這里插入圖片描述


四、總結

歡迎各位大佬來交流,特別是為什么只支持192倍數的分辨率設置,還是說我的方法不嚴謹,歡迎交流。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210478.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210478.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 工廠模式 + 抽象類 + 泛型干掉重復代碼

業務場景:N個Excel導入,實現動態加載,只需要定義Excel實體,即可實現功能開發, 核心代碼 import cn.afterturn.easypoi.excel.annotation.ExcelTarget; import cn.hutool.core.annotation.AnnotationUtil; import cn.h…

刪除Windows系統中無用的隱藏設備

一些即插即用設備會占用一些隱藏的系統資源,比如USB轉串口的設備會占用COM號碼,網卡會占用靜態IP地址等等。 通常我們使用設備管理器的顯示隱藏設備功能,來刪除這些設備。但是設備管理器每次只允許刪除一個設備,如果設備太多了&a…

【算法集訓】基礎數據結構:四、棧

棧理解了兩天,所以遲了一天發。 一、棧的概念 棧是一個容器,是一個先進后出的線性表,類似與日常生活中的電梯、杯子等。 僅限在表尾部進行插入和刪除操作。 使用鏈表來模擬棧: typedef int DataType; 相當于給int起一個別名 st…

Go 協程基礎:輕松入門并發編程,解析 Goroutines 的奧秘

一、協程基本使用 1、啟動一個協程 主線程中每個100毫秒打印一次,總共打印2次另外開啟一個協程,打印10次情況一:打印是交替,證明是并行的情況二:開啟的協程打印2次,就退出了(因為主線程退出了…

做題筆記:SQL Sever 方式做牛客SQL的題目--SQL157

----SQL157 平均播放進度大于60%的視頻類別 計算各類視頻的平均播放進度,將進度大于60%的類別輸出。 注: 播放進度播放時長視頻時長*100%,當播放時長大于視頻時長時,播放進度均記為100%。 結果保留兩位小數,并按播放進…

基于ssm的學生公寓管理中心系統的設計與實現論文

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術,讓傳統數據信息的管理升級為軟件存儲,歸納,集中處理數據信息的管理方式。本學生公寓管理中心系統就是在這樣的大環境下誕生,其可以幫助管理者在短時間內處理完畢龐大的數據…

[報錯]記錄IDEA遠程開發報錯:java: Cannot run program.....

報錯內容 IDEA在進行遠程開發的時候報錯,內容如下: java: Cannot run program "/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java" (in directory "/home/jim/.cache/JetBrains/RemoteDev-IU/_home_jim_DevCodes_Github_zfile/compile-…

redis主從復制【面試必看】

在分布式系統中,希望使用多個服務器來部署redis,存在以下幾種redis的部署方式 主從模式主從哨兵集群模式 主從模式 在若干個redis節點中,有的是主節點,有的是從節點 假設有三個物理服務器(稱為是三個節點&#xff…

(JSP)EL——優化登錄界面,獲取對象,獲取數據

EL優化登錄界面 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"reques…

生產工序(oj題)

很有趣的一道題 關鍵在于固定工序的整合 看樣例是固定工序中間是不能插入其他工序的&#xff08;也不講清楚&#xff09;&#xff0c;如果可以的話&#xff0c;只能說可能會更麻煩 注意固定工序是按照固定工序中的第一個工序進行排序的 整合完之后&#xff0c;就是遞歸列出…

Java中的IO流①——IO流的體系、字節流、try...catch異常處理

概述 IO流的分類 IO流的體系 這四個類都是抽象類&#xff0c;所以需要實現類對象才能使用---> 字節流 FileInputStream--> 書寫細節 代碼示范 此時文件a.txt內容為abcde 使用char強轉和read方法調用五次read方法--> public static void main(String[] args) throws IO…

mysql 語言學習

整理了一下 mysql 操作語言&#xff0c;不是很全&#xff0c;部分地方也許需要修改&#xff0c;先放上來&#xff0c;有時間再慢慢完善。 一、數據庫操作 連接數據庫 $ sudo mysql [-h ip] -u root -p [-P 3306] 初始化數據庫 $ mysql_secure_installation備份數據庫 # 備…

初出茅廬的小李博客之TobudOS移植到EVB_AIoT開發板

本博客參考教程&#xff1a; https://atomgit.com/OpenAtomFoundation/TobudOS/blob/master/doc/TobudOS_EVB_AIoT_STM32_Guide.md 介紹一下EVB_AIoT開發板 這個開發板是由TobudOS開源社區聯合意法半導體、南京厚德物聯網設計的一款高性能IoT開發平臺&#xff0c;主控芯片是S…

SystemVerilog學習(0)——目錄與傳送門

一、驗證導論 SystemVerilog學習&#xff08;1&#xff09;——驗證導論-CSDN博客文章瀏覽閱讀403次。SystemVerilog自學&#xff0c;驗證系統概述&#xff0c;什么是SVhttps://blog.csdn.net/apple_53311083/article/details/133953016 二、數據類型 SystemVerilog學習&…

含掩膜mask的單通道灰度圖轉化為COCO數據集格式標簽的json文件(python)

輸入&#xff1a;單通道的灰度圖&#xff0c;灰度圖內含掩膜mask 目標&#xff1a;把灰度圖中的語義mask轉換為COCO數據集格式的json文件 輸出&#xff1a;COCO數據集格式的json文件 期間遇到的問題&#xff1a; 發現有的掩膜內部存在其他類別的掩膜&#xff0c;即mask內部還套…

枚舉類簡單使用

1、創建一個枚舉 public enum DemoEnum {// 引號里面存放的是下面所創建的屬性&#xff0c;如果不創建屬性則不能輸入引號里的值的NORMAL("正常"),DESTORY("廢棄");private String label;private DemoEnum(String label){this.label label;}public Strin…

使用.net core MVC實現圖片上傳下載

今天閑來無事&#xff0c;復習復習 1、上傳 上傳界面 <div class"text-center"><h1 class"display-4">Welcome</h1><form method"post" enctype"multipart/form-data" asp-controller"Home" asp-ac…

<HarmonyOS主題課>三方庫【課后考核】

【習題】三方庫 判斷題 三方組件是開發者在系統能力的基礎上進行了一層具體功能的封裝&#xff0c;對其能力進行拓展的工具 。 正確(True) 可以通過ohpm uninstall 指令下載指定的三方庫 錯誤(False) lottie使用loadAnimation方法加載動畫。 正確(True) 單選題 通過ohpm安…

@FunctionalInterface、Lambda表達式和方法引用

知識不回顧是會被遺忘的&#xff01; 網上看了一些相關文章&#xff0c;這里記錄一下&#xff0c;僅供參考 Java語言從JDK1.8開始引入了函數式編程。 函數式編程的核心特點是&#xff0c;函數作為一段功能代碼&#xff0c;可以像變量一樣進行引用和傳遞&#xff0c;以便在有需…

stm32 使用18B20 測試溫度

用18b20 測試溫度是非常常用的&#xff0c;不過18B20的調試不是這么容易的&#xff0c;有些內容網上很多的&#xff0c;不再重復說了&#xff0c;我先把波形說一下&#xff0c;再說程序部分&#xff1a; 整個都溫度數據的順序是&#xff1a; 1.700uS的低電平復位并測試18B20的…