自动驾驶采集多视角图像处理(python实现不同文件夹下同名图片批量拼接并生成视频)

本文主要是介绍自动驾驶采集多视角图像处理(python实现不同文件夹下同名图片批量拼接并生成视频),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.图像拼接

2.合成视频

2.1 cv2.videowriter_fourcc功能介绍

2.2读取图片合成视频


1.图像拼接

实现目标:将自动驾驶车6个摄像头采集到的图片,按照正确顺序拼接显示,nuScenes数据集测试如下:

图像存放文件夹目录如下:

每个目录下有相同名称,不同视角采集到的图像 。

先显示图片,代码如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import os"""
将六张图片在同一窗口下显示,关闭后打开后一帧的六张拼接图片
"""def show_images(images, titles=None, num_cols=None, scale=3, normalize=False):""" 一个窗口中绘制多张图像:Args:images: 可以为一张图像(不要放在列表中),也可以为一个图像列表titles: 图像对应标题、num_cols: 每行最多显示多少张图像scale: 用于调整图窗大小normalize: 显示灰度图时是否进行灰度归一化"""# 加了下面2行后可以显示中文标题plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False"""# 单张图片显示if not isinstance(images, list):if not isinstance(scale, tuple):scale = (scale, scale * 1.5)plt.figure(figsize=(scale[1], scale[0]))img = imagesif len(img.shape) == 3:# opencv库中函数生成的图像为BGR通道,需要转换一下B, G, R = cv.split(img)img = cv.merge([R, G, B])plt.imshow(img)elif len(img.shape) == 2:# pyplot显示灰度需要加一个参数if normalize:plt.imshow(img, cmap='gray')else:plt.imshow(img, cmap='gray', vmin=0, vmax=255)else:raise TypeError("Invalid shape " +str(img.shape) + " of image data")if titles is not None:plt.title(titles, y=-0.15)plt.axis('off')plt.show()return"""# 多张图片显示if not isinstance(scale, tuple):scale = (scale, scale)num_imgs = len(images)if num_cols is None:num_cols = int(np.ceil((np.sqrt(num_imgs))))num_rows = (num_imgs - 1) // num_cols + 1idx = list(range(num_imgs))_, figs = plt.subplots(num_rows, num_cols,figsize=(scale[1] * num_cols, scale[0] * num_rows))for f, i, img in zip(figs.flat, idx, images):if len(img.shape) == 3:# opencv库中函数生成的图像为BGR通道,需要转换一下B, G, R = cv.split(img)img = cv.merge([R, G, B])f.imshow(img)elif len(img.shape) == 2:# pyplot显示灰度需要加一个参数if normalize:f.imshow(img, cmap='gray')else:f.imshow(img, cmap='gray', vmin=0, vmax=255)else:raise TypeError("Invalid shape " +str(img.shape) + " of image data")if titles is not None:f.set_title(titles[i], y=-0.15)f.axes.get_xaxis().set_visible(False)f.axes.get_yaxis().set_visible(False)# 将不显示图像的fig移除,不然会显示多余的窗口if len(figs.shape) == 1:figs = figs.reshape(-1, figs.shape[0])for i in range(num_rows * num_cols - num_imgs):figs[num_rows - 1, num_imgs % num_cols + i].remove()plt.show()if __name__ == '__main__':"""src1= cv.imread("vis_result/camera-2")src2 = cv.imread("vis_result/camera-0")src3 = cv.imread("vis_result/camera-1")src4 = cv.imread("vis_result/camera-4")src5 = cv.imread("vis_result/camera-3")src6 = cv.imread("vis_result/camera-5")"""dir0 = "D:/pythonproject/bevshow/vis_result"dir1 = r"D:/pythonproject/bevshow/vis_result/camera-0/"path = os.listdir(dir1)for name in path:src1 = cv.imread(os.path.join(dir0, "camera-2", name))src2 = cv.imread(os.path.join(dir0, "camera-0", name))src3 = cv.imread(os.path.join(dir0, "camera-1", name))src4 = cv.imread(os.path.join(dir0, "camera-5", name))src5 = cv.imread(os.path.join(dir0, "camera-3", name))src6 = cv.imread(os.path.join(dir0, "camera-4", name))title1 = "front_left"title2 = "front"title3 = "front_right"title4 = "back_right"title5 = "back"title6 = "back_left"show_images([src1, src2, src3, src4, src5, src6], [title1, title2, title3, title4, title5, title6], num_cols=3)# show_images(src, title)

实现效果为将6个文件夹中对应帧图片(同名图片)在一个窗口中显示,并显示标题:

 

拼接图像并保存,实现参考这篇:

使用Python批量拼接图片

代码如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import os
from PIL import Image"""
输入六张图片文件夹,输出逐帧拼接的图片并保存在指定目录下
"""
# 保存路径
image_dir = 'D:/pythonproject/bevshow/result/'
# 6个文件夹根目录
dir0 = "D:/pythonproject/bevshow/vis_result"
# 其中一个文件夹,读取图片名用
dir1 = r"D:/pythonproject/bevshow/vis_result/camera-0/"if __name__ == '__main__':"""src1= cv.imread("vis_result/camera-2")src2 = cv.imread("vis_result/camera-0")src3 = cv.imread("vis_result/camera-1")src4 = cv.imread("vis_result/camera-4")src5 = cv.imread("vis_result/camera-3")src6 = cv.imread("vis_result/camera-5")"""path = os.listdir(dir1)for name in path:images = []images0 = Image.open(os.path.join(dir0, "camera-2", name))# print(os.path.join(dir0, "camera-2", name))# D:/pythonproject/bevshow/vis_result\camera-2\1533151603547590-3e8750f331d7499e9b5123e9eb70f2e2.pngimages1 = Image.open(os.path.join(dir0, "camera-0", name))images2 = Image.open(os.path.join(dir0, "camera-1", name))images3 = Image.open(os.path.join(dir0, "camera-4", name))images4 = Image.open(os.path.join(dir0, "camera-3", name))images5 = Image.open(os.path.join(dir0, "camera-5", name))# 如果大小不同可以resize一下"""images0 = images0.resize((1600, 900))images1 = images1.resize((1600, 900))images2 = images2.resize((1600, 900))images3 = images3.resize((1600, 900))images4 = images4.resize((1600, 900))images5 = images5.resize((1600, 900))"""# 拼接图片,按照自己想要的顺序,从左到右,从上到下images.append(images0)images.append(images1)images.append(images2)images.append(images3)images.append(images4)images.append(images5)new_image = Image.new('RGB', (4800, 1800), 'white')# 将四个图像粘贴到新图像的正确位置new_image.paste(images[0], (0, 0))new_image.paste(images[1], (1600, 0))new_image.paste(images[2], (3200, 0))new_image.paste(images[3], (0, 900))new_image.paste(images[4], (1600, 900))new_image.paste(images[5], (3200, 900))# 将最终图像保存到磁盘上new_image.save(image_dir + name)print(new_image)# show_images([src1, src2, src3, src4, src5, src6], [title1, title2, title3, title4, title5, title6], num_cols=3)# show_images(src, title)

将拼接好的图像会保存在提前建立的result文件夹中

2.合成视频

读取result文件夹中拼接好的图像,按照一定帧数合成为视频

参考:python 将图片合成视频

2.1 cv2.videowriter_fourcc功能介绍

  cv2.videowriter_fourcc是OpenCV中的一个函数,用于创建一个视频编码器对象。它接受四个字符作为参数,用于指定视频编码器的类型。这些字符通常是四个大写字母,例如MJPG、XVID、DIVX等。使用cv2.videowriter_fourcc可以将视频数据编码为指定类型的视频文件,以便在其他设备上播放或编辑。

参数列表
cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
MPEG-4编码 .mp4 可指定结果视频的大小
cv2.VideoWriter_fourcc('X','2','6','4')
MPEG-4编码 .mp4 可指定结果视频的大小
cv2.VideoWriter_fourcc('I', '4', '2', '0')
该参数是YUV编码类型,文件名后缀为.avi 广泛兼容,但会产生大文件
cv2.VideoWriter_fourcc('P', 'I', 'M', 'I')
该参数是MPEG-1编码类型,文件名后缀为.avi
cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
该参数是MPEG-4编码类型,文件名后缀为.avi,可指定结果视频的大小
cv2.VideoWriter_fourcc('T', 'H', 'E', 'O')
该参数是Ogg Vorbis,文件名后缀为.ogv
cv2.VideoWriter_fourcc('F', 'L', 'V', '1')
该参数是Flash视频,文件名后缀为.flv

报错1

[ WARN:0@0.033] global loadsave.cpp:248 cv::findDecoder imread_('D:/pythonproject/bevshow/result1533151603547590-3e8750f331d7499e9b5123e9eb70f2e2.png'): can't open/read file: check file path/integrity
Traceback (most recent call last):File "D:\pythonproject\bevshow\test03.py", line 15, in <module>img = cv2.resize(img, (1280, 720))  # 将图片转换为1280*720
cv2.error: OpenCV(4.8.1) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\resize.cpp:4062: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'

解决方案:查看图片是否为空,若为空则是路径问题,修改后即可

2.2读取图片合成视频

此处读取的图片格式为png,参考这一篇:【Python入门教程】基于OpenCV视频分解成图片+图片组合成视频(视频抽帧组帧)

代码如下:

# -*- coding: utf-8 -*-
"""
图片组帧成视频
"""
import os
import cv2
from PIL import Imagedef Image_Frame(images_path, out_path, fps):""":param images_path: 输入需要组帧的图片文件夹路径:param out_path: 输出视频路径:param fps: 视频帧率:return: None"""print("-------------------------图片组帧-------------------------")images_lists = os.listdir(images_path)  # images_lists.sort()image_size = Image.open(os.path.join(images_path, images_lists[0])).sizefourcc = cv2.VideoWriter_fourcc(*"mp4v")video_writer = cv2.VideoWriter(out_path, fourcc, fps, image_size)for image_list in images_lists:image_path = os.path.join(images_path, image_list)frame = cv2.imread(image_path)video_writer.write(frame)print("正在添加:", image_list)video_writer.release()print("-------------------------组帧完成-------------------------")if __name__ == "__main__":Image_path = r'D:\pythonproject\bevshow\vis_result\camera-0'Out_path = r'D:/pythonproject/bevshow/testdir/1.mp4'FPS = int(input("请输入帧率:"))Image_Frame(Image_path, Out_path, FPS)

在运行时一切都正常,但就是文件夹里没有合成的视频,我也不清楚什么原因,后来问了作者,发现是out_path要到文件名,不能只到文件夹,修改后可以生成而且速度比较快。

换了里另一个代码试了一下:python学习之合并多张图片转成mp4视频代码实现

 报错2

ValueError: append_data requires ndarray as first arg

解决

        frame = image.resize((1600, 912))frame = np.array(frame)

运行成功代码为:

import os
import imageio
import numpy as np
from PIL import Image"""
读取拼接好的图片,将其生成指定帧数视频并保存在指定目录下
"""
# 设置生成的视频文件名和路径
filename = 'output.mp4'#文件名
filepath = os.path.join("D:/pythonproject/bevshow/testdir", filename)#存储路径
path = "D:/pythonproject/bevshow/result"#图片读取路径# 读取所有 PNG 图片
images = []
for file_name in sorted(os.listdir(path)):if file_name.endswith('.png'):img = Image.open(os.path.join(path, file_name))images.append(img)# 将图片转换为视频
fps = 30  # 每秒钟30帧
with imageio.get_writer(filepath, fps=fps) as video:for image in images:frame = image.resize((1600, 912))frame = np.array(frame)video.append_data(frame)

在指定目录下生成了MP4格式视频:

可以调整帧数以及尺寸大小,调尺寸可能会报错,但是可以在报错里找到给出的合适尺寸,照着修改即可 ,视频效果如下:

​​自动驾驶采集多视角图像处理生成视频

3.完整代码

import os
import imageio
import numpy as np
from PIL import Image"""
将两个步骤整合,输入6个文件夹,直接输出视频
""""""
输入六张图片文件夹,输出逐帧拼接的图片并保存在指定目录下
"""
# 保存路径
image_dir = 'D:/pythonproject/bevshow/result/'
# 6个文件夹根目录
dir0 = "D:/pythonproject/bevshow/vis_result"
# 其中一个文件夹,读取图片名用
dir1 = r"D:/pythonproject/bevshow/vis_result/camera-0/"
filename = 'output1.mp4'  # 保存视频名称
filepath = os.path.join("D:/pythonproject/bevshow/testdir", filename)  # 保存视频路径if __name__ == '__main__':path = os.listdir(dir1)img = []for name in path:images = []images0 = Image.open(os.path.join(dir0, "camera-2", name))  # 左前images1 = Image.open(os.path.join(dir0, "camera-0", name))  # 前images2 = Image.open(os.path.join(dir0, "camera-1", name))  # 右前images3 = Image.open(os.path.join(dir0, "camera-5", name))  # 右后images4 = Image.open(os.path.join(dir0, "camera-3", name))  # 后images5 = Image.open(os.path.join(dir0, "camera-4", name))  # 左后# 拼接图片,按照自己想要的顺序,从左到右,从上到下images.append(images0)images.append(images1)images.append(images2)images.append(images3)images.append(images4)images.append(images5)new_image = Image.new('RGB', (4800, 1800), 'white')# 将四个图像粘贴到新图像的正确位置new_image.paste(images[0], (0, 0))new_image.paste(images[1], (1600, 0))new_image.paste(images[2], (3200, 0))new_image.paste(images[3], (0, 900))new_image.paste(images[4], (1600, 900))new_image.paste(images[5], (3200, 900))img.append(new_image)# 将图片转换为视频fps = 10  # 每秒钟30帧with imageio.get_writer(filepath, fps=fps) as video:for image in img:frame = image.resize((1872, 1088))frame = np.array(frame)video.append_data(frame)

更新

最近试了一下之前的代码,发现在合成视频的步骤出现了报错,采用了新的代码替换如下:

import os
from PIL import Image
import cv2"""
输入七个图片文件夹,输出逐帧拼接的图片并保存在指定目录下,输出视频
"""
# 保存路径
image_dir = 'D:/pythonproject/bevshow/result/'
# 6个文件夹根目录
dir0 = "D:/pythonproject/bevshow/vis_result"
# 其中一个文件夹,读取图片名用
dir1 = r"D:/pythonproject/bevshow/vis_result/camera-0/"
# 设置图片文件夹路径和指定视频文件保存路径及视频文件名
video_path = "D:/pythonproject/bevshow/testdir/test.mp4"#拼接图片函数
def pintu(dir1, dir0, image_dir):path = os.listdir(dir1)for name in path:images = []images0 = Image.open(os.path.join(dir0, "camera-2", name))images1 = Image.open(os.path.join(dir0, "camera-0", name))images2 = Image.open(os.path.join(dir0, "camera-1", name))images3 = Image.open(os.path.join(dir0, "camera-5", name))images4 = Image.open(os.path.join(dir0, "camera-3", name))images5 = Image.open(os.path.join(dir0, "camera-4", name))images6 = Image.open(os.path.join(dir0, "lidar", name))# 如果大小不同可以resize一下images6 = images6.resize((1800, 1800))"""images0 = images0.resize((1600, 900))images1 = images1.resize((1600, 900))images2 = images2.resize((1600, 900))images3 = images3.resize((1600, 900))images4 = images4.resize((1600, 900))images5 = images5.resize((1600, 900))"""# 拼接图片,按照自己想要的顺序,从左到右,从上到下images.append(images0)images.append(images1)images.append(images2)images.append(images3)images.append(images4)images.append(images5)images.append(images6)title1 = "front_left"title2 = "front"title3 = "front_right"title4 = "back_left"title5 = "back"title6 = "back_right"title6 = "lidar"#根据自己的需求修改尺寸new_image = Image.new('RGB', (6600, 1800), 'white')# 将四个图像粘贴到新图像的正确位置new_image.paste(images[0], (0, 0))new_image.paste(images[1], (1600, 0))new_image.paste(images[2], (3200, 0))new_image.paste(images[3], (0, 900))new_image.paste(images[4], (1600, 900))new_image.paste(images[5], (3200, 900))new_image.paste(images[6], (4800, 0))# 将最终图像保存到磁盘上new_image.save(image_dir + name)print(new_image)# show_images([src1, src2, src3, src4, src5, src6], [title1, title2, title3, title4, title5, title6], num_cols=3)if __name__ == '__main__':# 拼接图片并保存pintu(dir1, dir0, image_dir)# 获取图片文件夹中所有图片文件的名称file_names = [name for name in os.listdir(image_dir) if name.endswith((".jpg", ".png"))]# 设置视频帧率fps = 10  # 通常视频帧率设置为25或30# 设置视频高度和宽度# 可以选择从第一张图片获取尺寸或者手动指定first_image_path = os.path.join(image_dir, file_names[0])first_image = cv2.imread(first_image_path)if first_image is None:print("无法读取第一张图片!")exit()height, width, layers = first_image.shape# 创建视频写入对象fourcc = cv2.VideoWriter_fourcc(*'mp4v')video_writer = cv2.VideoWriter(video_path, fourcc, fps, (width, height))# 遍历所有图片文件,并将其写入视频total_images = len(file_names)for i, name in enumerate(file_names):image_path = os.path.join(image_dir, name)image = cv2.imread(image_path)# 检查图片是否正确读取if image is None:print(f"无法读取图片: {image_path}")continue# 将图片写入视频video_writer.write(image)# 显示进度print(f"进度: {(i + 1) / total_images * 100:.2f}%")# 释放资源video_writer.release()cv2.destroyAllWindows()print("视频合成完成!")

本次拼接加上了雷达图像,因为尺寸不同所以将雷达图像resize了,效果如下:

这篇关于自动驾驶采集多视角图像处理(python实现不同文件夹下同名图片批量拼接并生成视频)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907774

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time