티스토리 뷰
1. 이미지 읽기
import cv2 # openCV 라이브러리 불러오기
imgFile ='../picture/myImage1.jpg' # 이미지 파일이 저장되어있는 경로
img = cv2.imread(imgFile) # 이미지를 읽어서 'img' 변수에 할당
if img is not None: # 해당 변수에 이미지가 할당되어 있다면 실행
cv2.imshow('IMG',img) # 읽은 이미지를 화면에 표시한다.
cv2.waitKey() # 키가 입력될 때 까지 대기
cv2.destroyAllWindows() # 모든 창을 닫는다.
else:
print("이미지를 읽지 못했습니다.")
해당 코드를 입력하면 새 윈도우가 생성되며 이미지가 출력된다.
이미지를 흑백처리도 가능하다 위의 코드에서 이미지를 할당하는 코드만 아래와 같이 수정해 주자.
img = cv2.imread(imgFile,cv2.IMREAD_GRAYSCALE)
이미지가 흑백으로 바뀐것을 볼 수 있다.
2. 이미지 저장하기
openCV 로 읽어들인 이미지를 지정된 파일에 저장할 수 있다. 관련함수는 아래와 같다.
cv2.imwrite()
컬러로 읽어들인 이미지를 흑백으로 변환하여 저장하는 코드를 작성해 보자.
import cv2
imgFile ='/Users/KWON/Pictures/coffee.jpg' # 불러올 이미지 경로
saveFile ='/Users/KWON/Pictures/coffeeGray.jpg' # 저장 하고자 하는 경로
img = cv2.imread(imgFile,cv2.IMREAD_GRAYSCALE)
if img is not None:
cv2.imshow('IMG',img)
cv2.imwrite(saveFile,img) # 이미지 저장 함수 (저장 경로,저장 할 이미지)
cv2.waitKey()
cv2.destroyAllWindows()
else:
print("이미지를 읽지 못했습니다.")
위 사진을 보면 설정한 경로로 이미지가 흑백으로 저장된 것을 볼 수 있다.
3 . 동영상 읽기
openCV 는 동영상 파일이나 컴퓨터 카메로부터 연속된 이미지 프레임을 읽을 수 있는 API 를 제공한다.
아래는 관련 API 들이다.
- cap = cv2.VideoCapture(path or index)
- path : 동영상 파일 경로
- index : 카메라 장치 번호
- cap : VideoCapture 의 객체
- ret = cap.isOpened()
- ret : 초기화 여부 (bool 반환)
- ret , img = cap.read()
- ret : 프레임 읽기 성공, 실패 여부
- img : 프레임의 이미지
- cap.set(id, value) : 프로퍼티 변경
- cap.get(id) : 프로퍼티 확인
- cap.release() : 캡처 자원 반납
import cv2
videoFile ='/Users/KWON/Pictures/dance.gif' # 불러올 이미지 경로
cap = cv2.VideoCapture(videoFile) # 동영상 캡처 객체 생성
if cap.isOpened(): # cap 객체 초기화 확인
while True:
ret, img = cap.read() # 다음 프레임 읽기
if ret: # 프레임 읽기 정상
cv2.imshow(videoFile,img) # 화면에 표시
cv2.waitKey(25) # 25 ms 지연
else: # 다음 프레임을 읽을 수 없을 때
break # 중단
else:
print("비디오 파일을 열 수 없습니다.")
cap.release() # 캡처 자원 반납
cv2.destroyAllWindows()
위와 같이 코드를 작성하면 동영상 파일을 열 수 있다.
(참고)
.gif, .avi 포멧도 열리더라
4. 카메라(웹캠) 을 읽어보자
앞에서 설명한 videoCapture를 불러드리는 코드에서 인수로 index를 입력하면 카메라로 접근할 수 있다.
코드는 아래와 같다.
import cv2
cap = cv2.VideoCapture(0) #웹캠을 불러온다.
if cap.isOpened():
while True:
ret, img =cap.read()
if ret:
cv2.imshow('camera',img)
if cv2.waitKey(1) !=-1: # 1 ms 동안 키 입력대기
break # 아무 키나 눌렀으면 중지
else:
print('no frame')
break
else:
print("카메라를 열 수 없습니다.")
cap.release()
cv2.destroyAllWindows()
코드를 실행하면 아래와 같이 웹캠 화면이 나온다.
추가적으로 카메라(웹캠) 속성 제어할 수 있는 속성이 있다.
해당 속성의 수가 너무 많은 관계로 자세한 정보는 openCV의 API 문서를 참고하자.
https://docs.opencv.org/3.4/d4/d15/group__videoio__flags__base.html
OpenCV: Flags for video I/O
enum cv::VideoCaptureAPIs { cv::CAP_ANY = 0, cv::CAP_VFW = 200, cv::CAP_V4L = 200, cv::CAP_V4L2 = CAP_V4L, cv::CAP_FIREWIRE = 300, cv::CAP_FIREWARE = CAP_FIREWIRE, cv::CAP_IEEE1394 = CAP_FIREWIRE, cv::CAP_DC1394 = CAP_FIRE
docs.opencv.org
그 중 많이 사용되는 일부 속성들을 적어보았다.
- cv2.CAP_PROP_FRAME_WIDTH : 프레임 폭
- cv2.CAP_PROP_FRAME_HEIGHT : 프레임 높이
- cv2.CAP_PROP_FPS : 초당 프레임 수
- cv2.CAP_PROP_POS_MSEC : 동영상 파일의 프레임 위치
- cv2.CAP_PROP_POS_AVI_RATIO : 동영상 파일의 상대 위치 (0: 시작, 1: 끝)
- cv2.CAP_PROP_FOURCC : 동영상 파일 코덱 문자
- cv2.CAP_PROP_AUTOFOCUS : 카메라 자동 초점 조절
- cv2.CAP_PROP_ZOOM : 카메라 줌
사용 방법은 'cap' 객체에 'get', 'set' 방식으로 불러오거나 설정하면 된다.
해당 속성을 이용해서 FPS를 조정해서 동영상 파일을 제어 해보자.
import cv2
videoFile ='/Users/KWON/Pictures/dance.gif' # 불러올 이미지 경로
cap = cv2.VideoCapture(videoFile) # 동영상 캡처 객체 생성
if cap.isOpened(): # cap 객체 초기화 확인
fps=cap.get(cv2.CAP_PROP_FPS) # 프레임 수 를 구한다.
delay =int(1000/fps) # 지연 시간을 계산한다.
print("FPS: %f, Delay %dms" %(fps,delay))
while True:
ret, img = cap.read() # 다음 프레임 읽기
if ret: # 프레임 읽기 정상
cv2.imshow(videoFile,img) # 화면에 표시
cv2.waitKey(delay) # 25 ms 지연
else: # 다음 프레임을 읽을 수 없을 때
break # 중단
else:
print("비디오 파일을 열 수 없습니다.")
cap.release() # 캡처 자원 반납
cv2.destroyAllWindows()
팝업창 사이즈를 설정하고 카메라를 실행해보자.
import cv2
cap = cv2.VideoCapture(0) #웹캠을 불러온다.
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height =cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print("기존 영상의 사이즈: %d, height:%d"% (width,height))
cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240)
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height =cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print("설정 후 영상의 사이즈: %d, height:%d"% (width,height))
if cap.isOpened():
while True:
ret, img =cap.read()
if ret:
cv2.imshow('camera',img)
if cv2.waitKey(1) !=-1: # 1 ms 동안 키 입력대기
break # 아무 키나 눌렀으면 중지
else:
print('no frame')
break
else:
print("카메라를 열 수 없습니다.")
cap.release()
cv2.destroyAllWindows()
기존 카메라 사이즈는 640 x 480 이었다면 설정 후 320 x 240 으로 변경된 것을 알 수 있다.
5. 비디오 파일 저장하기
import cv2
cap = cv2.VideoCapture(0)
if cap.isOpened():
while True:
ret, frame =cap.read() # 카메라 프레임 읽기
if ret:
cv2.imshow('camera',frame) # 프레임 화면 표시
if cv2.waitKey(1) !=-1: # 아무 키나 누르면
cv2.imwrite('photo.jpg',frame) # 프레임을 'photo.jpg' 에 저장한다.
break # 아무 키나 눌렀으면 중지
else:
print('no frame')
break
else:
print("카메라를 열 수 없습니다.")
cap.release()
cv2.destroyAllWindows()
카메라의 하나의 프레임만 저장하는 것이 아닌 여러 프레임을 저장하려면 cv.2.VideoWirter() 라는 새로운 API 가 필요하다.
해당 API 의 기능은 아래와 같다.
비디오 저장 API 기능 모음
- writer = cv2.VideoWriter(file_path,fourcc,fps,(width,height)) : 비디오 저장함수의 생성자
- file_path : 비디오 파일 저장 경로
- fourcc : 비디오 인코딩 형식 4글자
- fps : 초당 프레임 수
- (width,height) : 프레임의 (폭, 높이)
- writer : 생성된 비디오 저장 객체
- writer.write(frame) : 프레임 저장
- frame : 저장할 프레임 (Numpy 배열)
- writer.set(id,value) : 프러퍼티 변경
- writer.get(id) : 프로퍼티 확인
- ret = writer.fourcc(c1,c2,c3,c4) : fourcc 코드 생성
- c1,c2,c3,c4 : 인코딩 형식 4글자 (MJPG,DIVX, 등)
- ret : fourcc 코드
- cv2.VideoWriter_fourcc(c1,c2,c3,c4) : cv2.VideoWriter.fourcc() 와 동일 한 코드
※인코딩 형식에 관련된 정보는 아래의 링크에서 확인하도록 하자.
해당 API를 사용한 카메라 녹화코드이다.
import cv2
cap=cv2.VideoCapture(0) # 카메라 0번 연결
if cap.isOpened:
file_path ='./record.avi' # 저장할 파일 경로 이름
fps=25.4 # fps 설정
fourcc = cv2.VideoWriter_fourcc(*'DIVX') # 인코딩 포맷 숫자
width= cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height =cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
size=(int(width),int(height)) # 프레임 크기
out =cv2.VideoWriter(file_path,fourcc,fps,size) # videoWriter 객체 생성
while True:
ret, frame = cap.read()
if ret:
cv2.imshow('camera-recording',frame)
out.write(frame) # 파일 저장
if(cv2.waitKey(int(1000/fps)))!=-1:
break
else:
print("no frame")
break
out.release() # 파일 닫기
else:
print("can't open camera")
cap.release()
cv2.destroyAllWindows()
해당 코드를 실행하면 .avi 포맷으로 영상파일이 저장된다.
'Opencv 공부' 카테고리의 다른 글
[openCV] NumPy (3) | 2023.05.06 |
---|---|
[openCV] 각종 이벤트 함수 모음 (1) | 2023.05.04 |
[openCV] 창 관리하기 (0) | 2023.05.01 |
[openCV] 그림 그리기 (2) | 2023.04.30 |
[openCV] vscode 환경에서 설치해보자 (0) | 2023.04.23 |