2012-08-02 36 views
7

我想從python內部調用OpenCV函數MinAreaRect2。 我用Python 2.7和numpy 1.6使用OpenCV 2.4.2。 我去這遠:Python OpenCV Box2D

import cv 

def nda2ipl(arr, dtype=None): 
    return cv.fromarray(np.ascontiguousarray(arr, dtype=dtype)) 

def min_area_rect2(points): 
    storage = cv.CreateMemStorage() 
    cv_points = nda2ipl(points.reshape((-1, 1, 2))) 
    out = cv.MinAreaRect2(cv_points, storage) 
return out 

我可以調用此功能與形狀的ndarray(N×2)。我得到這個樣的結果:

((476.5, 604.5), (951.0, 1207.0), -0.0) 

我認爲第一個元組是盒子的中心,第二給出了寬度,高度和上次的角度。

問題是我無法得到一個明確的參考說明這一點。實際上,opencv文檔告訴我函數在Python中返回什麼。我發現official documentation about this function但這不是很有幫助。

在python中MinAreaRect2的輸出究竟是什麼? 更一般地說,你從哪裏獲得有關OpenCV python包裝的精確文檔?

回答

11

OpenCV的Python包裝文檔與在相同的位點正常的文件一起保持,www.docs.opencv.org

早些時候Python模塊所用的是cv接口,該接口用於本地數據類型從原始C++接口等與CvMat, cvSeq等

後來它被轉移到更好,更先進,更簡單的模塊cv2接口。其中,所有內容都以Numpy數組或本機Python數據類型的形式返回。

這裏,返回的元組與cvBox2D具有相同的參數。你可以在這裏找到更多細節不同python包裝之間的區別:What is different between all these OpenCV Python interfaces?

這裏,你的假設是正確的。這些值正好說明了你提到的內容。

如果你想繪製旋轉矩形,你需要4個矩形的頂點。爲此,您需要一個在文檔中從未見過的函數,即cv2.cv.BoxPoints()(但不用擔心,在OpenCV 2.4.3發佈時,它將在文檔中出現)

你可以找到關於如何在這篇文章中繪製旋轉矩形的例子:Rotated Rectangle

enter image description here

+0

感謝您的幫助! – 2012-08-03 19:05:11

+1

不知何故令人失望,看起來他們已經[推遲](http://code.opencv.org/issues/2023)將BoxPoints添加到文檔的請求,直到OpenCV 3.0 – 2013-05-17 22:56:15

1

如文檔中所述給您鏈接,MinAreaRect2返回Box2D object

甲CvBox2D目的是通過它的中心,大小和角度定義的,如你正確地假設,如所描述here

一般來說,Python包裝器的文檔相當差。您最好的選擇是參考C++文檔並閱讀源代碼。

+1

謝謝您的回答。但是python函數不會返回一個Box2D對象,而是一個python元組。所以我想知道元組元素和C++ Box2D結構之間的關係。我試着查看源代碼,但找不到可以給我答案的地方。實際上,我很難理解opencv庫如何包裝到python中。任何暗示都會非常受歡迎。 – 2012-08-03 13:06:23

+0

我發現這篇文章很清楚:http://opencvpython.blogspot.com.es/2012/06/contours-2-brotherhood.html – Antoni 2017-12-06 18:54:35