2022.07.02 금일은 벡터 카나데옵티컬플로우에 관한 강의였다.
동영상에서 움직임 정보를 계산하는 정보를 알아내는 방법에 대해 알아본다.
옵티컬플로우 ( Optical Flow) 란?
- 연속하는 두 프레임 ( 영상 ) 에서 카메라 또는 객체의 움직임에 의해 나타나는 객체의 이동 정보 패턴
옵티컬 플로우 활용 분야
- Structrue from Motion (물체의 주위를 여러 위치에서 촬영할 때 발생하는 카메라의 움직임을 유추하고,
이를 바탕으로 3차 원 형상을 복원하는 것)
- Video Compression ( 영상 압축 )
- Video Stabilization ( 영상 안정화 , 손떨림보정 )
- etc.
OpenCV 옵티컬 플로우 계산 함수
- 루카스 - 카나데 알고리즘 ( Lucas-Kanade algorithm )
cv2.calcOpticalFlowPyrLK(...) ( Pyr 피라미드 - 이미지피라미드를 구축해서 다양한 계산 )
(주로) Sparse points 에 대한 이동 벡터 계산
=> 특정픽셀에서 옵티컬플로우 벡터 계산
=> 변별력이 있는 코너점 픽셀을 주로 사용
- 파네백 알고리즘 ( Farneback's algorithm)
cv2.calcOpticalFlowFarnebak(...)
Dense(밀집) points에 대한 이동 벡터 계산
=> 모든 픽셀에서 옵티컬플로우 벡터 계산
루카스-카나데 옵티컬플로우 계산 함수
nextPts, status, err = cv2.calcOpticalFlowPyrLK(prevImg, nextImg, prevPts, nextPts, status, err, wirnSize, maxLevel, criteria, flags, minEigThreshold)
prevImg: 이전 프레임 영상 ( 8비트 입력 영상 )
nextImg: 현재 프레임 영상 ( 8비트 입력 영상 )
prevPts: 이전 프레임의 추적할 점들 ( 코너 특징점 ), cv2.goodFeaturesToTrack()으로 검출
numpy.ndarray.shape = ( N,1,2 ), dtype = np.float32
nextPst: prevPts 점들이 이동한 ( 현재 프레임 ) 좌표
보통 인자가 아닌 출력값으로 받음
status: 추적이 잘 됐는지 안됐는지에 따른 결과 상태 벡터
numpy.ndarray.shape=(N,1), dtype=np.uint8.
추적을 했으면 1, 못했으면 0
err: 결과 에러 벡터, 대응점 간의 오차
winSize=(21,21): 각 피라미드 레벨에서 검색할 윈도우 크기. 기본값은 ( 21,21 )
maxLevel=3: 최대 피라미드 레벨. 0이면 피라미드 사용 안 함. 기본값은 3
criteria=(COUNT+EPS, 30, 0.01): 반복 탐색 중지 요건 (cv2.TERM_CRITERIA_EPS: 정확도가 epsilon보다 작으면 중지, cv2.TERM_CRITERIA_MAX_ITER: max_iter 횟수를 채우면 중지, cv2.TERM_CRITERIA_COUNT: MAX_ITER와 동일, max_iter: 최대 반복 횟수, epsilon: 최소 정확도)
flgs=0: 연산 모드 (0: prevPts를 nextPts의 초기 값으로 사용, cv2.OPTFLOW_USE_INITAL_FLOW: nextPts의 값을 초기 값으로 사용, cv2.OPTFLOW_LK_GET_MIN_EIGENVALS: 오차를 최소 고유 값으로 계산)
minEigThreshold=1e-4: 대응점 계산에 사용할 최소 임계 고유 값
출처 : 귀퉁이 서재
동영상이 아닌 2장의 영상을 사용했다.
입력 영상을 GrayScale 로 변환시키고
goodFeaturesToTrack 함수로 코너점을 찾아 코너점 영상으로 만들어준다.
이후 코너점을 사용하여
Optical Flow를 계산해준다.
위 사진에서의 빨간점이 Optical Flow가 계산된 점이고
노란색점이 코너점 검출에 의해 검출된 Point들이다.
위 이미지를 보면 pt1은 코너점 검출 좌표에 노란색 동그라미를 그린것 이고
pt2는 OpticalFlow 검출 코너 좌표에 빨간색 동그라미를 그렸다.
* 이때 status 행렬의 값을 계산해서 0인것 ( 추적하지 못한 코너점 ) 은 continue 시켜주는 것이
Optical Flow 계산할 때 좋다.
또한 아래 코드소스는 실제 캠을 사용한 동영상에서 코너들이 어디로
움직이지는 실시간으로 추적해주는 코드이다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'Program > OPEN_CV' 카테고리의 다른 글
[Open CV] 객체추척과 모션벡터 _ OpenCV 트래커 (0) | 2022.07.04 |
---|---|
[Open CV] 객체추척과 모션벡터 _ 밀집 옵티컬플로우 (0) | 2022.07.03 |
[Open CV] 객체추척과 모션벡터 _ 캠시프트 알고리즘 (0) | 2022.06.30 |
[Open CV] 객체추척과 모션벡터 _ 평균이동 알고리즘 (0) | 2022.06.29 |
[Open CV] 객체추척과 모션벡터 _ 배경차분 _ MOG 배경모델 (0) | 2022.06.28 |