决定模块化OpenCV应用程序的语言/框架

时间:2013-10-20 04:54:31

标签: c++ opencv c++11 programming-languages objective-c++

这是关于什么的?

我们有一个C ++应用程序,使用 OpenCV 处理视频的图像处理和计算机视觉,我们将从头开始重写它,需要一些帮助来决定使用哪些技术。更具体地说,我需要帮助如何选择我使用的技术

关于应用

应用程序的功能分为模块,它们按照配置XML文件定义的顺序调用,也可以在运行时更改,但不能实时更改(即应用程序不需要关闭,但处理将从头开始)。这些模块在中央数据池中共享数据。

为什么我们从头开始?

这个应用程序并没有像现在的那样具有动态性,因此它已经发展成为一系列错误的补丁,宏和解决方法;它现在充满了内存泄漏,不必要的QT依赖性,QT和OpenCV图像格式之间的转换速度慢,编译和测试时间也增长得太多。


语言选择

原始代码使用的是C ++,只是因为最初启动项目的人只是知道 C ++。这可能是一个不错的选择,因为我们需要尽可能快,但可能有更好的选择来考虑应用程序的动态特性。

我们受限于OpenCV支持的语言(主要是C ++,Java和Python;虽然我读过也支持Ruby,Ch,C#和任何JVM语言)

需要什么

  • 速度:我们的目标是实时跟踪。这可能会排除Python和Ruby。
  • 按类名称实例化:虽然我们的C ++宏和类注册系统工作,但设计为动态的语言具有自己的运行时会很好。也许是Objective-C ++,或者Java。

什么是理想的

  • 模块/插件/扩展/组件框架:为什么要重新发明轮子,使用一个好的框架让我们专注于我们的应用程序的特殊之处。这里有很多选择。 Objective-C有它的NSBundles; C ++有Boost.Extension,Pluma,DynObj,FxE​​ngine等库; C有C-Pluff;我甚至会说选项太多
  • 运行时类加载和重新加载:从开发的角度来看,能够编译和重新加载一个模块会很有趣。我已经在Objective-C中通过代码注入和使用Java的反射看到了这一点。

我错过了什么?

我有太多有趣的选择!

这里是我需要帮助的地方,根据您在模块化应用开发方面的经验,有这些限制,我应该寻找什么样的语言/框架功能?

我应该对这个让我缩小搜索范围的项目有什么问题


修改

我没有注意到OpenCV只有C ++的GPU绑定,所以我坚持使用它。

现在语言已修复,搜索范围缩小了很多。我可以使用Objective-C ++来获得所需的动态(来自Cocoa / GnuStep / Cocotron的Obj-C运行时+ NSBundle),这听起来很复杂;或带有框架的C ++。

所以我现在将我的问题缩小到:

  • 使用ObjectiveB ++的跨平台方式使用NSBundle比听起来容易吗?
  • C ++框架将为我提供热插拔模块?
  • 在运行时交换模块的主要原因是能够快速更改代码,Runtime-Compiled C++会成为更好的解决方案吗?
  

Meta :我就如何提出这样的问题进行了研究,我希望这是可以接受的。

2 个答案:

答案 0 :(得分:1)

“我应该对这个让我缩小搜索范围的项目提出什么问题?”

如果您需要gpu支持(cuda / ocl),您唯一的选择是c ++。

你可以安全地丢弃C,因为它不会在不久的将来得到支持

不用担心python,即使你需要直接像素访问,也就是所有numpy数组(再次运行c代码)

我对ruby,c#ch等有点怀疑,因为这些绑定是基于社区的,并且可能不是最新/正确维护,而java& python绑定是机器 - 由c ++ api生成,是官方发行版的一部分。

答案 1 :(得分:1)

如果您正在寻找可移植性并且有大量内存可供处理,那么您可以使用Java。 C ++和Java之间的性能差距并不大。对于Mat和其他图像格式之间的转换,我仍然不确定,因为它需要深层复制才能执行,因此如果您的代码可以以openCV原生格式显示图像,那么您可以固定应用程序

亲:

  • 你可以不用担心内存泄漏了
  • 与C / C ++相比,该项目更具可移植性(如果您可以避免使用大小不一致的原始数据类型,例如在C中始终使用int * _t,则可能会出错)

缺点:

  • 比C / C ++慢
  • 需要更多内存和CPU时钟

http://www.ibm.com/developerworks/java/library/j-jtp09275/index.html