OpenCV_2

YJ·2023년 7월 4일
0

▷ 오늘 학습 계획: OpenCV 강의(4~5)

📖 Chapter 03_OpenCV 사용법_1

1. 영상 데이터 속성, 픽셀 값 참조

영상 데이터의 속성

OpenCV는 영상 데이터를 numpy.ndarray로 표현

  • ndim: 차원 수 = len(img.shape)
  • shape: 각 차원의 크기
    그레이스케일 영상: (h,w)
    컬러 영상: (h, w, 3)
  • size: 전체 원소 개수
  • dtype: 원소의 데이터 타입. 영상 데이터는 uint8

OpenCV 영상 데이터 자료형과 NumPy 자료형

  • OpenCV: cv2.CV_8U, NumPy: numpy.uint8(8비트 부호없는 정수)
  • 그레이스케일 영상: cv2.CV_8UC1 → numpy.unit8, shape = (h,w)
  • 컬러 영상: cv2.CV_8UC3 → numpy.unit8, shape = (h,w,3)

픽셀 값 참조

img1[:, :] = 255  #grayscale img1의 전체 픽셀 값을 255로(흰색)
img2[:, :] = (0, 0, 255) #color img2의 Red 픽셀 값을 255로

2. 영상의 생성과 복사

새 영상 생성하기

  • 임의의 값으로 초기화된 배열 생성
    numpy.empty(shape, dtype=float)
  • 0으로 초기화된 배열 생성
    numpy.zeros(shape, dtype=float)
  • 1로 초기화된 배열 생성
    numpy.ones(shape, dtype=None)
  • fill_value로 초기화된 배열 생성
    numpy.full(shape, fill_value, dtype=None)

    shape: 각 차원의 크기. (h,w) 또는 (h,w,3)
    dtype: 원소의 데이터 타입. 일반적인 영상은 numpy.unit8

영상의 참조 및 복사

img2 = img1 → 참조(img1이 수정되면 img2도 같이 반영)
img3 = img1.copy() → 복사(img1이 수정되면 img3는 바뀌지 않음)

3. 부분 영상 다루기

  • numpy.ndarray의 슬라이싱

4. 마스크 연산과 ROI

  • ROI(Region of Interest): 관심영역
    영상에서 특정 연산을 수행하고자 하는 임의의 부분 영역

  • 마스크 연산
    OpenCV는 일부 함수에 대해 ROI 연산을 지원한다.
    (cv2.copyTo(), cv2.calcHist(), cv2.bitwise_or(), cv2.matchTemplate())

  • 마스크 영상을 인자로 함께 전달해야 한다.(cv2.CV_8UC1, 그레이스케일)

  • 마스크 영상의 픽셀 값이 0이 아닌 위치에서만 연산이 수행된다.
    (보통 0 또는 255로 구성된 이진 영상 사용)

  • 마스크 연산을 지원하는 픽셀 값 복사 함수

    cv2.copyTo(src, mask, dst=None)

    src: 입력 영상
    mask: 마스크 영상(cv2.CV_8U, numpy.unit8)
    dst: 출력 영상

    src, mask, dst는 모두 크기가 같아야 하고 src와 dst는 같은 타입

5. 투명한 PNG 파일 합성

알파 채널이 있는 PNG 파일을 다른 영상에 합성: 알파 채널을 마스크 영상으로

📖 Chapter 04_OpenCV 사용법_2

1. 그리기 함수

OpenCV 그리기 함수

  • 영상에 선, 도형, 문자열을 출력
  • 선 그리기: 직선, 화살표, 마커 등
  • 도형 그리기: 사각형, 원, 타원, 다각형 등
  • 문자열 출력

주의할 점

  • 그리기 알고리즘을 이용하여 영상의 픽셀 값 자체가 변경된다.
  • 그레이스케일 영상에는 컬러 그리기가 안됨
    (cv2.cvtColor()를 이용해 BGR 컬러 영상으로 변환 후 그리기 함수 호출)

주요 그리기 함수

  • 직선 그리기
    cv2.line(img, pt1, pt2, color, thickness=None, lineType=None)

    pt1, pt2: 직선의 시작점과 끝점, (x,y) 튜플 형태
    color: 선 색상 또는 밝기, (B,G,R) 튜플 또는 정수값
    thickness: 선 두께(기본 1)
    lineType: cv2.LINE_4, cv2.LINE_8(기본값), cv2.LINE_AA

  • 사각형 그리기
    cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None)
    cv2.rectangle(img, rec, color, thickness=None, lineType=None)

    pt1, pt2: 사각형의 두 꼭지점 좌표, (x,y) 튜플
    rec: 사각형 위치 정보, (x,y,w,h) 튜플
    thickness: 선 두께(기본 1). 음수(-1)를 지정하면 내부를 채움

  • 원 그리기
    cv2.circle(img, center, radius, color, thickness=None, lineType=None)

    center: 원의 중심 좌표. (x,y) 튜플

  • 다각형 그리기
    cv2.polylines(img, pts, isClosed, color, thickness=None, lineType=None)

    pts: 다각형 외곽 점들의 좌표 배열(numpy.ndarray의 리스트)
    isClosed: 폐곡선 True/False

  • 문자열 출력하기
    cv2.putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)

    text: 출력할 문자열
    org: 영상에서 문자열을 출력할 위치의 좌측 하단 좌표. (x,y) 튜플
    fontFace: 폰트 종류(cv2.FONT_HERSHEY_SIMPLEX 등)
    fontScale: 폰트 크기 확대/축소 비율
    bottomLeftOrigin: True(영상의 좌측 하단을 원점으로 간주)/False(기본값)

2. 카메라와 동영상 처리하기

cv2.VideoCapture 클래스

  • OpenCV에서는 카메라와 동영상으로부터 프레임을 받아오는 작업을 cv2.VideoCapture 클래스 하나로 처리한다.

카메라 열기

  • cv2.VideoCapture(index, apiPreference=None)
    index 0으로 설정하면 기본 카메라
  • cv2.VideoCapture.open(index, apiPreference=None) → True/False

비디오 캡쳐 준비 확인

  • cv2.VideoCapture.isOpened() → True/False

프레임 받아오기

  • cv2.VideoCapture.read(image=None) → True/False & image
    현재 프레임(numpy.ndarray)도 같이 반환됨

동영상, 정지 영상 시퀀스, 비디오 스트림 열기

  • cv.VideoCapture(filename, apiPreference=None)
    filename: 비디오 파일 이름, 정지 영상 시퀀스, 비디오 스트림 URL 등

  • cv2.VideoCapture.open(filename, apiPrefernece=None) → True/False

카메라, 비디오 장치 속성 값 참조

  • cv2.VideoCapture.get(propId) → 성공하면 해당 속성 값(float), 실패하면 0

    propId: 속성 상수(VideoCaptureProperties)

    CAP_PROP_FRAME_WIDTH: 프레임 가로 크기
    CAP_PROP_FRAME_HEIGHT: 프레임 세로 크기
    CAP_PROP_FPS: 초당 프레임 수
    CAP_PROP_FRAME_COUNT: 비디오 파일의 총 프레임 수
    CAP_PROP_POS_MSEC: 밀리초 단위로 현재 위치
    CAP_PROP_POS_FRAMES: 현재 프레임 번호
    CAP_PROP_EXPOSURE: 노출

  • cv2.VideoCapture.set(propId, value) → True/False

    propId: 속성 상수
    value: 속성값

3. 동영상 저장하기

cv2.VideoWriter 클래스

  • 프레임을 동영상 파일로 저장할 수 있다.(크기와 데이터 타입이 같아야 함)

동영상 파일 열기

  • cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=None)

  • cv2.VideoWriter.open(filename, fourcc, fps, frameSize, isColor=None) → True/False

    fps: 초당 프레임 수
    frameSize: 프레임 크기. (width, height) 튜플
    isColor: True/False

비디오 파일 준비 확인

  • cv2.VideoWriter.isOpened() → True/False

프레임 저장

  • cv2.VideoWriter.write(image)

Fourcc(4-문자 코드, four character code)

동영상 파일의 코덱, 압축 방식, 색상, 픽셀 포맷 등을 정의하는 정수 값

  • cv2.VideoWriter_fourcc(*'DIVX'): DIVX MPEG-4 코덱
  • cv2.VideoWriter_fourcc(*'XVID'): XVID MPEG-4 코덱
  • cv2.VideoWriter_fourcc(*'X264'): H.264/AVC 코덱
  • cv2.VideoWriter_fourcc(*'MJPG'): Motion-JPEG 코덱

▷ 내일 학습 계획: OpenCV 강의(6~8)

[이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.]

0개의 댓글