2013-04-30 140 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或其他高级数据结构“)