0

現在、ラズベリー 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()
4

2 に答える 2

0

試しjpegtranましたか?jpeg のロスレス クロッピングを提供します。libjpeg-progsパッケージに入っているはずです。画像をデコードしてトリミングしてから再エンコードするのは、SDカードにとっては多すぎると思います。

于 2013-08-29T13:05:18.687 に答える
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

2 回目の試行 (スプライトあり、未完成)

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 で、Windows XP で実行されているくだらないメカニカル ディスクで約 3 ~ 5 秒で終了します。アクティブなウイルス スキャンなどを含め、実行中のアプリケーションの数を数えることさえできません。スプライトをディスクに保存する方法を覚えていない場合はAbstractImage、スプライト内のデータ コンテナーにアクセスして、スプライトを取得する必要があります。

ディスク/メモリカードの I/O が大幅に制限されます。私の画像は 16MB 6000x4000 ピクセルでした..読み込みに 3 秒もかからないことに驚きました。

于 2013-08-29T09:50:32.520 に答える