python - Python 中 OpenCV checkVector 的断言错误

标签 python numpy opencv affinetransform

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'

究竟是什么导致了这些错误以及如何解释它们?

最佳答案

我现在要回答我自己的问题,因为我浪费了大约三个小时的谷歌搜索来在 StackOverflow 上找到这个问题的答案。

函数cv::Mat::checkVector()检查三件事:

  1. 第一个参数指定的数组中的列数。
  2. 第二个参数中的枚举指定的数据类型。当在 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

  3. 第三个不太明显的是检查输入是否连续。这由第三个参数指定,默认为 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' 使切片数组再次连续。

关于python - Python 中 OpenCV checkVector 的断言错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54552289/

相关文章:

python - 计算上床 sleep 的最短和最长时间

numpy - 使 DataArray 默认返回 float 而不是 0 维数组

matlab - 计算对应像素

opencv - 如何在没有 root 权限的情况下安装 OpenCv 3.1.0?

python - 类似于 json python 的文件的自定义解析器

python - uWSGI touch-reload 选项不起作用

python - 当我有一个二维列表时如何生成随机选择?

python - 向量化函数转换为向量化函数 Python

python - 设置 cv2 窗口的全屏属性时出错

python - 使用条件将列表的 pandas 列拆分为多列。