2013-08-29 8 views
0

현재 나무 딸기 파이에서 사진을 캡처하고 처리하는 프로젝트를 진행 중입니다. 사진은 nikon D5200 카메라에서 약 2MB 인 6000X4000입니다. 모든 것이 잘 동작하고 있습니다. 저는 Java에서 개념 증명을했으며 파이썬이나 C 언어로 변환하고 싶습니다. 어떤 언어가 라즈베리에서 더 빠르냐에 달려 있습니다.나무 딸기 파이 이미지 자르기가 매우 느림

이미지를 자르고 크기를 조정해야한다는 문제는 없습니다. 나무 딸기에서는 시간이 오래 걸립니다. Java에서 이미지를 읽는 전체 과정은 새 이미지를 자르고 쓰는 데 약 2 분이 걸립니다.

ImageMagick도 시도했지만 명령 줄에서 최대 3 분이 걸립니다.

작은 파이썬 스크립트를 사용하면 20 초로 줄어 듭니다. 그러나 이것은 여전히 ​​내 프로젝트에서 조금 깁니다.

현재 OpenCV를 설치하면이 과정이 빠름을 확인하는 데 4 시간 정도 걸리므로 여기에서 질문 할 수 있습니다.

누군가 이미지를 자르고 크기를 조정하는 프로세스 속도를 높이기 위해 좋은 아이디어 나 라이브러리를 가지고 있지 않습니다. 다음

(미완성 스프라이트와 등) (스프라이트없이) 내가

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() 
+0

느린 것을 일으키는 원인을 찾아 내려고합니다. IO가 Pi의 문제 일 수 있습니다. SD 카드가 그렇게 빠르지 않기 때문입니다. 그러나 20 대까지 내려야한다고 말하면 희망 할 수있는 최선일 것입니다. 당신은 C 언어로 그것을 시도 할 수 있습니다,하지만 도움이 될지 확실하지 않습니다. – Blubber

+0

예. 죄송합니다. 제 질문에 그 것을 넣지 않았습니다. Java에서 ImageIO.read 및 ImageIO.write에 가장 많은 시간이 소요됨을 알 수 있습니다. 나는 아직 파이썬으로 조사하지 않았다. 내가 보는 것은 내 SD 카드가 30MB/s로 읽혀 지므로 큰 문제가 아니어야한다는 것입니다. – user2668026

답변

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 

모두이다 해결책은 3-5 주변에 끝난다 Windows XP에서 실행되는 칙칙한 기계적 디스크가있는 극히 느린 PC에서 초. 활성 바이러스 스캔 등을 포함하여 실행중인 응용 프로그램의 수를 계산할 수도 없습니다. 그러나 스프라이트를 저장하는 방법을 기억하지 못합니다. 디스크를 얻으려면 스프라이트 내의 데이터 컨테이너 AbstractImage에 액세스해야합니다.

디스크/메모리 카드 I/O에 크게 제한됩니다. 내 이미지는 16MB6000x4000 픽셀이었습니다. 어떤 이미지를로드하는 데 3 초의 시간이 걸렸는지 놀랐습니다.

+0

나무 딸기 파이에 파이글릿을 넣는 것이 문제인 것 같습니다. 라즈베리가 OpenGL ES를 사용하는 OpenGL 드라이버가 필요합니다. 하지만 대답을 주셔서 감사합니다 – user2668026

+0

바로, OpenGL ES가 사용된다는 사실을 잊어 버렸습니다 (파이 게임은 안드로이드에서 작동합니다. GL 기능을 사용하지만 ES를 지원합니다). – Torxed

0

jpegtran을 사용해 보셨나요? 그것은 JPEG의 무손실 자르기를 제공합니다. libjpeg-progs 패키지에 있어야합니다. SD 카드를 찍으려면 영상을 디코딩 한 다음 다시 인코딩하는 것이 좋습니다.

+0

jpegtran을 시도했는데 약 5 초가 걸렸습니다. 하지만 jpegtran에 대한 크기 조정 옵션이 표시되지 않습니다. – user2668026

+0

죄송합니다. "크기 조정"에 대해 잠시 잊어 버렸습니다. 다른 질문에 대한 답변은 epeg를 언급했으며 블로그는 http://blog.sunekaae.com/2013/04/blazing-fast-epeg-photo-resize입니다. -on_3.html이 블로그에서 그는 r-pi에서 imagemagick보다 25 배 빠르다는 것을 알게되었습니다. 그러나 나는 그것을 스스로 시도하지 않았다. –

관련 문제