【问题标题】:Assertion error from OpenCV checkVector in PythonPython中OpenCV checkVector的断言错误
【发布时间】:2019-02-06 11:13:45
【问题描述】:

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'

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

【问题讨论】:

    标签: python numpy opencv affinetransform


    【解决方案1】:

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

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

    1. 第一个参数指定的数组中的列数。
    2. 第二个参数中的枚举指定的数据类型。当在 Python 中看到错误时,枚举值已经被解析(例如 5 代表 CV_32F aka 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' 来使切片数组再次连续。

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 2016-08-02
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多