Odds and Ends

Open-CV Python으로 배우는 영상처리, 4장 본문

open cv

Open-CV Python으로 배우는 영상처리, 4장

Squidward 2022. 5. 22. 01:35

 

 

126P 부터 시작

 


 

* 행렬을 영상 파일로 저장

: 행렬을 영상 파일로 저장하려고 할 때, cv2.imwrite() 함수를 이용한다. 저장할 파일 명과 행렬을 인수로 전달하여 저장한다.

: 저장 시, 파일명의 확장자에 따라 다양한 영상 파일 포맷으로 저장 가능하다.

: params 인수로 화질이나 압축률도 설정할 수 있다.

 

 

# 압축 방식에 사용되는 params 인수 튜플(paramId, paramValue)의 예시

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
셀 전체 선택
열 너비 조절
행 높이 조절
paramId
paramValue (기본값)
설명
cv2.IMWRITE_JPEG_QUALITY
0~100 (95)
JPG 파일 화질, 높은 값일수록 화질 좋음
cv2.IMWRITE_PNG_COMPRESSION
0~9 (3)
PNG 파일 압축 레벨, 높은 값일수록 용량은 적어지고, 압축 시간이 길어짐
cv2.IMWRITE_PXM_BINARY
0 or 1 (1)
PPM, PGM 파일의 이진 포맷 설정
  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

 

// write_image 행렬 영상 저장하는 파이썬 파일
import cv2

image = cv2.imread("images/read.color.jpg", cv2.IMREAD_COLOR) // imread 함수로 이미지 (컬러로) 읽어서 저장
if image is None: raise Exception("영상 파일 읽기 에러") // 지정한 이미지 파일이 없을 경우 예외처리

params_jpg = (cv2.IMWRITE_JPEG_QUALITY, 10) // JPEG 파일의 화질을 설정하는 인수 튜플, 기본값은 95인데 10으로 설정해줌
params_png = [cv2.IMWRITE_PNG_COMPRESSION, 9] // PNG 압축 레벨 설정, 최고치인 9로 설정-> 많이 압축(화질 떨어짐,압축시간김)

// 행렬을 영상 파일로 저장, 새로 파일을 만드는 것임
cv2.imwrite("images/write_test1.jpg", image) // 기본으로 저장, 디폴트값은 95로 설정됨
cv2.imwrite("images/write_test2.jpg", image, params_jpg) // 지정한 화질로 저장, 화질 낮아짐
cv2.imwrite("images/write_test3.png", image, params_png) // 지정한 화질로 저장, 압축하여 화질 낮아짐
cv2.imwrite("images/write_test4.bmp", image) // 파일 포맷을 bmp로 바꾸어 저장함
print("저장 완료")
 
// write_image2 행렬 영상 저장하는 파일, 16비트나 32비트 영상 저장하는 방법( 8비트 영상 -> 16비트, 32비트 )
import numpy as np
import cv2

image8 = cv2.imread("images/read_color.jpg", cv2.IMREAD_COLOR)
if image8 is None: raise Exception("영상 파일 읽기 에러")  // 영상 파일 예외 처리

// 형변환 및 화소 스케일 조정, 65535/255은 화소값의 범위를 32비트 실수에 맞게 0~1 범위로 스케일 변경해준다.
image16 = np.uint16(image8 * (65535/255)) 
// 1/255은 8비트 화소값의 범위를 32비트 실수에 맞게 0~1 범위로 스케일 변경해준다.   
image32 = np.float32(image8 * (1/255))     

// 화소값 확인 - 관심 영역(10, 10) 위치에서 2행, 3열 출력
print("image8 행렬의 일부\n %s\n" % image8[10:12, 10:13])
print("image16 행렬의 일부\n %s\n" % image16[10:12, 10:13])
print("image32 행렬의 일부\n %s\n" % image32[10:12, 10:13])

cv2.imshow('image16', image16)
cv2.imshow('image32', (image32*255).astype('uint8')) // astype을 이용하면 데이터 타입을 바꿀수 있다.
cv2.waitKey(0)
 

4.5 비디오 처리

 

비디오 파일은 코덱에 의해 포맷에 맞게 압축해 저장되고 압축을 해제 하여 재생되기도 한다.

 

코덱이란?

: 비디오 신호를 압축하는 코더(coder)와 압축을 해제하는 (decoder)의 합성어이다.

 

따라서 비디오 파일에서 영상 프레임을 받아 영상처리를 하기 위해서는 코덱을 통해 압축을 해제해야한다.

 

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
셀 전체 선택
열 너비 조절
행 높이 조절
*VideoCapture 클래스 함수 설명 (동영상을 처리할 수 있는 클래스)
1. 생성자, 3가지 VideoCapture 객체 선언 방법 지원
filename : 개방할 파일 이름 혹은 영상 시퀀스
device: 개방할 동영상 캡처 장치의 ID ( 카메라 한개 연결 시 0으로 지정 )
- cv2.VideoCapture() -> <VideoCapture object>
- cv2.VideoCapture(filename) -> <VideoCapture object>
- cv2.VideoCapture(device) -> <VideoCapture object>


2. 동영상 캡처를 위한 동영상 파일 혹은 캡처 장치를 개방한다.
- cv2.VideoCapture.open(filename) -> retval
- cv2.VideoCapture.open(device) -> retval


3. 캡처 장치의 연결 여부를 반환한다.
- cv2.VideoCapture.isOpened() -> retval


4. 동영상 파일이나 캡처 장치를 해제한다.( 클래스 소멸자에 의해서 자동으로 호출되므로 명시적으로 수행하지 않아도 됨 )
- cv2.VideoCapture.release() -> retval


5. 비디오 캡처의 속성 식별자로 지정된 속성의 값을 반환한다. 캡처 장치가 제공하지 않는 속성은 0을 반환한다.
propld : 속성 식별자
- cv2.VideoCapture.get(propld) -> retval


6. 지정된 속성 식별자로 비디오 캡처의 속성을 설정한다.
propld: 속성 식별자
value: 속성 값
- cv2.VideoCapture.set(propld, value) -> retval


7. 캡처 장치나 동영상 파일에서 다음 프레임을 잡는다.
- cv2.VideoCapture.grab() -> retval


8. grab() 으로 잡은 프레임을 디코드해서 image 행렬로 전달한다.
image: 잡은 프레임이 저장된 행렬
flag: 프레임 인덱스
- retrieve(image, flag) -> retval, image


9. 캡처 장치나 동영상 파일에서 다음 프레임을 잡아 디코드해서 image 행렬로 전달한다.
- cv2.VideoCapture.read(image) -> retval, image
  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제
  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
셀 전체 선택
열 너비 조절
행 높이 조절
*VideoWriter 클래스 설명
filename: 출력 동영상 파일 이름
fourcc: 프레임 압축에 사용되는 코덱의 4-문자
fps : 생성된 동영상 프레임들의 프레임률(초당 프레임수)
frameSize : 동영상 프레임의 크기(가로 * 세로)
isColor : True면 컬러로 인코딩, false면 흑백으로 인코딩
(1) 생성자, 행렬로 된 영상들을 동영상 파일로 저장
- cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor) -> <VideoWriter object>
- cv2.VideoWriter.open(filename, fourcc, fps, frameSize, isColor)-> retval(리턴값)


(2) : 캡처 장치나 동영상 파일이 열려있는지 확인
- cv2.VideoWriter.isOpened() -> retval


(3) : image 프레임을 파일로 저장한다.
- cv2.VideoWriter.open()


(4) : 영상을 동영상 파일의 프레임으로 지정하기 위해 동영상 파일을 개방한다. 인수는 생성자의 인수와 동일하다. //앞에 생성자에 쓴거랑 같음
- cv2.VideoWriter.open()


(5): 동영상 파일 저장을 위해 VideoWriter 객체의 개방 여부를 확인한다.
- cv2.VideoWriter.isOpened()
  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

 

* 카메라의 주요 속성 식별자: 카메라의 세부 정보를 가져오거나 지정할 수 있도록 하는 주요 속성 식별자(propld)

 

 


134p 이어서 작성

 

 

728x90