【问题标题】:Error loading OpenCV XML file with Python使用 Python 加载 OpenCV XML 文件时出错
【发布时间】:2012-06-17 00:52:21
【问题描述】:

我正在使用 OpenCV 2.4.1 和 Python 2.7(Enthought EPD 7.3 在 Visual Studio Python 工具下运行)。我正在尝试使用 OpenCV Load() 函数读取 xml 文件:

import cv2
import numpy as np

reprojectionError=cv2.Load("calib.xml")

但我收到此错误:

    reprojectionError=cv2.Load("calib.xml")
AttributeError: 'module' object has no attribute 'Load'
Press any key to continue . . .

有什么想法吗?

【问题讨论】:

  • 你试过 cv2.cv.Load 还是 cv2.core.Load?
  • 对,看来我得用cv2.cv.Load了。这个帖子也很相关:link
  • 现在我得到一个不同的错误:OpenCV Error: Unspecified error (The node does not represent a user object (unknown type?)) in unknown function, file C:\slave\WinInstallerMegaPack\src\opencv\modules\core\src\persistence.cpp, line 4961

标签: python opencv


【解决方案1】:

Python 中的 OpenCV IO 目前非常糟糕。我相信当前的 master 它在 FileNode 下,但文档现在不存在。据推测,您应该使用 Numpy 的标准方法(因为 OpenCV 垫在 Python 中作为 Numpy 数组公开)。

cv 模块也已弃用,因此 Load 不再存在。

无论如何,这里有一个从 OpenCV XML 文件加载 Mat 的快速函数。我放弃了尝试让它在本地与 OpenCV 一起工作,只使用解析器就更简单了:

import xml.etree.ElementTree as ET
import numpy as np

def load_from_opencv_xml(filename, elementname, dtype='float32'):
    try:
        tree = ET.parse(filename)
        rows = int(tree.find(elementname).find('rows').text)
        cols = int(tree.find(elementname).find('cols').text)
        return np.fromstring(tree.find(elementname).find('data').text, dtype, count=rows*cols, sep=' ').reshape((rows, cols))
    except Exception as e: 
        print(e)
        return None

应该涵盖您在 C++ 中保存内容的大部分用途,例如:

cv::FileStorage right_fs("right_calibration.xml", cv::FileStorage::WRITE);
right_fs << "cameraMatrix" << right_camera_matrix;
right_fs.release();

使用 OpenCV 3 和 Python 3 测试,但在 2.7 上应该没问题。

【讨论】:

    【解决方案2】:

    我在加载 haarcascade_frontalface_default.xml 文件时遇到了同样的错误。 所以我刚刚从下面的链接下载了所需的文件

    https://code.google.com/p/jviolajones/downloads/detail?name=haarcascade_frontalface_default.xml

    将其粘贴到特定位置,在代码中给出正确的路径,然后我成功运行了我的代码

    【讨论】:

    • 您能否与我们分享您的代码的相关部分,以便其他用户可以看到适合您的解决方案?
    【解决方案3】:

    我有类似的问题。我在发布模式下使用了调试库,所以它给出了错误。当我将调试库(xd.lib)更改为释放库(x.lib)时,它起作用了。

    思南

    【讨论】:

      【解决方案4】:

      我发现我可以使用 python cv(不是 cv2)API 的 Load() 从 cv 校准应用程序保存的 XML 文件中加载相机矩阵和失真系数。您必须指定文件名,以及该文件中对象的名称。

      import cv
      import numpy
      
      calib_filename = '/path/to/my/output/of/calibration.xml'
      
      camera_matrix = numpy.asarray(cv.Load(calib_filename, cv.CreateMemStorage(), 'camera_matrix'))
      dist_coeffs = numpy.asarray(cv.Load(calib_filename, cv.CreateMemStorage(), 'distortion_coefficients'))
      

      注意 numpy.asarray() 中的换行,以将 cv.Load() 返回的 CvMat 转换为 numpy 数组,cv2 样式,因为看起来您正在尝试在 cv2 中工作(就像我一样)。

      在 Linux 上的 OpenCV 2.4.3、python 2.7 中为我工作。

      【讨论】:

        【解决方案5】:

        我也有同样的错误。经过搜索,我在 OpenCV bug tracker 中发现了一些关于它的讨论。从他们的讨论中,我理解的是(当然有很多我无法理解的东西,比如一些编码等),OpenCV 只加载有效的 xml 文件。

        有效意味着,它应该是一些 OpenCV 结构,如 IplImage、cvSeq 等。否则会引发一些错误。

        当我尝试加载 haarcascade xml 文件时,它返回 NULL。

        TypeError: OpenCV returned NULL
        

        当我尝试加载一些任意 xml 时,(从某个地方获取,与 OpenCV 无关):

        error: The node does not represent a user object (unknown type?)
        

        最后,我加载了一张图片,使用 cv.Save 将其保存在 xml 文件中,并尝试按如下方式加载:

        import cv2
        import numpy as np
        
        img = cv2.cv.LoadImage('0.jpg',0)
        cv2.cv.Save('sof.xml',img)
        e=cv2.cv.Load("sof.xml")
        
        print e
        

        我得到了以下结果,这是正确的:

        <iplimage(nChannels=1 width=300 height=300 widthStep=300 )>
        

        所以我从这些示例和关于错误跟踪器的讨论中了解到,OpenCV 仅加载其中包含有效 OpenCV 结构的 xml 文件。 (这是一个不错的选择。为什么 OpenCV 应该尝试加载所有的 xml 文件?它必须只打开与之相关的文件)。

        这就是我所知道的。希望对你有帮助!!!

        【讨论】:

        • 我试图加载的 XML 文件实际上是 OpenCV 生成的有效 XML(第一行是 &lt;?xml version="1.0"?&gt; &lt;opencv_storage&gt;。该文件包含相机校准数据,它是由第 3 方应用程序生成的使用 OpenCV。查看 OpenCV 文档,似乎我应该能够使用 FileStorage 类加载它,但是我没有看到任何 Python 绑定......也许我应该使用通用 Python XML 库?
        • 好吧,对不起,我对此不太了解。
        • 有关于这个问题的消息吗?有没有办法用python加载包含cvmat序列的xml文件?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 2016-04-22
        • 2015-07-11
        • 1970-01-01
        • 2022-07-26
        • 2019-04-25
        • 1970-01-01
        相关资源
        最近更新 更多