Python 中 OpenCV checkVector 的断言错误
Assertion error from OpenCV checkVector in Python
OpenCV 在 Python 中使用 Numpy 数组作为输入。这抽象了底层 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'
究竟是什么导致了这些错误以及如何解释它们?
我现在要回答我自己的问题,因为我浪费了大约三个小时的谷歌搜索来在 Whosebug 上找到这个问题的答案。
函数 cv::Mat::checkVector() 检查三件事:
- 第一个参数指定的数组中的列数。
第二个参数中的枚举指定的数据类型。当在 Python 中看到错误时,枚举值已经被解析(例如 5 表示 CV_32F 又名 float32)。可能的值为:
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
- 第三个不太明显的是检查输入是否连续。这由第三个参数指定,默认为 true。因此,从 Python.
中的断言错误中无法直接看到此错误
要检查 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'
.
使切片数组再次连续
OpenCV 在 Python 中使用 Numpy 数组作为输入。这抽象了底层 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'
究竟是什么导致了这些错误以及如何解释它们?
我现在要回答我自己的问题,因为我浪费了大约三个小时的谷歌搜索来在 Whosebug 上找到这个问题的答案。
函数 cv::Mat::checkVector() 检查三件事:
- 第一个参数指定的数组中的列数。
第二个参数中的枚举指定的数据类型。当在 Python 中看到错误时,枚举值已经被解析(例如 5 表示 CV_32F 又名 float32)。可能的值为:
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- 第三个不太明显的是检查输入是否连续。这由第三个参数指定,默认为 true。因此,从 Python. 中的断言错误中无法直接看到此错误
要检查 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'
.