如何保存RGB数据从RPi相机然后保存文件到matlab/Python可读格式?



由于应用程序的时间限制,我要将多个白光图像分成一行中的RGB图像。我目前将原始RGB图像保存为.data,但无法弄清楚如何将文件读取回数组以允许我在单独的脚本中操作它。有没有更好的方法来保存这个RGB数据非常快,让我有访问它以后?或者更好的方法是将它们拆分为rg和B,然后分别保存这些图像?

相机捕捉:

self.camera.capture('file_location.data', 'rgb')

读回Python(独立脚本):

path = 'file_location.data'
with open(path, 'rb') as f:
contents = f.read()

我能够读取二进制文件,但还没有找到如何将contents转换成我可以操作的数组。

这里有一种方法可以完成您的要求-它将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并观察那里的RAM使用情况,或者您可以像这样运行它:

/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)

请注意,树莓派有4个CPU内核,而Python倾向于只使用一个,所以如果你想要能够存储更多的图像,你可以启动3个额外的进程来等待来自采集进程的图像并将它们写入磁盘。然后,您将以3倍的速率从未保存的图像中清除RAM。这是非常简单的Redis或Python 3.8多处理共享内存。如果你运行了一个Redis实例,它可以在没有WiFi的情况下运行(因为它是本地的),但是您可以在之后(或实时)从PC上拉出图像供Matlab处理。