Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 树莓皮图像裁剪非常慢_Python_Image_Crop_Raspberry Pi - Fatal编程技术网

Python 树莓皮图像裁剪非常慢

Python 树莓皮图像裁剪非常慢,python,image,crop,raspberry-pi,Python,Image,Crop,Raspberry Pi,我目前正在做一个项目,在树莓皮上拍摄和处理照片。 照片是6000X4000,大约2MB,来自尼康D5200相机。 一切都很好,我已经用Java做了一个概念证明,并希望根据raspberry上哪种语言更快,将其转换为python或C 不,问题是图像需要裁剪和重新调整大小,这在树莓中需要很长时间。在java中,读取图像、裁剪和写入新图像的整个过程大约需要2分钟 我也尝试过ImageMagick,但在命令行中这甚至需要3分钟 使用我编写的一个小python脚本,这将减少到20秒,但对于我的项目来说,这

我目前正在做一个项目,在树莓皮上拍摄和处理照片。 照片是6000X4000,大约2MB,来自尼康D5200相机。 一切都很好,我已经用Java做了一个概念证明,并希望根据raspberry上哪种语言更快,将其转换为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()
第一次进近(无精灵)
这两种解决方案在运行速度极慢的PC上都会在3-5秒左右结束,而PC上的机械磁盘在Windows XP下运行,带有。。我甚至无法计算运行的应用程序的数量,包括活动病毒扫描等。。但请注意,我不记得如何将精灵保存到磁盘,您需要访问精灵中的
AbstractImage
数据容器才能将其取出

您将严重受限于磁盘/存储卡I/O。
我的图像是16MB 6000x4000像素。。当加载速度快到3秒时,我感到惊讶。

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

首先,我会试图确定是什么导致了速度缓慢。IO可能是Pi上的一个问题,因为sd卡没有那么快。然而,你说你已经把它降到了20岁,这可能是你所能期望的最好成绩。你可以试着用C来做,但我不确定这是否有帮助。是的,对不起,我没有把它放在我的问题中。我在Java中看到,大部分时间花在ImageIO.read和ImageIO.write上。我还没有研究python。我看到的是,我的SD卡的读取速度为30mb/s,所以这应该不是一个大问题。看来,在raspberry pi上使用pyglet是一个问题。在需要OpenGL驱动程序的地方,Raspberry有OpenGL ES。但是谢谢你的回答,忘记了使用OpenGL ES的事实(Pygame在Android上工作,所以试试看。使用GL功能,但我想支持ES)我尝试了jpegtran,我得到了大约5秒的时间。但我看不到jpegtran的调整大小选项。很抱歉,我错过了关于“调整大小”的部分,这里对其他问题的回答提到了epeg,并且有一个关于它的博客:在这个博客上,他发现它比r-pi上的imagemagick快25倍。但是我自己还没有试过。
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