wide and deep

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))

参考

stackoverflow.com

qiita.com