광학 흐름 - HS(Optical Flow HS)
카메라와 피사체의 상대 운동
에 의하여 발생하는 피사체의 운동에 대한 패턴
을 검출합니다.
HS(Horn Schunck)
방법은 입력 이미지의 모든 픽셀
에 대하여 광학 흐름
을 검출합니다.
이전 프레임(Previous)
과 현재 프레임(Current)
은 영상이나 이미지를 사용합니다.
원본(Source, src)
은 영상을 사용합니다.
메인 코드
세부 코드
이전 프레임 previous
와 현재 프레임 current
를 매개변수로 사용하여 검출을 진행합니다.
광학 흐름 함수는 그레이스케일
을 적용하여 검출을 진행합니다.
계산이미지로 사용할 prev
와 curr
변수에 그레이스케일
을 적용합니다.
이후, 결과로 사용할 optical
필드에 현재 프레임
을 사용합니다.
- Tip : 그레이스케일을 사용하여 검출하므로
급격한 밝기 변화
나 노이즈
에는 정확한 검출을 얻어낼 수 없습니다.
행
과 열
을 설정합니다. 매트릭스는 행의 개수 x 열의 개수
로 사용합니다.
X 방향 속도 벡터
를 저장할 velx
와 Y 방향 속도 벡터
를 저장할 vely
를 매트릭스 형식으로 생성합니다.
행의 개수
는 높이의 크기
와 같으며, 열의 개수
는 너비의 크기
와 같습니다.
매트릭스를 생성하였으므로, SetZero()
를 통하여 매트릭스의 값을 0
으로 초기화합니다.
Cv.TermCriteria()
를 사용하여 종료 기준을 설정합니다.
Cv.TermCriteria(만족 조건, 최대 반복 횟수, 정확도)
입니다.
- 만족 조건
CriteriaType.Iteration
: 최대 반복 횟수
에 도달 후, 알고리즘을 종료합니다.
CriteriaType.Epsilon
: 정확도
보다 낮아진 후, 알고리즘을 종료합니다.
CriteriaType.Iteration | CriteriaType.Epsilon
: 최대 반복 횟수
와 정확도
중 더 빠르게 만족하는 조건을 사용합니다.
Cv.CalcOpticalFlowHS()
을 사용하여 광학 흐름
을 구합니다.
Cv.CalcOpticalFlowHS(이전 프레임, 현재 프레임, 초기 근사값 속도 필드 사용 유/무, x 방향 속도 벡터, y 방향 속도 벡터, 라그랑지안 승수, 종료 기준)
입니다.
초기 근사값 속도 필드 사용 유/무
는 초기 근사값으로 입력 속도를 사용할지 여부를 결정합니다.
x 방향 속도 벡터
와 y 방향 속도 벡터
에 광학 흐름의 값이 담깁니다.
라그랑지안 승수
는 매끄러움도를 뜻합니다. 값이 클수록 더 부드러운 광학 흐름
을 얻습니다.
이중 for
문을 사용하여 속도 벡터
의 값을 출력합니다.
행
과 열
로 반복을 실행합니다.
변환식
에서 값을 +=15
로 두어, 화면을 15 픽셀
마다 광학흐름을 검출합니다.
Cv.GetReal2D()
함수를 사용하여 매트릭스에 담겨있는 속도 벡터 성분을 불러옵니다.
Cv.GetReal2D(matrix, index0, index1)
을 의미합니다.
index0
은 행 방향(↓)을 의미합니다.
index1
은 열 방향(→)을 의미합니다.
Cv.DrawLine()
을 사용하여 광학 흐름을 optical
필드에 표시합니다.
광학 흐름의 발생 지점은 (j, i)
입니다.
광학 흐름의 도착 지점은 (j + dx, i + dy)
입니다.
dx
와 dy
의 값을 사용하여 광학 흐름의 속도를 출력할 수 있습니다.
- Tip :
dx
와 dy
를 이용하여 일정 속도 이상, 이하의 값을 무시하거나 출력할 수 있습니다.
출력 결과
댓글 남기기