TIL - 03.16
# 카메라와 동영상 처리하기
@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