2012-06-14 68 views
4

我正在使用OpenCV 2.4.1和Python 2.7(在Visual Studio Python工具下運行的Enthought EPD 7.3)。我試圖讀取使用OpenCV的load()函數的XML文件:使用Python加載OpenCV 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

您是否嘗試過cv2.cv.Load或cv2.core.Load? –

+0

對,看來我必須使用cv2.cv.Load。這篇文章也是相關的:[link](http://stackoverflow.com/questions/9226258/why-does-python-cv2-modules-depend-on-old-cv) – Arrigo

+0

現在我收到了一個不同的錯誤: 'OpenCV的錯誤:未指定的錯誤在未知功能(節點不表示用戶 對象(未知類型)?),文件 C:\從屬\ WinInstallerMegaPack \ SRC \的OpenCV \模塊\芯\ SRC \ persistence.cpp ,line 4961' – Arrigo

回答

3

我也有同樣的錯誤。搜索後,我在OpenCV bug跟蹤器中發現了一些討論。從他們的討論中,我瞭解的是(當然有很多事情我不能理解像一些編碼等),OpenCV只加載有效的xml文件。

有效的手段,它應該是一些像IplImage,cvSeq等OpenCV結構,否則會引發一些錯誤。

當我試圖加載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)> 

因此,我從這些例子和bug追蹤器的討論中瞭解到,OpenCV只加載其中包含有效OpenCV結構的xml文件。 (這是一個很好的選擇,爲什麼OpenCV應該嘗試加載所有的xml文件呢?它只能打開與之相關的文件)。

這就是我所知道的。希望能幫助到你 !!!

+1

我想加載的XML文件實際上是由OpenCV生成的有效XML(第一行是<?xml version =「1.0」?> '。該文件包含攝像機校準數據,它是由使用OpenCV的第三方應用程序生成的。查看OpenCV文檔,似乎我應該可以使用FileStorage類加載它,但是我沒有看到它的任何Python綁定......也許我應該使用通用的Python XML庫? – Arrigo

+0

嗯,我很抱歉,我對此沒有太多的想法。 –

+0

關於這個問題的任何消息?有沒有辦法用python加載包含cvmat序列的xml文件? – Eric

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()返回到numpy的陣列,CV2式CvMat中的,因爲它看起來像你正試圖在CV2工作(如上午一世)。

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

0

我有類似的問題。我在發佈模式下使用了調試庫,所以它給了錯誤。當我改變調試庫(xd.lib)釋放lib(x.lib)它的工作。

思南

1

OpenCV的IO在Python是目前很差。我相信目前的主人它在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上應該沒問題。