我正在使用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 . . .
有什么想法吗?
答案 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)
{@ 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)时,它工作正常。
思南