opencvのoptical flow計算は入力にuint8またはfloat32型しか取らない
内容はタイトルの通りです.(終)
下記はエラー内容とその解決方法,参考記事のまとめです.
環境
!python -V # Python 3.6.9 cv2.__version__ # 4.1.2
発生したエラーとサンプルコード
import numpy as np import cv2 TVL1 = cv2.optflow.DualTVL1OpticalFlow_create() video = np.random.rand(10,512,512) print(video.dtype) # float64 opts = [] for i in range(len(video)-1): opts.append(TVL1.calc(video[i],video[i+1],None)) # --------------------------------------------------------------------------- # error Traceback (most recent call last) # <ipython-input-3-9bce225d882c> in <module>() # 1 opts = [] # 2 for i in range(len(video)-1): # ----> 3 opts.append(TVL1.calc(video[i],video[i+1],None)) # error: OpenCV(4.1.2) /io/opencv_contrib/modules/optflow/src/tvl1flow.cpp:413: # error: (-215:Assertion failed) I0.type() == CV_8UC1 || I0.type() == CV_32FC1 in function 'calc'
I0.type() == CV_8UC1 || I0.type() == CV_32FC1
と怒られている.
解決法
uint8かfloat32に入力を型変換しましょう.
video = np.float32(video) #np.uint8(video) print(video.dtype) # float32 opts = [] for i in range(len(video)-1): opts.append(TVL1.calc(video[i],video[i+1],None))