OpenCV使用Numpy数组作为Python中的输入。这抽象了底层C ++数组的许多特征。
在OpenCV中的所有函数旁边(例如cv2.getAffineTransform)对C ++中的输入数据执行检查,例如:
inputMat.checkVector(3, CV_32F) == 3
由此产生的断言错误通常是隐秘的,有时无法正确捕获在Python中:
(-215:Assertion failed) src.checkVector(2, 5) == 3 && dst.checkVector(2, 5) == 3 in function 'cv::getAffineTransform'
究竟是什么会导致这些错误以及如何解释这些错误?
答案 0 :(得分:2)
我现在要回答自己的问题,因为我浪费了大约三个小时的时间来在StackOverflow上找到答案。
函数cv::Mat::checkVector()检查三件事:
第二个参数中的枚举指定的数据类型。在Python中看到错误时,已经解析了枚举值(例如,对于CV_32F又称为float32,则为5)。可能的值为:
CV_8U 0
CV_8S 1
CV_16U 2
CV_16S 3
CV_32S 4
CV_32F 5
CV_64F 6
CV_USRTYPE1 7
Source
要检查numpy数组的连续布局,可以查看np.ndarray.flags
参数。通常,将Numpy数组创建为C连续的,但可以通过切片等操作将其变为非连续的:
>> x = np.zeros((10, 68, 3))
>> x.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
>> x[:, [33, 36, 45]].flags
C_CONTIGUOUS : False
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : True
ALIGNED : True
np.ndarray.copy()函数可以通过为其赋予参数order='C'
来使切片数组再次连续。