DeepFlowest

[OpenCV] 기본 입출력 본문

Computer Vision/개념

[OpenCV] 기본 입출력

Orange57 2020. 4. 11. 22:33
728x90
반응형
SMALL

파이썬으로 만드는 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) 이미지 읽기

  1. img를 출력해보면 이미지의 화소데이터가 출력된다.

  2. img = cv2.imread(file_name [, mode_flag]) : 파일으로부터 이미지 읽기

    • file_name : 이미지경로, 문자열
    • mode_flag = cv2.IMREAD_COLOR : 읽기모드지정
      • cv2.IMREAD_COLOR : 컬러(BGR)스케일로 읽기, 기본 값
      • cv2.IMREAD_UNCHANGED : 파일 그대로 읽기
      • cv2.IMREAD_GRAYSCALE : 그레이(흑백) 스케일로 읽기
  3. cv2.imshow(title, image) : 특정한 이미지를 화면에 출력

    • title : 윈도우 창의 제목
    • image : 출력할 이미지 객체
  4. cv2.waitKey(time)

    • time : 입력 대기 시간 (무한대기 : 0)
    • 사용자가 어떤키를 입력했을 때 대기하며 입력했을 때 Ascii Code(esc:27) 반환
    • ()의 경우 아무키나 입력해도 창 닫힘
  5. 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() 함수에서 전달한 인자

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개를 생성하여 각 트랙바를 움직여 이미지의 색상을 조정하는 예제

 

 

 

 


출처 : 파이썬으로 만드는 OpenCV 프로젝트

http://www.yes24.com/Product/Goods/71534451

 

파이썬으로 만드는 OpenCV 프로젝트

개발자에게 딱 필요한 만큼의 이론과 활용 가능한프로젝트로 배우는 OpenCV 프로그래밍OpenCV는 영상 처리와 컴퓨터 비전 분야에서 현존하는 가장 영향력 있는 라이브러리이다. 이 책은 누구나 쉽게 접근할 수 있는 파이썬 언어를 기반으로 기초적인 영상 출력에서부터 영상 합성과 블렌딩, 컨볼루션 연산을 이용한 영상...

www.yes24.com

정리한 코드 : https://github.com/Yearang-Lee/OpenCV_Project_Python_Book

 

Yearang-Lee/OpenCV_Project_Python_Book

Contribute to Yearang-Lee/OpenCV_Project_Python_Book development by creating an account on GitHub.

github.com

 

728x90
반응형
LIST

'Computer Vision > 개념' 카테고리의 다른 글

[Face Recognition] Face Alignment 란 무엇인가.  (0) 2021.02.24
Comments