-
Dense Optical Flow algorithm 비교 (open cv)영상처리/3D computer vision 2023. 10. 15. 01:08728x90
dense optical flow algorithm 중, opencv에서 사용 가능한 것들끼리 비교하고자 하였다.
*비교 코드는 아래 사이트를 참조하였다.
https://gist.github.com/FingerRec/eba088d6d7a50e17c875d74684ec2849
opencv optical_flow>
opencv optical_flow>. GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
실험에 아래의 두 이미지를 사용하였다.
정지 화면에 카메라를 회전시켜서 motion을 주었다. algorithm 별 optical flow 위의 결과에서, Deep Flow가 가장 합리적인 결과를 보여주었다.
# coding: utf-8 import numpy as np import cv2 import time import matplotlib.pyplot as plt def flow2img(flow, BGR=True): x, y = flow[..., 0], flow[..., 1] hsv = np.zeros((flow.shape[0], flow.shape[1], 3), dtype = np.uint8) ma, an = cv2.cartToPolar(x, y, angleInDegrees=True) hsv[..., 0] = (an / 2).astype(np.uint8) hsv[..., 1] = (cv2.normalize(ma, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX)).astype(np.uint8) hsv[..., 2] = 255 if BGR: img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) else: img = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB) return img im1= cv2.imread('20231014_233150.jpg') im2= cv2.imread('20231014_233154.jpg') gray1 = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY) # methods = ["Farneback", "SpareToDense PyrLK", "Dual TV-L1", # "DIS Flow", "Simple Flow", "PCA Flow", # "Deep Flow"] methods = ["Farneback", "SpareToDense PyrLK", "Simple Flow", "PCA Flow", "Deep Flow"] flows = list() flowFB = cv2.calcOpticalFlowFarneback(gray1, gray2, None, 0.5, 3, 25, 7, 5, 1.2, cv2.OPTFLOW_FARNEBACK_GAUSSIAN) flows.append(flow2img(flowFB, False)) flowSTD = cv2.optflow.calcOpticalFlowSparseToDense(gray1, gray2, grid_step=5, sigma=0.5) flows.append(flow2img(flowSTD, False)) # dtvl1 = cv2.createOptFlow_DualTVL1() # flowDTVL1 = dtvl1.calc(gray1, gray2, None) # flows.append(flow2img(flowDTVL1, False)) # dis = cv2.optflow.createOptFlow_DIS() # flowDIS = dis.calc(gray1, gray2, None) # flows.append(flow2img(flowDIS, False)) flowSF = cv2.optflow.calcOpticalFlowSF(im1, im2, 3, 5, 5) flows.append(flow2img(flowSF, False)) pcaF = cv2.optflow.createOptFlow_PCAFlow() flowPCA = pcaF.calc(gray1, gray2, None) flows.append(flow2img(flowPCA, False)) deepF = cv2.optflow.createOptFlow_DeepFlow() flowDeep = deepF.calc(gray1, gray2, None) flows.append(flow2img(flowDeep, False)) # cv2.optflow.writeOpticalFlow("dp.flo", flowDeep) fig, axes = plt.subplots((len(flows) + 2) // 3, 3) for i in range(axes.size): ax = axes.item(i) if (i < len(flows)): ax.imshow(flows[i]) ax.set_title(methods[i]) ax.axis("off") plt.show()
728x90'영상처리 > 3D computer vision' 카테고리의 다른 글
pyflow optical flow (0) 2023.11.01 RAFT: Recurrent All-Pairs Field Transforms for Optical Flow 돌려보기 (0) 2023.10.30 Epipolar geometry (0) 2023.02.12 Homogeneous coordinate (0) 2023.02.02 CNN 기반 camera pose estimation의 한계 (0) 2023.02.02