这是一种按照您的要求进行操作的方法 - 它将 7 张图像保存在内存中的列表中,以便您可以快速拍摄照片,然后在实验完成后以更悠闲的速度将它们刷新到磁盘。
您似乎误解了压缩意味着数据丢失。在PNG的情况下,压缩是无损的,与有损的 JPEG 不同。
#!/usr/bin/env python3
import numpy as np
from PIL import Image
# Make 7 random RGB images 2592x1944 and append to list in memory
imageList = []
for i in range(7):
print(f'Creating image {i}')
im = np.random.randint(0,256,(1944,2592,3), dtype=np.uint8)
imageList.append(im)
# Show user length of list
print(f'Number of images in list: {len(imageList)}')
# Save images after experiment is complete
for i,image in enumerate(imageList):
filename = f'image-{i}.png'
print(f'Saving image: {filename}')
Image.fromarray(image).save(filename)
样本输出
Creating image 0
Creating image 1
Creating image 2
Creating image 3
Creating image 4
Creating image 5
Creating image 6
Number of images in list: 7
Saving image: image-0.png
Saving image: image-1.png
Saving image: image-2.png
Saving image: image-3.png
Saving image: image-4.png
Saving image: image-5.png
Saving image: image-6.png
如果你运行程序,你会看到这 7 个图像几乎是瞬间创建的,只有最后保存到磁盘需要一段时间。
以下是创建的文件:
-rw-r--r--@ 1 mark staff 15132795 6 Aug 11:01 image-0.png
-rw-r--r-- 1 mark staff 15132768 6 Aug 11:01 image-1.png
-rw-r--r-- 1 mark staff 15132789 6 Aug 11:01 image-2.png
-rw-r--r-- 1 mark staff 15132792 6 Aug 11:01 image-3.png
-rw-r--r-- 1 mark staff 15132790 6 Aug 11:01 image-4.png
-rw-r--r-- 1 mark staff 15132791 6 Aug 11:01 image-5.png
-rw-r--r-- 1 mark staff 15132784 6 Aug 11:01 image-6.png
如果要分析内存使用情况,可以htop
在程序运行时运行并观察内存使用情况,也可以这样运行:
/usr/bin/time -l ./script.py
6.79 real 6.98 user 0.21 sys
162914304 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
40470 page reclaims
0 page faults
0 swaps
0 block input operations
0 block output operations
0 messages sent
0 messages received
0 signals received
9 voluntary context switches
2620 involuntary context switches
48621173737 instructions retired
30872454100 cycles elapsed
145956864 peak memory footprint
请注意,您同样可以使用OpenCV而不是PIL,只需使用:
import cv2
最后
cv2.imwrite(filename, image)
请注意,Raspberry Pi 有 4 个 CPU 内核,而 Python 往往只使用一个,因此如果您希望能够存储更多图像,您可以启动 3 个额外的进程来等待来自采集过程的图像并将它们写入磁盘。然后,您将以 3 倍的速率从未保存的图像中清除 RAM。这对于Redis或 Python 3.8 多处理共享内存非常简单。如果您在 Raspberry Pi 上运行Redis实例,它可以在没有 WiFi 的情况下运行(因为它将是本地的),但您可以在之后(或实时)从您的 PC 中提取图像以供 Matlab 处理。