본 글은 제가 직접 쓴 글이 아니라, 저희 PinkLAB의 유투브 채널의 공개 강의 영상들을 읽고, 따라한 한 수강생의 글을 제 블로그에 공유한 내용입니다.
https://youtu.be/bPFPNun-d5k?si=FfZPMT05TDDDJOMW

안녕하세요, 오랜만에 글을 올려요,, 오늘은 [ 라즈베리파이의 카메라를 이용해서 사진 찍기 ] 강의를 듣고 글을 써 보려고 합니다.
저런 색감의 하늘을 보신 적 있으신가요, ㅎㅎ
환기하시라고... 또 한 장 투척 해 봤어요.

우리는 지금 라즈베리파이에서 카메라를 다루고 있어요.
그래서 오늘은 그 중에서 사진을 카메라에서 받아서 저장하는 이야기를 해 볼 거예요.
오늘 수업 할 영상에서 다룰 코드는 하이 카메라 모듈을 사용 할 거에요.
그러고 난 다음에 그 다음 영상에서는 OpenCV를 이용해서 하는 부분도 이야기를 해 주신다고 하셨어요.
일단 영상 이야기를 해 보도록 할게요.

사진기 한 번 만들어 보자 이런 개념이라 하셨어요.

강사님의 블로그입니다. 2016년 3월 4일 아침 8시 30분에 작성하신 글이에요. 지금이 25년이니... 9년 전이랍니다.
이 때는 강사님께서 어떤 이야기를 하셨냐 하면,

이렇게 라즈베리 파이 보드에 버튼을 하나 달아서 (GPIO 에다 버튼 하나 달아서) 이걸 꾹 하고 누르시면 사진이 띡 하고 찍히고 했던거죠.

여기 이제 그 GPIO 확장 보드라고 하는 거예요.
뭐 쓰나 안 쓰나 상관은 없는데, 카메라 이렇게 고정을 해 뒀구요,

CSI 케이블 CSI 단자에서 케이블 이렇게 연결 해 뒀어요.
카메라가 거치대가 없어서 종이 박스에 구멍을 뚫어서 거치를 했어요.

버튼이 예뻐요.

그리고 찍어라, 끝.

이 때는 라즈비안에서 직접 보여주고 있는 중이에요.
지금 우리는 이렇게 버튼을 꾸미겠다는 건 아니구요,

일정 시간이 지나면 한 5초 후에 찍어라 뭐 이렇게 한 번 코드를 짜 보려고 해요.

전체 코드 구조는 이렇게 생겼어요.
95번째 줄의 if __name__ == '__main__' 부분은 설명 할 필요가 없을 것 같고,
21번째 줄의 def main():- 이건 설명을 해야하는데, 조금 있다가 구조를 보면서 같이 얘기 해 주십니다!

일단 먼저 str2bool (스트링 투 불) 이라는 아이가 있어요.

이건 뭐냐면, 지금 강사님께서는 터미널에서 파이썬3하고, 파일 이름 적용하고, 뒤에 입력을 받도록 할 거란 말이예요,
그런데 그 중에 불린 값을 받도록 하고싶은거예요,
그런데 유저가 Python3 하고 입력을 줄 때, 트루로 주거나 문자로 주거나 하면 참 좋은데,
이 파이썬의 기본적인 입력받는 아이가 그걸 불린 처리를 잘 못 해 줄 수가 있어요.

그래서 일단은 들어온 값이 불린 연산자면, 그냥 v ,
들어온 값이 true, t, 1 이렇게 들어왔다면, true 반환,

false, f, 0 들어오면 false 반환, 이렇게 함수를 하나 만들어 둔 거예요.

이제 메인에서 입력을 받도록 선언을 해 두었어요.
description도 예쁘게 잘 적어놓았구요.
어차피 코드는 주소를 알려 드릴테고 카피해서 쓰면 되니, 뒤에 잘린 부분은 걱정 말아요 !

그리고 첫 번쩨 레볼루션 받기, 그러니까, width와 height를 기본 유저가 지정해 주지 않으면
기본을 설정 해 둔 상태에서, 유저가 그 영상을 지정할 수 있도록 해 주는 거예요.

그리고 유저가 파일 이름을 위의 옵션으로 지정을 한다면 받아들이고, 아니면 디폴트는 널 값을 반환해요.
널값이 나오면 나중에 코드 내에서 조금더 손을 볼 예정이라고 하셨어요.

이건 상하반전, 좌우반전을 할 지 말 지 결정하는 거예요.
상하나 좌우 반전을 어떻게 할 거냐,
근데 이거 받을 때,

아까 만들어둔 이 두가지를 통과시키는 거에요.

유저가 소문자로 'true' 할 수도 있는거고,
그냥 '1' 줄 수도 있고. 아무튼 다 문자 열이에요 .

그래서 그걸 받아서 함수를 통과시켜서 불른 연산자로 받도록 하는 거예요.

이제 요거 몇 초 후에 찍을지, 디폴트는 아무것도 없는 거예요. 0 --> 바로 찍어라~! 예요.

레졸루션도 받도록 되어 있어요.

if not args.filename: --> 유저가 파일 명을 주지 않았다면 ,
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") --> 날짜와 시간을 가지고 jpg 저장을 해라,
else filename = args.filename --> 유저가 파일 명을 줬다면, 그걸로 해라!
이런 뜻이에요. 여기까지가 설정이에요.
유저가 파이썬3 하고 파일 이름 적고 입력을 주는 것에 대한 대응이예요. 실제로 사진 저장하는 건 이게 전부예요.

Picamera2 선언하고,

그런 다음에 상하 좌우 반전 또 지정 해 줘야 할 것이고,

그 다음에 스틸 사진 용이에요. 그래서 resolution이랑 transform 넣어주는 거예요.

그러고 여기에서 스타트 시키고 한 1, 2 초 정도 기다려요
왜 기다리냐, 이 카메라가 처음 전원이 들어가면 초점을 잡고 화면이 좀 재 밝기를 가지는 데 시간이 좀 걸려요. 그래서 그걸 적어 둔 거예요.
카메라를 계속 켜 두고 있으면 상관이 없어요.

만약 유저가 delay를 줬다면, 그걸 카운트다운 해서, 1초씩 기다렸다가 5 하고 주면 5초니까,
5,4,3,2,1. 이렇게 카운트다운 하도록 만들어둔 걸랍니다.

그리고 저장은 캡쳐 파일 옵션으로 저장을 하면 돼요.
실제로는 카메라에 저장하는건 이게 전부에요.
이게 여기 세 페이지가 전부인데, 그 앞에는 전부 다 유저의 입력에 대응하는 설정인 거예요.

전체 코드는 여기에 있어요. 이거 들어가는 법은

핑크 윙크 기업이라고 구글에서 검색하시면 된답니다.
구글에서 핑크 윙크 깃허브라고 검색하시고

그 다음에 for_ROS2_study 레파지토리에 가셔서

RPi Study 폴더에 capture_photos_py라는 파일을 찾으시면 됩니다.
코드는 이게 전부에요.

이게 엄청 긴데, 알고 봤더니 실제 코드는 사진 저장하는 건 얘다.
위에는 전부 다 설정들에 대한 대응이다!
근데 음 실무는 다 이런 거 같다고 하셔요.
그러니까..
내가 혼자서 하나의 코드를 동작시키기 하는 건 쉬운 일인데,
그걸 나 말고 다른유저가 편하게 쓰게 해 주기 위해서 이것저것 설명을 잡기만 해도 코드는 엄청나게 길어진다고 하셔요.
그것에 대한 배려가 중요한 것 같다고도..말씀 해 주셨답니다.

사용은 이렇게 하면 돼요.
python 혹은 python3, 캡처 포토 파이, resolution 지정할거면 --resolution 800 600 이렇게, filename 지정할거면 --filename test_photo.jpg 이렇게, 상하좌우 반전 할 거면 --hflip true, --vflip true, 이렇게 둘 다 트루 해 줘야해요, delay 줄거면 --delay 5
이렇게 잡아주면 된답니다. 이제 한 번 코드 실행 해 보도록 하죠.
강사님께서는 항상 ssh 접근을 하셔서 ssh pw@192.168.0.80.. 들어가서 비밀번호 입력 하시고,

cd Documents에 , code 로 들어가요.

방금 전 영상에서 말씀 드렸던 코드가 여기에 있는데요, capture_photo.py가 여기에 있어요.

한 번 열어보면, 아까 수업 때 했던 코드 그대로랍니다.

혹시 라즈베리파이에 직접 키보드, 마우스, 모니터를 연결하셨다면
에디터를 열어서 깃허브에서 코드 복사 하시면 되고,

강사님처럼 ssh를 선호하신다면 ssh 로 접근 할 수 있는 plugin 이 깔려있는 , 혹은 Extension이 깔려있는

vscode나 cursor를 이용해서 코드를 만드시면 된답니다. 그 부분에 대한 설명은 앞서 많이 했어요.

이제 이걸 실행하는 방법, python3 capture_photo.py

하고, python3 capture_photo.py -h 이렇게 옵션을 줘 보면..
아까 우리가 코드에서는 -h를 만들어 준 적이 없잖아요,

하지만 우리가 열심히 작성했던 help라는 옵션이 그 역할을 해요.

그래서 -h만 달아줘도 내가 만들었던 description이 나타나는 거예요. 쓰기가 편해지는거죠!

python3 capture_photo.py
다 디폴트가 있어요. 그런데..
resolution 넘어가고,,

filename 은 해 볼게요.

hfilp, vfilp은 default가 true예요. 그러니까, 지난시간 영상에서 쭉 따라오셨다면,
강사님께서는 핑키라는 로봇에 달려있는 카메라를 쓰셨는데요,
(핑키에도 똑같이 라즈베리파이, 카메라가 달려있거든요),
그런데 그 카메라가 거꾸로 달려있다보니 둘 다 true를 걸어준거랍니다!

delay 한 번 써 보도록 하죠,
--delay 5

delay5 초 정도 해 뒀어요. 엔터 !
2초간 카메라 워밍업 해요,
그리고 5,4,3,2,1 카운트 하고 샷! 네, 됐어요. -->photo captured and saved as test.jpg 라고 떠요.
ls 하면 test.jpg 있어요.

한가지 문제가 있어요. 이걸 내가 ssh에서 어떻게 보지? 응? 왜 ?
ssh는 새 창이 안 뜨니까..
이걸 보게 하기 위해서라면, 지난 시간에 했던 RealVNC 실행하셔도 되고,
vscode 로 설정해서 보시는 분들은 vscode에서 된답니다. 거기서 폴더가 나오면 바로 돼요.

cursor를 이야기 하면, cursor에서 connect host 하고 pw 192.168.0.80으로 들어왔단 말이죠,

그러고 비번 입력!

영상 찍으시기 전에, 영상 준비 하실 때 인터넷 환경을 옮기셔서 다시 설정을 하셨답니다. 변경중....

open folder -> 그냥 여기서 ok 했어요.

rasberrypi를 vscode이건, cursor이건 간에 ssh extension으로 들어 간 상태예요.

여기에 documents에 code 에 capture_photos.py가 여기에 있어요.
아까 실행했고,

저장했던 test.jpg를 여기서 더블클릭 하면 나와요.

아침시간, 벽면이라 이런거라 하셔요, 카메라 화질이 좋지 않은게 아니라는..ㅋ_ㅋ

지금 현재 여기 ssh로 접근을 하고 있잖아요, (여기는 rasberrypi)

여기서 또 하나의 터미널을 여셨어요.
(이 터미널은 강사님의 pc에요. )
위에 초록 탭 보이시죠...!! :)
cd Documents
cd Documents/cd GitHub
cd Documents/cd GitHub/for_ROS2_study
cd Documents/cd GitHub/for_ROS2_study/RPi\ study
ls
여기에다가 아까 저장한 test.jpg를 복사할거예요.
어떻게 하냐면, pinkwink.kr

그냥..

scp site:pinkwink.kr
라고 검색을 하면..

ssh로 연결된 원격 Pc에서 scp 명령으로 파일 전송하기,
글이 하나 있어요.

이 문법을 그대로 가져 갈 건데,

쉽다고 하셨어요...ㅋㅋ

창을 배치했어요. 실수할까봐. ㅋㅋ
이제 scp 해서 내가 복사하고 싶은 것은, pw 하고 복사할 걸 먼저 지정해야해요.

scp pw@192.168.0.80:/home/pw/Documents/code/test.jpg
(scp pw@192.168.0.80에 있는 home 에있는 pw에있는 Documents에있는 code 에있는 test.jpg 이런식으로.....)
cd Documents/cd GitHub/for_ROS2_study/RPi\ study
내가 이 경로에 와있단말이죠,

와 있으니 현재 경로에 복사를 해라, 그런 뜻이예요. 비번을 입력(라즈베리파이 pw)
그러면 이렇게 바로 복사가 되어서 test.jpg가 떠요.
ls 해도 test.jpg가 떠요.

그러면 강사님 파일 탐색기(맥유저:파인더) 에서 test.jpg 열어보면 되는거랍니다.

짜잔!

복사할 때 이렇게 scp 명령도 있다는 것.. ! !
참고!
**window user : 명령 프롬프트 쓰기!
**ssh싫으면 키보드 마우스 모니터 붙여 쓰기!
오늘도 정말정말 고생 많으셨습니다아 꾸우벅 😚🙏🏻👋🏻👋🏻
'Hardware > SBC (rasp, jetson, latte panda)' 카테고리의 다른 글
| [RPi5] 2-4. Picamera config 에서 영상 변환하기 |산.기.정| (0) | 2025.11.12 |
|---|---|
| [RPi5] 2-3. Ubuntu가 설치된 라즈베리파이에서 picamera를 사용하기 위한 준비 3|산.기.정.| (2) | 2025.10.23 |
| [RPi5] 2-2. Ubuntu가 설치된 라즈베리파이에서 picamera를 사용하기 위한 준비 2|산.기.정.| (0) | 2025.10.20 |
| [RPi5] 2-1. Ubuntu가 설치된 라즈베리파이에서 picamera를 사용하기 위한 준비 1|산.기.정.| (0) | 2025.09.19 |
| [RPi5] 1-11. RealVNC 구성해보기|산.기.정.| (1) | 2025.09.17 |
| [RPi5] 1-10. 라즈베리파이 환경설정 마무리|산.기.정.| (0) | 2025.09.11 |
| [RPi5] 1-9. AP mode 셋팅으로 라즈베리파이보드를 공유기로 만들기 2|산.기.정.|민형기 강사님 무료 강의 (0) | 2025.09.08 |