바뀜

4,862 바이트 추가됨 ,  2021년 10월 2일 (토) 00:00
편집 요약 없음
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>
 +
|}
 
[[분류:머신러닝 라이브러리]]
 
[[분류:머신러닝 라이브러리]]