일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SQL
- 정보처리기사실기
- 코딩테스트
- 혼공머신
- pandas
- 파이썬
- 컴퓨터비전
- CNN
- numpy/pandas
- C++
- 정수와유리수
- 머신러닝
- 중학수학
- JSP/Servlet
- 데이터분석
- 연습문제
- 파이썬라이브러리
- 텍스트마이닝
- 데이터입출력구현
- 영어공부
- 컴퓨터구조
- 자바
- 딥러닝
- 중학1-1
- 데이터베이스
- html/css
- CSS
- 정보처리기사필기
- 자바 실습
- 운영체제
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
OpenCV로 시작하는 컴퓨터 비전 5 - 영상을 읽고 표시하기와 영상 형태 변환 및 크기 축소하기 본문
조금 전에 모의 면접을 보고 저녁 운동도 간단히 하며 이제 저녁 먹기 전에 공부를 조금 해보려고 한다. 오늘 거의 하루종일 아나콘다 환경 설정과 프로그램을 설치하는데 시간을 보낸 것 같다. 원래 뭐든 첫 시작이 힘든 법이다.
오늘은 낮잠도 2시간이나 잤으니 저녁에 늦게까지 공부하고 싶기도 하다.
영상을 읽고 표시하기
처음 해보는 OpenCV 프로그래밍
1행은 cv2 모듈을 불러와 cv라는 이름을 부여한 것이다. cv2는 조금 전에 pip 명령어로 설치한 모듈이다. 2행은 sys 모듈을 불러온다. sys는 파이썬이 제공하는 기본 모듈로서 설치하지 않고 사용할 수 있으며, 시스템 변수를 설정하거나 exit 함수로 프로그램을 종료하는 데 사용한다.
4행은 cv 모듈이 제공하는 imread 함수를 호출한다. soccer.jpg 파일을 인수로 주었는데 이 파일은 이 소스 파일이 저장되어 있는 폴더에 있어야 한다. imread 함수는 지정된 영상 파일을 폴더에서 읽어와 결과를 반환한다. 그러면 imread가 반환한 영상을 img 객체에 저장한다.
만약 파일이 없거나 읽는 도중에 오류가 발생하면 img는 None이 된다.
img가 None이 아니면 9행이 도달하는데, 이 행은 imshow 함수로 영상을 윈도우에 디스플레이한다. imshow 함수에 'Image Display'와 img를 인수로 주었는데 첫 번째 인수는 윈도우의 이름이고 두 번째 인수는 윈도우에 디스플레이할 영상이다. 9행이 실행되면 윈도우가 생성되고 영상이 나타난다.
11행의 waitKey 함수는 키보드의 키가 눌릴 때까지 기다리다가 키가 눌리면 해당 키의 유니코드 값을 반환한다.
OpenCV에서 영상은 numpy.ndarray 클래스 형의 객체
앞에서 했던 것처럼 type과 dir 명령어로 4행에서 생성된 img 객체의 정체를 확인해보자.
type(img) 명령어를 통해 img 객체는 numpy.ndarray 클래스임을 알 수 있다. numpy는 다차원 배열을 위한 표준 모듈이다. 이런 이유로 OpenCV는 영상을 표현하는데 numpy를 활용한다. img.shape으로 img의 배열 모양을 알아본 바에 따르면 948 x 1434 x 3 크기의 3차원 배열이다.
img 객체가 표현하는 영상은 이와 같이 948개의 행과 1434개의 열을 가진 채널 3개로 구성된다. 3개의 채널은 앞쪽부터 blue, green, red에 해당한다. 보통 RGB 순서인데 OpenCV는 기본이 BGR이다.
영상을 구성하는 한 점을 화소(pixel)라 한다. picture element의 약어이다. 영상에서 화서의 위치는 행 좌표 r과 열 좌표 c를 이용해 (r, c)로 표기한다. 행 좌표는 y축, 열 좌표는 x축에 해당한다. 수학의 좌표계와 달리 컴퓨터 비전에서는 왼쪽 위를 원점으로 간주하며, 점의 좌표를 쓸 때 (y, x) 또는 (r, c)와 같이 y축을 먼저 쓴다. 컬러 영상은 blue, green, red의 3개의 값을 가진다.
(0, 0)과 (0, 1)에 있는 화소값을 조사해보자. 스파이더의 콘솔 창에서 다음과 같이 명령어를 수행한다. (0, 0)의 화소값은 BGR을 구성하는 채널이 각각 162, 104, 98이라는 사실을 확인할 수 있다.
왼쪽 그림은 프로그램으로 (0, 0) 화소를 조사한 결과이고 오른쪽은 그림판을 이용해 조사한 결과이다. soccer.jpg 영상을 그림판에서 연 다음 오른쪽 아래에 있는 확대를 사용해 최대로 확대하여 개별 화소를 확인할 수 있는 상태로 만든다. 그리고 스포이드를 선택하고 (0, 0)에 있는 화소를 찍는다.
그러면 이 화소의 색이 메뉴 바에 있는 '색1'에 표시된다. 색 편집 메뉴를 클릭하면 화면에 색상 표가 나타나고 스포이드로 선택한 스포이드로 선택한 화소의 RGB 값이 표시된다.
영상 형태 변환하고 크기 축소하기
영상에는 다양한 형태가 있다. 다음 예제에서는 채널이 3개인 컬러 영상을 채널이 1개뿐인 명암 영상으로 변환하고 영상 크기를 반으로 축소하는 실험을 한다.
영상을 명암 영상으로 변환하고 반으로 축소하기
이 컬러 영상이 흑백으로 변환되고 그 다음에 축소가 된다.
이렇게 반으로 줄어들었다. 이제 코드를 설명해보자. 1~7행은 이전에 공부했던 부분과 같다. 9행은 cvtColor 함수로 컬러 영상을 명암 영상으로 변환한다. cvtColor 함수는 변환된 영상을 반환하는데, 9행은 반환된 영상을 gray 객체에 저장한다.
10행은 resize 함수로 영상의 크기를 변환한다. 첫 번째 인수는 입력 영상이고, 두 번째 인수 dsize는 변환할 크기를 지정한다.
12~13행의 imwrite 함수는 지정한 영상을 지정한 파일에 저장한다. 이 두 파일에 저장된 영상이 이렇게 폴더에 만들어졌다.
OpenCV의 cvtColor 함수는 채널이 3장인 컬러 영상을 어떻게 한 장인 명암 영상으로 변환할까? 아래 그림에서 보는 바와 같이 BGR=(162,104,98)은 식(2,1)에 따라 I=109로 변환된다. 이런 연산을 모든 화소에 적용하면 명암 영상이 만들어진다.
학습을 마치고
공부하면서 줌으로 인사교에서 하는 영상도 시청하고 다른 할일도 하느라 조금은 집중이 흐려지기도 했다. 그래도 조금 전에 하지 못했던 공부를 이어갈 수 있어서 정말 기뻤다. 컴퓨터 비전은 정말 재미있고 흥미진진한 분야라는 것을 다시 한번 느꼈다.
어렵지만 난 분명 잘할 수 있을 것이다.
'인공지능 > 컴퓨터 비전' 카테고리의 다른 글
OpenCV로 시작하는 컴퓨터 비전 7 - 웹 캠에서 비디오 읽기와 그래픽 기능으로 사용자 인터페이스 만들기 (0) | 2024.11.08 |
---|---|
OpenCV로 시작하는 컴퓨터 비전 6 - 웹캠에서 비디오 읽기 : OpenCV 환경 설정 다시 해보기 (0) | 2024.11.07 |
OpenCV로 시작하는 컴퓨터 비전 4 - 영상 읽고 표시하기 : OpenCV 완전 삭제 후 재설치하기 (0) | 2024.11.07 |
OpenCV로 시작하는 컴퓨터 비전 3 - 객체 지향 잘 활용하기 (1) | 2024.11.07 |
웹캠 설치 후 티처블 머신 실습해보기 - 안 풀렸던 문제 다시 풀어보기 (3) | 2024.11.07 |