使用folium.raster_layers.VideoOverlay叠加视频无法填满边界框的问题求助
我现在尝试用folium.raster_layers.VideoOverlay()把一个mp4视频叠加到folium地图上,生成的结果是DyeVideo.html,但视频并没有出现在设置的边界框bounds=[[lat_min,lon_min],[lat_max,lon_max]]里,而且也填不满红色的边界框。
先跟大家说下这个视频是怎么来的:目前它只有5个PNG帧,后续会扩展到约50个。数据来自我用FVCOM海洋数值模型模拟缅因州卡斯克湾的染料扩散,输出是[lat,lon,dyeconcentration]数组,对应一个约40000个顶点的三角形网格的每个顶点。
针对每个时间点,我用tripcolor()生成PNG文件:
tpp = ax1.tripcolor(lat,lon,triangles,dye1[t1+k,:],cmap='jet',shading= 'gouraud')
然后保存为PNG:
img1=plt.savefig('tpp'+str(k+1)+str('.png'), format='png',dpi=400,bbox_inches='tight',pad_inches=0.0,transparent=True)
我先用folium.raster_layers.ImageOverlay测试过单张PNG的叠加效果,代码如下:
array1 = asarray(img1) folium.raster_layers.ImageOverlay( image = array1, name='Dye overlay', bounds=[[lat_min,lon_min],[lat_max,lon_max]], opacity=0.6, origin='upper', mercator_project=True, cross_origin=False, zindex=1,overlay=True, control=True, show=True, ).add_to(map)
单张PNG完全能准确填满红色边界框,效果很正常。
接下来我用cv2的VideoWriter把这5张PNG合成了mp4视频:
def images_to_video(image_folder, output_path, fps=0.6): #Converts a folder of png images into a video. images = [img for img in os.listdir(image_folder) if img.endswith("png")] images.sort() # Ensure images are in order frame = cv2.imread(os.path.join(image_folder, images[0])) width,height = frame.shape[1],frame.shape[0] # here,1984,1348 video = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'),fps, (width,height)) for image in images: img_path = os.path.join(image_folder, image) frame = cv2.imread(img_path) video.write(frame) video.release() print("Video Frames2png.mp4 created successfully at:", output_path) if __name__ == "__main__": output_path = '/Users/true/Python1/DyeFrames/Frames2/Frames2png.mp4' images_to_video(image_folder, output_path) map.save('DyeFrames2.html')
这个合成的Frames2png.mp4就是那5张能完美适配边界框的PNG组成的视频。
最后用folium.raster_layers.VideoOverlay()把视频叠加到地图上:
video = folium.raster_layers.VideoOverlay( video_url= Frames2png.mp4, bounds=[[lat_min,lon_min],[lat_max,lon_max]], transparent=True, keepAspectRatio=False, mercator_project=True, name="Dye Video", opacity=0.6, attr="Dye Overlay", overlay= True, autoplay=True, control=True, loop=True, playsInline=True, ) video.add_to(map) map.save('DyeVideo.html')
结果就是DyeVideo.html里的视频完全不能正确适配边界框,其他步骤都没问题,唯独folium.raster_layers.VideoOverlay()这一步出问题了。
我已经用ffmpeg移除了PNG和视频里多余的边框,也尝试过各种方式调整视频尺寸、修改宽高比,但边界框好像完全控制不了视频在地图上的大小和位置。我看了folium.raster_layers.py的源码也没找到头绪,想问问有没有人遇到过类似的问题,或者能给点建议,我只是想把视频正确叠加到地图上而已。
备注:内容来源于stack exchange,提问作者Ernie

