Odds and Ends
Open-CV Python으로 배우는 영상처리, 4장 본문
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
'open cv' 카테고리의 다른 글
OpenCV-Python으로 배우는 영상 처리 및 응용 3장 연습문제 (0) | 2022.05.22 |
---|