과거 자료들

TIL - 03.16

jfl 2022. 3. 16. 19:54

# 카메라와 동영상 처리하기

@VideoCaputre 클래스

카메라, 동영상 모두 매 프레임을 받아오는 공통의 작업 수행(read())

영상 -> open() -> read() -> frame

 

클래스 사용할 때 처음에 인자없이 클래스 선언

VideoCapture cap

 

카메라/동영상 열기

-카메라 열기: cap.open(0); // 0번 카메라

-동영상 열기: cap.open('xxx.mp4') // xxx 파일 재생

-cap.isOpened() : 카메라가 열렸는지 안열렸는지 반환

 

현재 프레임 받아오기

-while 문 이용

-cap >> frame or cap.read(frame) // frame에 영상 받아오기.

*항상 프레임을 잘 받을 수는 없기 때문에 되도록 예외처리(if, 조건문) 추가. // frame.empty() 사용

-imshow("frame", frame)

 

카메라/동영상 닫기

cap.release()

destropyAllWindows() 까지 해주면 좋다.

 

*FPS : Frame / sec, 초당 몇번 프레임을 받아올 수 있는가?

 

Canny(frame, edge, 50, 150) : edge만 출력

-동영상으로 하면 느려지는데 release로 하면 빨라짐.

 

카메라/동영상 속성 값 참조, 설정

참조: cap.get(참조하고자 하는 값); ex. CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT

-get을 우클릭해서 살펴보면 많은 설정값들이 있다.

 

설정: cap.set(기존 설정값, 바꾸고싶은 값); ex. cap.set(CAP_PROP_FRAME_WIDTH, 1280)

 

@VideoWriter 클래스

동영상 파일로 저장

http://www.fourcc.org/codecs.php (압축 방식 참고)

 

fourcc 선언

-int fourcc = VideoWriter::fourcc('X', 'V', 'I', 'D')

 

fps 선언

-double fps = 30

 

사이즈 선언

-Size sz = Size( (int)cap.get(CAP_PROP_FRAME_WIDTH), (int)cap.get(CAP_PROP_FRAME_HEIGHT) )

 

내보내기(output) 선언

-VideoWriter output('이름', fourcc, fps, 사이즈) 

-Publisher 같은 느낌인가(?)

 

delay 선언

-int delay = cvRound( 1000 / fps )

 

저장

-output << frame

-이건 while 문 안에 있어야 함

 

# OpenCV 그리기 함수

선: line()

-line( 시작지점, 끝지점, 선 색상, 선 두께, 선 타입 )

-선 타입: LINE_4, LINE_8, LINE_AA 중 하나 지정

 

사각형: rectangle()

-rectangle( Rect(x, y, w, h), 선 색상, 선 두께, 선 타입 )

-사각형은 선 두께를 -1로 지정하면 내부를 채운다.

 

원: circle()

-circle(

-원은 LINE_AA가 더 부드럽게 원그릴 수 있다.

 

다각형: polylines()

-polylines(꼭지점 좌표

문자열: putText()

-putText()

... 추가적인 함수 : https://docs.opencv.org/4.x/d6/d6e/group__imgproc__draw.html 

 

# 이벤트 처리하기

@키보드 이벤트 처리

키보드 입력 대기 int waitKey()

-값 없으면 입력까지 무한히 기다림

-값 있으면 ms 단위 대기 시간.

 

@마우스 이벤트 처리

void setMouseCallback("창이름", on