0

这是怎么回事?

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

关于应用程序

应用程序的功能分为模块,这些模块按配置 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、FxEngine 等库;C有C-Pluff;我什至会说有太多的选择
  • 运行时类加载和重新加载:从开发的角度来看,能够只编译和重新加载一个模块会很有趣。我已经通过 Objective-C 中的代码注入和使用 Java 的反射看到了这一点。

我错过了什么?

我有太多有趣的选择!

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

我应该对这个项目提出什么问题才能缩小搜索范围


编辑

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

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

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

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

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

4

2 回答 2

1

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

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

你可以放心地丢弃 C,因为它在不久的将来不会被支持

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

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

于 2013-10-20T09:10:37.320 回答
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

于 2013-10-20T11:38:49.810 回答