22번째 줄: |
22번째 줄: |
| |} | | |} |
| | | |
− | == 기초 사용 ==
| + | = 기초 사용 = |
| {| class="wikitable" | | {| class="wikitable" |
| !의도 | | !의도 |
31번째 줄: |
31번째 줄: |
| | | | | |
| |import cv2 | | |import cv2 |
| + | |- |
| + | | |
| + | | |
| + | | |
| + | |- |
| + | | |
| + | | |
| + | | |
| + | |} |
| + | |
| + | == 이미지 관련 == |
| + | {| class="wikitable" |
| + | !의도 |
| + | !설명 |
| + | !방법 |
| + | |- |
| + | |이미지 읽기 |
| + | |이미지파일을 읽고 창에 띄운다. |
| + | {| class="wikitable" |
| + | !읽기모드 |
| + | !설명 |
| + | |- |
| + | |cv2.IMREAD_COLOR |
| + | |컬러(BGR) 스케일로 받는다.(디폴트) |
| + | |- |
| + | |cv2.IMREAD_UNCHANGED |
| + | |파일 그대로 |
| + | |- |
| + | |cv2.IMREAD_GRAYSCALE |
| + | |흑백으로 읽기 |
| + | |} |
| + | |<syntaxhighlight lang="python"> |
| + | img = cv2.imread('이미지 경로', 읽기모드) |
| + | cv2.imshow('창이름', img) # 창이름을 가진 창에 이미지를 띄운다. |
| + | cv2.waitKey(0) # 아무 키가 입력될 때까지 대기. 이미지를 띄울 때 이게 없으면 바로 끝난다. 눌린 키에 대응하여 값을 반환한다. |
| + | cv2.destroyAllWindows() # 모든 창 닫기. |
| + | </syntaxhighlight> |
| + | |- |
| + | |이미지 저장 |
| + | |처리 후 다시 저장하기 위해. |
| + | |<syntaxhighlight lang="python"> |
| + | cv2.imwrite('저장경로', img) # 파일 포멧까지 지정해주어야 한다. |
| + | </syntaxhighlight> |
| + | |} |
| + | |
| + | == 영상 관련 == |
| + | {| class="wikitable" |
| + | !의도 |
| + | !설명 |
| + | !방법 |
| |- | | |- |
| |영상 불러오기 | | |영상 불러오기 |
36번째 줄: |
86번째 줄: |
| 인수로 영상파일 경로를 주면 파일을 열어 분석한다. | | 인수로 영상파일 경로를 주면 파일을 열어 분석한다. |
| |<syntaxhighlight lang="python"> | | |<syntaxhighlight lang="python"> |
− | cap = cv2.VideoCapture(0) | + | cap = cv2.VideoCapture(0) # 경로가 아닌 숫자라면, 카메라 번호를 의미한다. |
| | | |
| while True: | | while True: |
− | ret, img = cap.read() | + | ret, img = cap.read() # read로 프레임을 하나씩 읽는다. |
− | if not ret: # 해당 프레임이 있으면 ret에 True가 담긴다. | + | if not ret: # ret엔 cap.isOpened() 가 담겨 영상이 열려있는지 여부를 반환한다. |
− | breat | + | break |
| # 프레임 하나하나 이미지 처리되어 img 객체에 담기니, 이를 처리하면 된다. | | # 프레임 하나하나 이미지 처리되어 img 객체에 담기니, 이를 처리하면 된다. |
| + | cv2.imshow('창이름', img) # 창을 열어 보여준다. 프레임마다 빠르게 불러 영상처럼. |
| + | if cv2.waitKey(1) != -1: # 아무 키가 입력될 때까지 ms단위로 대기. 파일에 따라 다른 값을 준다. 너무 빠르게 넘어가면 볼 수가 없어. |
| + | break # 아무 키가 입력되면 멈춘다. 아무 키가 없으면 -1 반환. |
| + | cap.release() # 객체에서 사용하던 자원을 반납한다. |
| + | cv2.destroyAllWindows() |
| </syntaxhighlight> | | </syntaxhighlight> |
| |- | | |- |
51번째 줄: |
106번째 줄: |
| cv2.imshow('창이름', img) | | cv2.imshow('창이름', img) |
| cv2.waitKey(1) # 이게 있어야 창이 제대로 열린다. | | cv2.waitKey(1) # 이게 있어야 창이 제대로 열린다. |
| + | </syntaxhighlight> |
| + | |- |
| + | |영상 속성 보기 |
| + | |객체.get 함수를 이용하면 볼 수 있다. |
| + | |cap.get(cv2.CAP_PROP_FPS) # 해당 영상의 초당 프레임 수를 구한다. |
| + | {| class="wikitable" |
| + | !속성 |
| + | !설명 |
| + | |- |
| + | |cv2.PROP_FRAME_WIDTH |
| + | |프레임의 폭 |
| + | |- |
| + | |cv2.PROP_FRAME_HEIGHT |
| + | |프레임 높이 |
| + | |- |
| + | |cv2.PROP_POS_AVI_RATIO |
| + | |동영상 파일의 현재 위치(0~1 사이.) |
| + | |} |
| + | 이외 수많은 속성들이 있다. |
| + | |- |
| + | |영상 속성 지정 |
| + | |객체.set 함수를 이용해 속성값을 지정할 수 있다. |
| + | |cap.set(cv2.PROP_FRAME_WIDTH, 320) # 영상의 폭을 320으로 지정. |
| + | {| class="wikitable" |
| + | !속성 |
| + | !설명 |
| + | |- |
| + | |cv2.PROP_FRAME_WIDTH |
| + | |프레임의 폭 |
| + | |} |
| + | |- |
| + | |영상 저장(특정프레임) |
| + | |특정 프레임을 이미지로 저장. |
| + | 이미지의 저장과 동일하다. |
| + | |다음 코드를 적절한 곳에 추가하면 된다.<syntaxhighlight lang="python"> |
| + | if cv2.waitKey(1) != -1: # 아무 키가 입력될 때까지 ms단위로 대기. |
| + | cv2.imwrite('사진경로.jpg', img) # 해당 이미지를 저장한다. |
| + | </syntaxhighlight> |
| + | |- |
| + | |영상 저장(특정구간) |
| + | |특정 구간을 영상으로 저장. |
| + | 적절한 fourcc값은 [https://www.fourcc.org/codecs.php 링크]에서 찾아보자. |
| + | |<syntaxhighlight lang="python"> |
| + | # 사전 인수 설정. |
| + | file_path = '주소.avi' |
| + | fourcc = cv2.VideoWriter_fourcc(*'DIVX') # 비디오인코딩 형식(4글자) |
| + | |
| + | # 비디오 저장 클래스 객체를 생성한다. |
| + | writer = cv2.VideoWriter(file_path, fourcc, |
| + | fps, # 초당 프레임 |
| + | (width, height) # 크기 |
| + | ) |
| + | |
| + | while True: |
| + | ret, img = cap.read() |
| + | ... |
| + | writer.write(img) # 해당 프레임을 쓴다. |
| + | if cv2.waitKey(1) != -1: # 아무 키가 입력될 때까지 ms단위로 대기. |
| + | break # 키를 누르면 녹화를 멈춘다. |
| + | |
| + | writer.release() # 파일을 닫는다.(자원 반환) |
| + | |
| + | |
| + | </syntaxhighlight> |
| + | |} |
| + | |
| + | === 팁 === |
| + | 너무 고화질의 영상이라면 픽셀 수가 많아 연산하는 데 오래걸린다. 때문에 프레임 폭, 높이 조절로 픽셀 수를 줄이는 편이 이득.<syntaxhighlight lang="python"> |
| + | cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320) |
| + | cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) |
| + | </syntaxhighlight>[카메라 외의 영상은 이렇게 안줄여진다고 하던데...] |
| + | |
| + | = 꾸미기 = |
| + | |
| + | === 글씨 쓰기 === |
| + | {| class="wikitable" |
| + | !의도 |
| + | !설명 |
| + | !방법 |
| + | |- |
| + | |글씨쓰기 |
| + | |영상이나 이미지에 글씨를 쓴다. |
| + | |<syntaxhighlight lang="python"> |
| + | cv2.putText(img, # 글씨를 표시할 이미지나 프레임. |
| + | text, # 표시할 텍스트. |
| + | point, # 표시할 좌표. 문자열의 좌측 하단이 기준이 된다. |
| + | fontFace, # 글씨체 |
| + | fontSize, # 1이 평범한 크기. |
| + | color, # (255,255,255) 형태. |
| + | ) |
| </syntaxhighlight> | | </syntaxhighlight> |
| |} | | |} |
| | | |
− | 이미지 읽기
| + | = 외부입력 = |
− | img = cv2.imread(...., 읽기모드)
| + | {| class="wikitable" |
− | cv2.imshow(창이름, img) | + | !의도 |
− | cv2.waitKey() 특정 키가 입력될 때까지 대기. 이미지를 띄울 때 이게 없으면 바로 끝난다. 그럼.. 영상에선 필요 없는 거 아닌감. | + | !설명 |
− | cv2.destroyAllWindows() 모든 창 닫기.
| + | !방법 |
| + | |- |
| + | |키 입력 받기 |
| + | |cv2.waitKey(ms) 함수는 특정 시간동안 키입력이 없으면 -1을 반환한다. |
| + | 인수로 0을 주면 무한정 기다린다. |
| + | |
| + | 반환하는 키 코드는 아스키코드와 같아 ord 함수를 이용하여 매칭할 수 있다. |
| + | |
| + | |
| + | 주의 : 64비트 환경에선 cv2.waitKey() 함수가 아스키코드보다 큰 32비트 정수를 반환하기도 한다. 이를 처리하려면 하위 8비트만 남기고 지운다. |
| + | |<syntaxhighlight lang="python"> |
| + | key = cv2.waitKey(10000) & 0xFF # &연산으로 하위 8비트만 남기고 높은 비트는 0 처리. |
| + | if key == ord('a'): # a키를 받으면... |
| + | </syntaxhighlight> |
| + | |} |
| [[분류:머신러닝 라이브러리]] | | [[분류:머신러닝 라이브러리]] |