2013-04-30 122 views
1

我真的很抱歉,如果我的問題可能是太noob或其他東西。但是,我發現自己在OpenCV中找到的一些命令之間有點混淆。 瀏覽the OpenCV documentation後,我發現有像cvMemStorage和cv :: MemStorage,cvMat和cv :: Mat,cvSeq和cv :: Seq,cvNormalBayesClassifier和cv :: NormalBayesClassifier的命令。一些OpenCV命令有什麼區別?

那麼,這些命令之間有什麼區別?

它們只是C和C++風格之間不同的命令風格嗎?

那麼爲什麼他們(OpenCV團隊)在大多數c和C++世界中只使用一種風格呢?

任何幫助和意見將非常感激。 謝謝

+0

最重要的原因是向後兼容性,如果你破壞他們的代碼,客戶端會恨你。無論如何,如果你的目標平臺支持體面的C++編譯器,那麼堅持使用C++風格的api,這將爲你解決很多麻煩。 – StereoMatching 2013-04-30 17:36:00

+0

來自openCV的教程「C++接口的主要缺點是,目前許多嵌入式開發系統只支持C.因此,除非您針對的是嵌入式平臺,否則使用舊方法是沒有意義的(除非您是受虐狂的程序員,你在問問題)。「 docs.opencv.org/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html#matthebasicimagecontainer – StereoMatching 2013-04-30 17:36:32

回答

2

約定似乎是cvSomething是C類型或函數,而cv::Something是對應的C++版本。在C++中,cvnamespace

OpenCV同時維護C和C++接口,這就是您獲得兩種變體(也有python綁定,這可能會導致一體化文檔混淆)的原因。

+0

所以,它只是C和C++版本的不同風格?我對嗎? 你知道cvCreateMemStorage和cvCreateSeq的等效C++版本嗎? – anarchy99 2013-04-30 13:58:00

+0

@ hxr99它不只是一種不同的風格。 'cv ::'版本是實際的C++類型和函數。通常他們是使用C API的封裝。我不確定你提到的這兩個功能。 – juanchopanza 2013-04-30 14:17:23

0

OpenCV版本2.x的核心庫是用C++編寫的。編碼約定是在命名空間cv中包含所有內容。 (見herehere)。

舊的API(版本1.x)是一個C API。該公約是添加前綴cv

舊的1.x API仍暴露給客戶端代碼。通常情況下,你不需要它。 (正如OpenCV文檔Dynamic structure(因爲您引用了cvCreateMemStorage)所述,「如果您使用新的C++,Python,Java等接口,則不太可能需要此功能。使用std :: vector或其他高級數據結構「)