본문 바로가기

Hardware/SBC (rasp, jetson, latte panda)

라즈베리파이에서 초간편 카메라 Python으로 구현하기

라즈베리파이 같은 아이들은 가지고 놀면 놀수록 참 재미있습니다. 틈틈이 쉬는 시간에 이것저것 테스트하고 후다닥 코드 고민하고 또 글쓰고~~~ 요런게 스트레스 해소용으로 참 좋죠~^^ 그래서 최근 라즈베리파이에서 단순히 카메라를 연결해서 촬영(Capture)하는 흉내[바해로가기]도 한 번 해 보았습니다. 그리고 나서 영상 위에 글자를 올려보는 것도 해보았구요[바로가기]. 또 카메라랑 관계는 없지만, GPIO의 인터럽트 방식으로 사용도 해보았습니다.[바로가기] 이제 오늘은 정~~~말 허접하지만 카메라 흉내를 한 번 내볼까 합니다.^^ 일단, 회로 구성부터 보시죠~~

위와 같이 구성했습니다. 파란줄은 GPIO21번에 연결된 촬영버튼이구요... 그 다음 버튼은 20번에 연결된 화면에 날짜와 시간을 표시할지 말지 결정하는 버튼입니다. 그리고 마지막은 16번에 연결됭서 종료를 하는 버튼으로 사용할 겁니다.^^

실제로는 위 그림처럼 구성되구요~~

FRITZING에서 그린것과 색상은 좀 다르지만 위와 같이 구현합니다.

그리고... 필름 케이블의 구성때문에 카메라는 저렇게 뒤집혔구요(ㅠㅠ) 이 상태에서 이제 Python으로 짠 코드를 보죠~~~

 1. 
 2. 
 3. 
 4. 
 5. 
 6. 
 7. 
 8. 
 9. 
10. 
11. 
12. 
13. 
14. 
15. 
16. 
17. 
18. 
19. 
20. 
21. 
22. 
23. 
24. 
25. 
26. 
27. 
28. 
29. 
30. 
31. 
32. 
33. 
34. 
35. 
36. 
37. 
38. 
39. 
40. 
41. 
42. 
43. 
44. 
45. 
46. 
47. 
import picamera
import RPi.GPIO as GPIO
import datetime

camera = picamera.PiCamera()
isOverlayOn = True

GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(20, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def cameraShot(channel):
    saveFileName = datetime.datetime.now().strftime('%y%m%d-%H%M%S%f')+'.jpg'
    camera.capture(saveFileName)
    print('Camera Shoot. File : ' + saveFileName)

def overlayToggle(channel):
    global isOverlayOn
    isOverlayOn = not isOverlayOn
    if isOverlayOn:
        print("Camera overlay mode is ON.")
    else:
        print("Camera overlay mode is OFF.")
     
GPIO.add_event_detect(21, GPIO.FALLING, callback=cameraShot, bouncetime=300)
GPIO.add_event_detect(20, GPIO.FALLING, callback=overlayToggle, bouncetime=300)

print("Start Camera App")

camera.resolution = (640,480)
camera.rotation = 180
camera.framerate = 24
camera.start_preview(fullscreen=False, window=(150,50,640,480))

while GPIO.input(16):
    dateString = datetime.datetime.now().strftime('%b %d %H:%M:%S')
    if isOverlayOn:
        camera.annotate_text = dateString
    else:
        camera.annotate_text = " "           

print("App Stop")

camera.stop_preview()
camera.close()
GPIO.cleanup()

일단 필요한 모듈은 당연히 picamera와 GPIO입니다. 그리고 날짜와 시간을 화면에 표시도 하고 저장하는 파일명으로 잡을려고 datetime도 필요하구요. 이전에 했던 인터럽트 글에서 없던 것이 26, 27행의 bouncetime인데요. 이건 푸쉬버튼을 누르면 파형이 노이즈처럼 튀는 경우가 많은데 인터럽트로 할떄 이걸 다 인식하게 되어서 여러번 이벤트를 실행할 수 있습니다. 하드웨어적으로 100nF정도의 캐패시터면 좋은데 없는 경우, 혹은 병행해서 bouncetime이라는 설정을 사용하면 어느 정도 해소가 됩니다. 그건 300ms정도이 시간의 간격을 두어서 그 안에 발생한 파형은 인지하지 않는거죠. 그리고 이벤트 호출 함수인 callback의 특성한 19번에서 global로 사용할 수 밖에 없었는데... 이부분은 혹시 지나가는 고수님들이 보시면 올바른 방향으로 코딩을 인도해 주시길 바랍니다.ㅠㅠ. 그리고 나면 이전에 이야기했던 내용을 적절히 버무려서 위 코드를 만든거죠^^

이제 처음 실행한 화면입니다. 날짜와 시간도 나오네요~~~ 그리고 두번째 버튼을 눌러서 저 글자가 나오는 걸 해제할 수 있습니다.

저렇게 말이죠~~~^^

저렇게 화면에 보면 저장하고 하는 모드가 실행됨을 알 수 있죠. 실제 촬영한 결과를 보면..

저렇게 잘 저장되어 있습니다.^^

날짜가 있을때 사진과

없을때 사진이죠^^ 에구... 카메라 가지고 놀기 기초... 완전 기초편 하나를 또 이렇게 올리네요~~~ ^^.

반응형