2012-11-14 204 views
13

幾天前,我開始尋找一種製作簡單計算機視覺系統的好方法。 OpenCV庫是我需要的東西,但是很難用Python學習,特別是在OpenCV 2.4.3更新之後,Python的相關文檔很少。所以,我現在明白了,有一堆的OpenCV的變化,對exaxmpleOpenCV 2.4.3和Python

import cv 

現在

import cv2 

而且還有一堆缺少模塊。我的意思是,是的,有新的python-opencv語法的例子,但它非常狹窄,並且證明很難理解。 例如:正式文件 示例Python代碼

cv2.cvtColor(src, code[, dst[, dstCn]]) 

我知道這是什麼意思的代碼以及如何使用它,至少我想我知道。但寫源和顏色代碼什麼也不做只是給我:

Traceback (most recent call last): 
    File "C:\FILEFOLDER\tut.py", line 11, in <module> 
    cv.cvtColor('proba.jpg', 'CV_RGB2GRAY') 
TypeError: an integer is required 

或者,如果我嘗試寫這樣的變量代碼:

Traceback (most recent call last): 
    File "C:\FILEFOLDER\tut.py", line 11, in <module> 
    cv.cvtColor('proba.jpg', CV_RGB2GRAY) 
NameError: name 'CV_RGB2GRAY' is not defined 

那麼,有沒有Python的相關參考文件/教程/書/指南對於最新的OpenCV而言,解釋不會讓像我這樣的新手和C++或Java的不需要的代碼示例混淆?

+0

嗨,python-opencv文檔很舊。當我在2年前使用它時,我面臨同樣的問題。根據我可以記得在python中的1個參數是隱含的,並且在C文件中,它是明確的。我很難弄清楚。我相信在C中使用opencv更容易python opencv,它在C中速度更快。 – Netro

+0

因此,如果我想開發計算機視覺,我必須學習C :) – Domagoj

+1

我建議您嘗試在C++中使用OpenCV,並有一個大的社區,仍然Python應該得到一個體面的OpenCV文檔,我給你。如果你正在做一些簡單的事情,也許你可以試試PIL。 – PepperoniPizza

回答

9

我想你是在反向路徑。

實際上,與新的cv2模塊相比,OpenCV與舊的cv接口相比變得更加簡單。由於Numpy的支持,不僅簡單,而且速度非常快,生產效率高。唯一的一點是,我們應該知道如何恰當地使用它。

在這裏,你應該使用功能如下:

img = cv2.imread('pic.jpg') 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 

我想你訪問一個SOF這說明兩個模塊之間的一些比較:What is different between all these OpenCV Python interfaces?

另外一個SOF是在這裏,這是一個簡單的演示,說明如何使用Numpy支持來加速代碼:Performance comparison of OpenCV-Python interfaces, cv and cv2

儘管C++是官方語言,但您不需要學習C++或C來使用OpenCV。儘管如此,Python-OpenCV仍然有很好的支持。一旦掌握瞭如何使用OpenCV,您就可以自己將C++代碼轉換爲Python。然後你可以從C++教程中學習OpenCV。例如,我開始通過Gary Bradsky的「Learning OpenCV」學習OpenCV,它完全使用C++。那時候,只有cv接口。

正如你在評論中提到的,opencvpython.blogspot.com有一些入門教程。我開始在OpenCV中集中新手。

此外,還要檢查該SOF更多教程:Books for OpenCV and Python?

4

把它從另一個角度,並允許您運行與新的OpenCV的安裝版本較舊的代碼...

首先從cv移動到cv2與圖書館使用不同的數據結構來處理很多功能有關。判斷函數是否在cv2和cv之間發生變化的最簡單方法是cv函數以大寫字母開頭。重做的cv2函數似乎總是有小寫的第一個字母。所以如果你使用舊書或舊的例子,你仍然可以使用傳統的cv。 cv現在簡單地嵌入在cv2中。只需在腳本頂部使用以下內容:

import cv2 
    import cv2.cv as cv #required for old code not to be changed 

這可讓您在不更改它的情況下運行較舊的代碼。我將在這裏演示你的函數調用。你有...

cv.cvtColor('proba.jpg', 'CV_RGB2GRAY') 

我注意到的第一件事是你的函數可能被稱爲錯誤的。 (給定函數的第一個字母是小寫,它應該以cv2而不是cv開頭)。其次是你傳遞函數的'代碼'。 '代碼'是cv2和cv的成員(編碼noob在這裏,原諒我,如果我的一些詞彙是不準確的),但不總是相同的。你有'CV_RGB2GRAY'。首先,沒有引號。這是一個cv'代碼'而不是cv2。你也錯過了'cv。'前面。爲了證明這裏是我如何相信你的函數應該被稱爲老版CV:

cv.CvtColor('proba.jpg', cv.CV_RGB2GRAY) #Assuming you used listed imports 
    cv2.cv.CvtColor('proba.jpg', cv2.cv.CV_RGB2GRAY) #Assuming you skipped second import 

現在CV2 ......

cv2.cvtColor('proba.jpg', cv2.COLOR_RGB2GRAY) 

你去那裏,我希望這有助於。請記住,給定的python運行的腳本,你可以直接輸入任何你不確定的命令行。這對幫助我建立我的理解有奇效(我5天前第一次使用python)。例如,如果你,想知道爲什麼它要在你的函數的整數,當你鍵入

cv.CV_RGB2GRAY 

直接進入python命令行,它吐出「7」(方便的,它是一個int)回你。 cv2版本吐出'7L'。請記住以某種形式一次又一次地使用WaitKey()函數,否則在某些情況下,highgui可能沒有足夠的時間來處理某些命令。那麼包裝它。對不起,如果我覆蓋了一些已經覆蓋或引用的東西。如果我確實可以隨意刪除它,管理員。