树莓派 Python 图像处理模块保存

0 投票
1 回答
2646 浏览
提问于 2025-04-18 10:39

你好,我正在使用一个叫做 imgproc 的Python库,这个库可以让我从网络摄像头获取图像到树莓派上。但是我不知道怎么把这些图像保存为 .jpg 文件。我到处查找,但始终找不到答案。这个库的链接在 这里。我尝试了很多方法,但我没有合适的pi摄像头。以下是我现在的代码:

import socket
import time
from imgproc import *
cam = Camera(320, 240)
host = "example.com"
port = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ri = socket.gethostbyname(host)
s.connect((ri , port))
x = True
while x:
    img = cam.grabImage()

1 个回答

0

你可以使用像PIL这样的库来实现这个功能,或者其他类似的库。不过,如果你想要速度快一点,就会遇到一些问题。

问题主要出在imgproc这个API上,它似乎不允许快速访问图像数据。获取图像数据的唯一方法是使用Image对象的__getitem__方法,比如img[x,y]。这看起来和numpy数组很像,但可惜的是,它们之间没有其他的相似之处。

imgproc是一个很薄的封装,基于一个C语言库。查看一下imgproc.py会很有帮助,因为它展示了所有可用的绑定。

你很可能需要逐个像素地构建图像,这样做速度并不快。例如:

img_array = numpy.array([ [ img[x,y] for x in range(img.width) ] for y in range(img.height) ] , dtype='uint8')

一旦你有了图像数组,就可以把它转换成PIL图像并保存图像:

pil_img = Image.fromarray(img_array)
pil_img.save('my_image.jpg')

为了做到这一点,你需要同时使用numpyImage模块(PIL)。这种方法速度不是很快。另一种选择是创建一个空的numpy数组,然后填充它:

img_array = numpy.empty((img.height, img.width, 3), dtype='uint8')
for y in range(img.height):
    for x in range(img.height):
        img_array[y,x] = img[x,y]

只有通过测试才能知道哪种方法更慢。

原则上,增强这个库并不难,只需要在库周围添加一些更强大的封装函数,以便让它以更好的格式返回二进制缓冲区的内容,但这样做需要你对C语言和Python都有一定的了解。

撰写回答