티스토리 뷰

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()

 

 

FPS : 25, delay : 40 ms 가 나온다.

 

팝업창 사이즈를 설정하고 카메라를 실행해보자.

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() 와 동일 한 코드

※인코딩 형식에 관련된 정보는 아래의 링크에서 확인하도록 하자.

http://fourcc.org/codecs.php 

 

해당 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함