覆盆子pi图像裁剪非常慢

时间:2013-08-29 09:34:57

标签: python image crop raspberry-pi

我目前正在开发一个项目来捕捉和处理覆盆子Pi上的照片。 来自尼康D5200相机的照片为6000X4000约2 mb。 一切都运行正常,我在Java中做了一个概念验证,并希望将其转换为python或C,具体取决于树莓上哪种语言更快。

问题不在于图像需要裁剪和重新调整大小,这需要在树莓中花费很长时间。在java中,读取图像,裁剪和写入新图像的整个过程大约需要2分钟。

我也尝试过ImageMagick但是在命令行中这甚至需要3分钟。

使用一个小的python脚本我减少到20秒,但这对我的项目来说仍然有点长。

目前我正在安装OpenCV来检查这是否更快,这个过程大约需要4个小时,所以我想在此期间我可以在这里提问。

是否有任何人有任何好主意或图书馆来加快裁剪和重新调整图像大小的过程。

以下是我使用的python代码

import Image

def crop_image(input_image, output_image, start_x, start_y, width, height):
    """Pass input name image, output name image, x coordinate to start croping, y     coordinate to start croping, width to crop, height to crop """
input_img = Image.open(input_image)
box = (start_x, start_y, start_x + width, start_y + height)
output_img = input_img.crop(box)
output_img.save(output_image +".jpg")
def main():
   crop_image("test.jpg","output", 1000, 0, 4000, 4000)

if __name__ == '__main__': main()

2 个答案:

答案 0 :(得分:0)

第一种方法(没有精灵)

import pyglet
#from pyglet.gl import *

image = pyglet.resource.image('test.jpg')
texture = image.get_texture()
## -- In case you plan on rendering the image, use the following gl set:
#gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
texture.width = 1024
texture.height = 768
texture.get_region(256, 192,771, 576)
texture.save('wham.png') # <- To save as JPG again, install PIL

第二次尝试(精灵,未完成)

import pyglet, time
start = time.time() #DEBUG
texture = pyglet.image.load('test.jpg')
print('Loaded image in',time.time()-start,'sec') #DEBUG
sprite = pyglet.sprite.Sprite(texture)
print('Converted to sprite in',time.time()-start,'sec') #DEBUG
print(sprite.width) #DEBUG
# Gives: 6000
sprite.scale = 0.5
print('Rescaled image in',time.time()-start,'sec') #DEBUG
print(sprite.width) #DEBUG
# Gives: 3000

这两款解决方案在速度极慢的PC上最终耗时约3-5秒,在Windows XP下运行的机械磁盘很糟糕,我甚至无法计算运行的应用程序数量,包括主动病毒扫描等。但是请注意,我无法记住如何将精灵保存到磁盘,您需要访问精灵中的AbstractImage数据容器才能将其取出。

您将严格限制在磁盘/内存卡I / O上。 我的图像是16MB 6000x4000像素..我很惊讶它的加载速度只有3秒。

答案 1 :(得分:0)

您是否尝试过jpegtran。它提供了jpeg的无损裁剪。它应该在libjpeg-progs包中。我怀疑解码图像以裁剪它,然后重新编码它对SD卡来说太多了。