如何从 RPi Camera 保存 RGB 数据然后将文件保存为 matlab/Python 可读格式?
How to save RGB data from RPi Camera then save file to matlab/Python readable format?
我连续拍摄了多张白光图像,由于我的应用程序的时间限制,我想稍后将其拆分为 RGB 图像。我目前将原始 RGB 图像保存为 .data
但无法弄清楚如何将文件读回数组以允许我在单独的脚本中对其进行操作。有没有更好的方法可以非常快速地保存此 RGB 数据,以便我以后可以访问它?或者更好地将它分成 R G 和 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
运行ning 观察内存使用情况,或者你可以运行 像这样:
/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 多处理共享内存非常简单。如果你 运行 Redis 实例在你的 Raspberry Pi 上,它可以 运行 没有 WiFi(因为它是本地的),但你可以拉之后(或实时)从您的 PC 获取图像供 Matlab 处理。
我连续拍摄了多张白光图像,由于我的应用程序的时间限制,我想稍后将其拆分为 RGB 图像。我目前将原始 RGB 图像保存为 .data
但无法弄清楚如何将文件读回数组以允许我在单独的脚本中对其进行操作。有没有更好的方法可以非常快速地保存此 RGB 数据,以便我以后可以访问它?或者更好地将它分成 R G 和 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
运行ning 观察内存使用情况,或者你可以运行 像这样:
/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 多处理共享内存非常简单。如果你 运行 Redis 实例在你的 Raspberry Pi 上,它可以 运行 没有 WiFi(因为它是本地的),但你可以拉之后(或实时)从您的 PC 获取图像供 Matlab 处理。