Indeed! This is the Makie
approach I arrived at, with dummy data generated by rand!()
and an efficient downsampling approach for lower resolution previews.
Also there’s a preview scalefactor speed testing example below which demonstrates that on my setup downsampling is only beneficial at lower than a ~0.5 preview scale factor
using Random #For generating fake live video data
using Makie, ImageTransformations, Interpolations, Colors, FixedPointNumbers
nframes = 500
previewscalefactor = 0.2
img = rand(UInt8,1536,2048) #Raw image
scene = Scene(resolution = (size(img,2),size(img,1)),colormap=Reverse(:Greys)) #Reverse colormap to match normal greyscale image representation
preview_size = (round(Int,size(img,1)*previewscalefactor), round(Int,size(img,2)*previewscalefactor))
#Lower resolution preview, with efficient downsampling
buff = zeros(N0f8, preview_size[1],preview_size[2])
itp = interpolate!(reinterpret(N0f8, img), BSpline(Linear()))
#Set up Makie scene for preview
hmap = heatmap!(scene, buff, show_axis = false, scale_plot = false)[end]
display(scene)
#Test dummy image capture with preview
t = @elapsed for i = 1:nframes
rand!(img) # aquire new data into raw image array
ImageTransformations.imresize!(buff, itp)
hmap[1] = buff
yield()
end
println("Video generation & live preview at ",previewscalefactor," scale: ",round(nframes/t,digits=1)," FPS")
Video generation & live preview at 0.2 scale: 286.0 FPS
Testing preview scale factor
using Random #For generating fake live video data
using Makie, ImageTransformations, Interpolations, Colors, FixedPointNumbers
nframes = 500
img = rand(UInt8,1536,2048) #Raw image
#First test dummy image capture only
t = @elapsed for i = 1:nframes
rand!(img) # aquire new data into raw image array
end
println("Video generation: ",round(nframes/t,digits=1)," FPS")
for previewscalefactor in [1,0.5,0.25,0.1]
scene = Scene(resolution = (size(img,2),size(img,1)),colormap=Reverse(:Greys)) #Reverse colormap to match normal greyscale image representation
if previewscalefactor != 1
#Lower resolution preview, with efficient downsampling
preview_size = (round(Int,size(img,1)*previewscalefactor), round(Int,size(img,2)*previewscalefactor))
buff = zeros(N0f8, preview_size[1],preview_size[2])
itp = interpolate!(reinterpret(N0f8, img), BSpline(Linear()))
#Set up Makie scene for preview
hmap = heatmap!(scene, buff, show_axis = false, scale_plot = false)[end]
else
hmap = heatmap!(scene, img, show_axis = false, scale_plot = false)[end]
end
display(scene)
#Test dummy image capture with preview
t = @elapsed for i = 1:nframes
rand!(img) # aquire new data into raw image array
if previewscalefactor !=1
ImageTransformations.imresize!(buff, itp)
hmap[1] = buff
else
hmap[1] = img
end
yield()
end
println("Video generation & live preview at ",previewscalefactor," scale: ",round(nframes/t,digits=1)," FPS")
end
Video generation: 2137.1 FPS
Video generation & live preview at 1.0 scale: 67.0 FPS
Video generation & live preview at 0.5 scale: 60.8 FPS
Video generation & live preview at 0.25 scale: 207.1 FPS
Video generation & live preview at 0.1 scale: 536.4 FPS