일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 입출력
- input()
- 코드업
- 반복실행구조
- 파이썬
- 2차원배열
- 2진수
- 비트단위논리연산
- 불 자료형
- 문자열
- face recognition
- bitwise
- 출력
- 기초 100제
- codeup
- 진수
- 10진수
- OpenCV
- 8진수
- Docker
- 논리연산
- 비교연산
- 불 연산
- 선택실행구조
- 산술연산
- 종합
- 기초100제
- 딥러닝
- 아스키코드
- 16진수
- Today
- Total
DeepFlowest
[OpenCV] 기본 입출력 본문
파이썬으로 만드는 OpenCV 프로젝트 책 내용을 공부하면서 정리한 자료입니다.
OpenCV란
- 영상 처리와 컴퓨터 비전을 위한 오픈소스 라이브러리
- C, C++, Python 등에서 사용 가능
- 파이썬 버전 2.7과 3.x에 따른 지원에 차이가 없음
- Numpy 모듈이 파이썬 3.0 ~ 3.3까지의 버전을 지원하지 않아 파이썬 3.4버전 이상이 필요
- 설치 명령어 :
- pip install opencv-python / pip3 install opencv-python
- pip3 install opencv-contrib-python (엑스트라 모듈 포함)
1. 이미지, 비디오 입출력
(1) 이미지 읽기
-
img를 출력해보면 이미지의 화소데이터가 출력된다.
-
img = cv2.imread(file_name [, mode_flag]) : 파일으로부터 이미지 읽기
- file_name : 이미지경로, 문자열
- mode_flag = cv2.IMREAD_COLOR : 읽기모드지정
- cv2.IMREAD_COLOR : 컬러(BGR)스케일로 읽기, 기본 값
- cv2.IMREAD_UNCHANGED : 파일 그대로 읽기
- cv2.IMREAD_GRAYSCALE : 그레이(흑백) 스케일로 읽기
-
cv2.imshow(title, image) : 특정한 이미지를 화면에 출력
- title : 윈도우 창의 제목
- image : 출력할 이미지 객체
-
cv2.waitKey(time)
- time : 입력 대기 시간 (무한대기 : 0)
- 사용자가 어떤키를 입력했을 때 대기하며 입력했을 때 Ascii Code(esc:27) 반환
- ()의 경우 아무키나 입력해도 창 닫힘
-
cv2.destoryAllWindow() : 화면의 모든 윈도우를 닫는 함수
(2) 새창에 이미지 띄우기
(3) jupyter notebook에 이미지 바로 나타내기
(4) 그레이스케일로 읽기
(5) 이미지 저장하기
- cv2.imwrite(file_path, img): 이미지를 파일에 저장
- file_path : 저장할 파일 경로 이름, 문자열
- img : 저장할 영상, Numpy 배열
경로에 파일로 저장
(6) 이미지 크기 변경
(7) 이미지 자르기
'배열[y1:y2, x1:x2]'
예제)
(1) 컬러이미지를 윈도우 이미지로 연다.
(2) 저장한다. , 아무키나 누르면 닫힌다.
(3) 흑백사진으로 연다, 아무키나 누르면 닫힌다.
(8) 동영상 및 카메라 프레임 읽기
OpenCV는 동영상 파일이나 컴퓨터에 연결한 카메라 장치로부터 연속된 이미지 프레임을 읽을 수 있는 API를 제공
- cap = cv2.VideoCaputure(file_path 또는 index) : 비디오 갭처 객체 생성
- file_path : 동영상 파일 경로
- index : 카메라 장치 번호 (0 부터 차례로 증가)
- cap : VideoCapture 객체
- ret = cap.isOpend() : 객체 초기화 확인
- ret : 초기화 여부, True/False
- ret, img = cap.read() : 영상 프레임 읽기
- ret : 프레임 읽기 성송 또는 실패 여부, True / False
- img : 프레임 이미지, Numpy 배열 또는 None
- cap.set(id, value) : 프로퍼티 변경
- cap.get(id) : 프로퍼티 확인
- cap.release() : 객체 자원 반납
<동영상 파일 읽기>
- 1, 비디오 파일에 대한 VideoCapture 객체 생성
- 2, 비디오의 모든 프레임을 다시 생성
- Loop를 돌면서 frame 읽기
- 읽은 frame에 대해 변환작업을 하고, 화면에 보이기
- 3, 영상 재생이 끝나면 닫기
- waitKey(value) : value 값 변경해보기
② -> 프레임 읽기 성공 여부에 대한 불리언 값과 프레임으로 구성된 페어를 반환
(9) 카메라 프레임 읽기(웹캠필요)
- 촬영한 프레임을 읽어 화면에 표시한다.
- 아무 키 입력 시 중지
(10) 카메라 비디오 속성 제어
캡처 객체에는 영상 또는 카메라의 여러 가지 속성을 확인하고 설정할 수 있는
get(id), set(id, value) 함수를 제공한다.
<프레임 스트림 프로퍼티 얻기>
: 프레임 높이와 너비, 비디오 파일의 프레임 수 및 카메라 프레임 속도와 같은 VideoCapture 프로퍼티를 얻는 방법
속성 ID : 'cv2.CAP_PROP_'로 시작하는 상수
- cv2.CAP_PROP_FRAME_WIDTH : 프레임 폭
- cv2.CAP_PROP_FRAME_HEIGHT : 프레임 높이
- cv2.CAP_PROP_FPS : 프레임 초당 프레임 수
- cv2.CAP_PROP_POS_MSEC : 동영상 파일의 프레임 위치(MS)
- cv2.CAP_PROP_POS_AVI_RATIO : 동영상 파일의 상대 위치 (0:시작 , 1:끝)
- cv2.CAP_PROP_FOURCC : 동영상 파일 코덱 문자
- cv2.CAP_PROP_AUTOFOCUS : 카메라 자동 초점 조절
- cv2.CAP_PROP_ZOOM : 카메라 줌
각 속성 아이디를 get()에 전달하면 해당 속성의 값을 구할 수 있고, set()함수에 아이디와 값을 함께 전달하면 값을 지정할 수 있다.
- cv2.CAP_PROP_FPS : 프레임 초당 프레임 수
- 동영상의 FPS를 구하고 다음과 같이 적절한 지연 시간을 계산해서 지정할 수 있다.
10_1) FPS를 지정해서 동영상 재생
- cv2.CAP_PROP_FPS : 프레임 초당 프레임 수
- 동영상의 FPS를 구하고 다음과 같이 적절한 지연 시간을 계산해서 지정할 수 있다.
기본 틀 :
10_2) 카메라 프레임 크기 설정
영상이 너무 고화질일 때 픽셀 수가 많아 연산하는 데 시간이 오래 걸릴 때
=> 프레임 폭과 높이를 바꿔 픽셀 수를 줄일 수 있다.
- cv2.CAP_PROP_FRAME_WIDTH : 프레임 폭
- cv2.CAP_PROP_FRAME_HEIGHT : 프레임 높이
카메라 프레임 설정해서 비디오 파일 실행하기
카메라 프레임 출력하기
* capture.get : 프로퍼티 ID를 받아 그 값을 부동소수점 값으로 반환하는 함수
(11) 비디오 파일 저장하기
카메라나 동영상 파일을 재생하는 도중
- 특정한 프레임만 이미지로 저장
- 이미지 저장하는 방법과 같음(cv2.imwrite())
- 특정 구간을 동영상 파일로 저장
11_1) 프레임 스트림을 비디오로 저장(웹캠필요)
: USB 카메라에서 프레임을 실시간으로 캡처하는 방법과 지정된 비디오 코덱을 사용해 비디오 파일에 프레임을 동시에 저장하는 방법
11_2) 비디오 파일의 프레임 간 이동
: VideoCapture 객체에서 다른 프레임 위치로 이동하는 방법
11_3) 카메라로 사진 찍기 (웹캠필요)
- 카메라 프레임 읽기
- 아무 키 누르면 'photo.jpg'에 저장
11_4) 카메라 녹화하기(웹캠필요)
* 레코드 파일 저장하기
- writer = cv2.VideoWriter(file_path, fourcc, fps, (width, height)) : 비디오 저장 클래스 생성자 함수
- file_path : 비디오 파일 저장 경로
- fourcc : 비디오 인코딩 형싱 4글자
- fps : 초당 프레임 수
- (width, height) : 프레임 폭과 프레임 높이
- writer : 생성된 비디오 저장 객체
- writer.writh(frame) : 프레임 저장
- frame : 저장할 프레임
- writer.set(id, value) : 프로퍼티 변경
- writer.get(id) : 프로퍼티 확인
- ret = writer.fourcc(c1, c2, c3, c4) : fourcc코드 생성
- c1, c2, c3, c4 : 인코딩 형식
- ret : fourcc 코드
- cv2.VideoWriter_fourcc(c1, c2, c3, c4) : cv.VideoWriter.fourcc()
2. 그림 그리기
(1) 직선 그리기
cv2.line(img, start, end, color[, thickness, lineType]):
- img : 그림그릴 대상 이미지, Numpy 배열
- start : 선 시작 지점 좌표 (x,y)
- end : 선 끝 지점 좌표 (x,y)
- color : 선 색상 ,(BGR), (0 ~ 255)
- thickness=1 : 선 두께
- lineType: 선그리기 형식
- cv2.LINE_4
- cv2.LINE_8
- cv2.LINE_AA (가우시안 필터 이용_계단현상 없앤다.)
(2) 사각형 그리기
cv2.rectangle(img, start, end, color[, thickness, lineType]: 사각형 그리기
- img : 그림 그릴 대상 이미지, NumPy 배열
- start : d사각형 시작 꼭짓점 (x,y)
- end : 사각형 끝 꼭짓점( x, y)
- color : 색상 (BGR)
- thickness : 선 두께
- -1 : 채우기
- lineType : 선타입, cv2.line()과 동일
(3) 다각형 그리기
cv2.polylines(img, points, isClosed, color[, thickness, lineType]): 다각형 그리기
- img : 그림 그릴 대상 이미지
- points : 꼭짓점 좌표, Numpy 배열 리스트
- isClosed: 닫힌 도형 여부, True/False
- color : 색상(BGR)
- thickness : 선 두께
- lineType : 선 타입, cv2.line()과 동일
(4) 원,타원,호 그리기
원 그리기
- cv2.circle(img, center, radius, color[, thickness, lineType])
- img : 그림 대상 이미지
- center : 원점 좌표 (x,y)
- radius : 원의 반지름
- color : 색상 (BGR)
- thickness : 선 두께 (-1 : 채우기)
- lineType : 선 타입, cv2.line()과 동일
호, 타원 그리기
- cv2.ellipse(img, center, axes, angle, from, to, color[, thickness,lineType])
- img : 그림 대상 이미지
- center : 원점 좌표 (x,y)
- axes : 기준 축 길이
- angle : 기준 축 회전 각도
- from, to : 호를 그릴 시작 각도와 끝 각도
(5) 글씨 그리기
: 문자열을 이미지에 표시하는 함수
- cv2.putText(img, text, point, fontFace, fontSize, color [, thickness,lineType])
- img : 글씨를 표시할 이미지
- text : 표시할 문자열
- point : 텍스트가 출력될 위치_좌측 하단 기준(x,y)
- fontFace : 글꼴
- cv2.FONT_HERSHEY_
- fontSize: 글씨 크기
- color, thickness,lineType : cv2.rectangle() 과 동일
3. 창 관리
: 한 개 이상의 이미지를 여러 창에 띄우거나 각 창에 키보드와 마우스 이벤트를 처리하려면 창을 관리하는 기능이 필요하다.
-
cv2.nameWindow(title [, option]) : 이름을 갖는 창 열기
- title : 창이름, 제목 줄에 표시
- option : 창옵션
- cv2.WINDOW_NORMAL:임의의크기, 창 크기 조정 가능
- cv2.WINDOW_AUTOSIZE : 이미지와 같은 크기, 창 크기 재조정 불가능
-
cv2.moveWindow(title, x좌표 , y좌표) : 창위치 이동
-
cv2.resizeWindow(title, width, height) : 창 크기 변경
-
cv2.destroyWindow(title) : 창 닫기
-
cv2.destroyAllWindows(): 열린 모든 창 닫기
4. 이벤트 처리
: 키보드와 마우스 입력 방법
(1) 키보드 이벤트
사용자의 키보드입력 처리하기
- 윈도우 wasd 키로 상하좌우 움직이기
- q, esc누르면 종료
- cv2.waitKey(delay) :
delay 인자에 밀리초(0.001초) 단위로 숫자를 전달하면 해당 시간 동안 프로그램을 멈추고 대기하다가 키보드의 눌린 키에 대응하는 코드 값을 정수로 반환- 지정한 시간까지 키보드 입력이 없으면 -1 반환
- delay 인자에 0 : 시간 무한대
- ex) esc를 누를 경우 27 출력 (ASCII코드 출력)
- ord() : 문자의 아스키코드 출력
키보드의 'a'를 눌렀는지 확인 하려면
(2) 마우스 이벤트
사용자의 마우스입력 처리하기
- cv2.setMouseCallback(win_name, onMouse [, param]) : win_name에 onMouse 함수를 등록
- win_name : 이벤트를 등록할 윈도 이름
- onMoouse : 이벤트 처리를 위해 미리 선언해 놓은 콜백 함수
- param : 필요에 따라 onMouse 함수에 전달할 인자
- MouseCallback(event, x, y, flags, param) : 콜백 함수 선언부
- event : 마우스 이벤트 종류
- cv2.EVENT_MOSEMOVE : 마우스 움직임
- cv2.EVENT_LBUTTONDOWN : 왼쪽 버튼 누름
- cv2.EVENT_RBUTTONDOWN : 오른쪽 버튼 누름
- cv2.EVENT_MBUTTONDOWN : 가운데 버튼 누름
- cv2.EVENT_LBUTTONDUP : 왼쪽 버튼 뗌
- cv2.EVENT_RBUTTONUP : 오른쪽 버튼 뗌
- cv2.EVENT_MBUTTONUP : 가운데 버튼 뗌
- cv2.EVENT_LBUTTONDBLCLK: 왼쪽 버튼 더블클릭
- cv2.EVENT_RBUTTONDBLCLK : 오른쪽 버튼 더블클릭
- cv2.EVENT_MBUTTONDBLCLK : 가운데 버튼 더블클릭
- cv2.EVENT_MOUSEWHEEL : 휠 스크롤
- cv2.EVENT_MOUSEWHEEL : 휠 가로 스크롤
- x, y : 마우스 좌표
- flags : 마우스 동작과 함께 일어난 상태
- cv2.EVENT_LBUTTONDOWN(1) : 왼쪽 버튼 누름
- cv2.EVENT_RBUTTONDOWN(2) : 오른쪽 버튼 누름
- cv2.EVENT_MBUTTONDOWN(4) : 가운데 버튼 누름
- cv2.EVENT_FLAG_CTRLKEY(8) : Ctrl 키 누름
- cv2.EVENT_FLAG_SHIFTKEY(16) : Shift 키 누름
- cv2.EVENT_FLAG_ALTKEY(32) : Alt 키 누름
- param : cv2.setMouseCallback() 함수에서 전달한 인자
- event : 마우스 이벤트 종류
2_1) 마우스 이벤트로 동그라미그리기
2_2) 플래그 이용한 동그라미 그리기
2_3) 콜백함수 이용해서 이미지 자르기
- 마우스를 눌러 사각형을 만든다
- c를 눌러 이미지를 자른다.
- esc를 눌러 종료한다.
기본 이미지 :
c 키를 눌러서 자른 이미지 :
(3) 트랙바
: 슬라이드 모양의 인터페이스를 마우스로 움직여서 값을 입력 받는 GUI 요소
-
cv2.createTrackbar(trackbar_name, win_name, value, count, onChange) : 트랙바 생성
- trackbar_name : 트랙바 이름
- value : 트랙바 초기 값, 0 ~ count 사이의 값
- count : 트랙바 눈굼의 개수, 트랙바가 표시할 수 있는 최대 값
- onChange : TrackbarCallbak, 트랙바 이벤트 핸들러 함수
-
TrackbarCallback(value) : 트랙바 이벤트 콜백 함수
- value : 트랙바가 움직인 새 위치 값
-
pos = cv2.getTrackbarPos(trackbar_name, win_name)
- trackbar_name : 찾고자 하는 트랙바 이름
- win_name : 트랙바가 있는 창의 이름
- pos : 트랙바 위치 값
트랙바를 이용한 이미지 색 조정
: 트랙바 3개를 생성하여 각 트랙바를 움직여 이미지의 색상을 조정하는 예제
http://www.yes24.com/Product/Goods/71534451
정리한 코드 : https://github.com/Yearang-Lee/OpenCV_Project_Python_Book
'Computer Vision > 개념' 카테고리의 다른 글
[Face Recognition] Face Alignment 란 무엇인가. (0) | 2021.02.24 |
---|