Program/OPEN_CV

[Open CV] 객체추척과 모션벡터 _ 카나데옵티컬플로우

사막여유 2022. 7. 2. 10:11
728x90

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장의 영상을 사용했다.

frame_1
frame_2

 

입력 영상을 GrayScale 로 변환시키고 
goodFeaturesToTrack 함수로 코너점을 찾아 코너점 영상으로 만들어준다.

이후 코너점을 사용하여 
Optical Flow를 계산해준다.

위 사진에서의 빨간점이 Optical Flow가 계산된 점이고

노란색점이 코너점 검출에 의해 검출된 Point들이다.

위 이미지를 보면 pt1은 코너점 검출 좌표에 노란색 동그라미를 그린것 이고
pt2는 OpticalFlow 검출 코너 좌표에 빨간색 동그라미를 그렸다.

 * 이때 status 행렬의 값을 계산해서 0인것 ( 추적하지 못한 코너점 ) 은 continue 시켜주는 것이
Optical Flow 계산할 때 좋다.

 

또한 아래 코드소스는 실제 캠을 사용한 동영상에서 코너들이 어디로 
움직이지는 실시간으로 추적해주는 코드이다.

 

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

728x90