2012-01-09 167 views
4

雖然試圖用opencv做實時平面對象跟蹤,但我遇到了pyopencv的「查找對象」演示。這個腳本做了我想要的,但它將一個靜態圖像與另一個靜態圖像進行比較,然而我試圖將靜態圖像與從網絡攝像頭抓取的當前幀進行比較。爲此我換成這行while循環在opencv導致錯誤

scene_filename = "box_in_scene.png" 

與此

capture = cv.VideoCapture(0) 
frame = Mat() 
capture >> frame 
imwrite("box_in_scene.png",frame) 

這工作,因爲它應該,但是當我再嘗試添加一個簡單的循環,使之不斷地做到這一點,它會通過一個週期然後停止。當我退出腳本時,出現以下錯誤:

OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupport 
ed array type) in cvGetMat, file M:\programming\packages\opencv\workspace\2.1\Op 
enCV-2.1.0\src\cxcore\cxarray.cpp, line 2476 
Traceback (most recent call last): 
    File "find_obj.py", line 114, in <module> 
    imageDescriptors = surf(image, mask, imageKeypoints) 
RuntimeError: M:\programming\packages\opencv\workspace\2.1\OpenCV-2.1.0\src\cxco 
re\cxarray.cpp:2476: error: (-206) Unrecognized or unsupported array type in fun 
ction cvGetMat 

任何人都有線索可能導致這種情況?

我使用的循環是

myloop = 1 
while myloop == 1 : 

link是在它的全部代碼。

+2

請問您可以添加while循環的問題?只是爲了看看可能發生了什麼變化 – 2012-01-09 19:47:13

+0

你可以發佈循環代碼的開頭,在那裏捕獲框架並嘗試循環它 – SB26 2012-01-09 21:57:02

+0

你的例子根本無法理解。請重新編寫它,在整個循環中添加相關代碼,並在循環之前添加相關代碼。 – Sam 2012-01-10 06:54:16

回答

0

在仔細閱讀代碼後,您會立即想到幾件事情。首先,你正在聲明一個新的Mat(),並且每次循環時都會聲明兩個新的namedWindow對象。雖然這會在數千次循環之後導致內存錯誤(取決於您的計算機和操作系統),但這可能不是您的主要問題。然而,這是一種做事和做壞事的可怕方式。

我的第二個問題是您從您的攝像機掃描圖像,將其保存到文件,然後將文件重新加載到內存中,以便您可以使用該圖像!我知道想要從相機中將圖像的副本保存在內存中,但您已將其存儲在內存中,爲何要重新加載它?如果你在windows上,這可能是你的壞矩陣的源頭,因爲VC++ 10庫已知有一些imwrite和imread的問題。 [編輯]我知道你使用的是python,但是你的程序報告了.cpp文件中的錯誤,這意味着python導入實際上與某處的C++庫相鏈接[/編輯]

嘗試刪除imwrite和imread呼叫您的循環,並直接從相機使用圖像。如果你的代碼在此之後有效,那麼你就會知道你的問題在哪裏。讓我們知道怎麼回事。