树莓派图像裁剪非常慢

Posted

技术标签:

【中文标题】树莓派图像裁剪非常慢【英文标题】:raspberry pi image cropping very slow 【发布时间】:2013-08-29 09:34:57 【问题描述】:

我目前正在做一个项目,在树莓派上捕捉和处理照片。 这些照片是 6000X4000 约 2 mb,来自尼康 D5200 相机。 一切正常,我已经在 J​​ava 中进行了概念验证,并希望将其转换为 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()

【问题讨论】:

我会首先尝试确定导致缓慢的原因。 IO 可能是 Pi 上的问题,因为 sd 卡不是那么快。然而,你说你已经把它降到了 20 多岁,这可能是你所希望的最好的。您可以尝试在 C 中执行此操作,但我不确定这是否会有所帮助。 是的,对不起,我没有在我的问题中提出这个问题。我在 Java 中看到大部分时间花在 ImageIO.read 和 ImageIO.write 上。我还没有研究过python。我看到的是我的 SD 卡的读取速度为 30mb/s,所以这应该不是什么大问题。 【参考方案1】:

第一种方法(没有精灵)

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 秒。

【讨论】:

在树莓派上获取 pyglet 似乎是个问题。需要 OpenGL 驱动程序,其中 Raspberry 具有 OpenGL ES。不过谢谢你的回答 对了,忘了使用 OpenGL ES(Pygame 可以在 android 上运行,所以尝试一下。使用 GL 功能但我认为支持 ES)【参考方案2】:

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

【讨论】:

我尝试了 jpegtran,我得到了大约 5 秒。但我没有看到 jpegtran 的调整大小选项。 对不起,我错过了关于“调整大小”的内容 对其他问题的回答这里提到了 epeg,并且有一个关于它的博客:blog.sunekaae.com/2013/04/… 在这个博客上,他发现它比 imagemagick 快 25 倍一个r-pi。不过我自己没试过。

以上是关于树莓派图像裁剪非常慢的主要内容,如果未能解决你的问题,请参考以下文章

树莓派如何查看即时网速返回具体数值

rust 交叉编译树莓派程序

rust 交叉编译树莓派程序

rust 交叉编译树莓派程序

树莓派为啥不能外接图像处理器

树莓派安装openCV做图像识别