使用Python加载OpenCV XML文件时出错

时间:2012-06-14 01:11:36

标签: python opencv

我正在使用OpenCV 2.4.1和Python 2.7(在Visual Studio Python Tools下运行的Enthought EPD 7.3)。我尝试使用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 . . .

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

我也有同样的错误。搜索之后,我在OpenCV bug跟踪器中发现了一些关于它的讨论。从他们的讨论中,我理解的是(当然有许多我无法理解的东西,如某些编码等),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文件?它必须只打开与之相关的文件。)

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

答案 1 :(得分:1)

我发现我可以使用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-style,因为它看起来像是在尝试使用cv2(就像我一样)。 / p>

在Linux上为OpenCV 2.4.3,python 2.7工作。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

目前,Python中的OpenCV IO非常糟糕。我相信当前掌握它在FileNode下面,但文档现在不存在。据推测,您可能希望使用Numpy的标准方法(因为OpenCV垫在Python中被公开为Numpy数组)。

{@ 1}}模块也已弃用,因此cv不再存在。

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

Load

应涵盖您在C ++中保存某些内容的大多数用途,例如:

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

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

答案 4 :(得分:0)

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

思南