4

I'm using OpenCV 2.4.1 and Python 2.7 (Enthought EPD 7.3 running under Visual Studio Python Tools). I'm trying to read an xml file using OpenCV Load() function:

import cv2
import numpy as np

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

but I'm getting this error:

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

Any ideas?

4

5 回答 5

4

我也有同样的错误。经过搜索,我在 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 文件?它必须只打开与之相关的文件)。

这就是我所知道的。希望能帮助到你 !!!

于 2012-06-14T09:23:09.913 回答
3

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 上应该没问题。

于 2017-07-25T15:12:44.050 回答
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 样式,因为看起来您正在尝试在 cv2 中工作(就像我一样)。

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

于 2013-02-19T22:29:37.453 回答
1

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

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

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

于 2014-09-12T11:18:56.377 回答
0

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

思南

于 2013-12-25T10:50:50.287 回答