包装使用OpenCV进行图像处理的C代码,以便与同样使用OpenCV的Python一起使用



这可能是一个愚蠢的问题,但我需要知道。所以,我在编程方面不是很好,还在学习。如果这个问题有些不切实际,请原谅。

有一个人将C++与OpenCV一起用于他的图像处理算法,我认为他在编程方面并不擅长,也就是说,他只知道自己的项目应该知道什么。我被告知要和那个人合作做一个项目。另一个人将使用他已经开发的C++图像处理算法(当然还有OpenCV)。

问题是我在Python中使用OpenCV。用Python来包装他的代码(这意味着我需要学习包装C++代码的方法),或者更好的方法是让那个人学习一些Python,然后将他所做的翻译并移动到Python中,这是可能的,甚至是合乎逻辑的吗?

移植代码

C和C++代码之间的区别非常重要。OpenCV针对每种语言都有不同的API,随着C++成为首选语言,C API正迅速被弃用。请确保您知道正在使用哪种API。

除此之外,将OpenCV代码从一个C++移植到Python通常很简单。API是相似的,并且绝大多数C++函数都对应于Python包装器。

例如,calcHist:

C++:void calcHist(const Mat*图像,int动画、const int*channels和InputArray掩码以及OutputArrayhist。intdims;const int*histSize

Python:cv2.calcHist(图像通道掩码histSize以及范围[,hist]、accumulate]])→ 历史

与许多Python版本的OpenCV函数一样,您可以看到一些主要区别:

  • 由于Python对列表大小的内部跟踪,因此不需要诸如nimages(表示图像数量)之类的参数
  • 如果C++函数中有输出参数(例如hist),Python函数通常会将其作为返回值

考虑到在线OpenCV文档的细节,您可能能够在不了解C++本身的情况下将C++代码移植到Python。这可能比让你的合作者学习一门全新的语言来移植他的代码更快,尤其是考虑到你之前在目标语言方面的经验。

移植的优点

  • 您的整个项目都使用一种语言进行维护
  • Python的好处(快速开发;无需编译等)在整个项目中都是可用的

移植的缺点

  • 您可能会发现Python代码的运行速度通常比C++代码慢,因为它是高级的并且是可解释的。这个问题的严重程度取决于OpenCV之外的处理量。

  • 移植代码需要大量的时间和精力。


包装现有代码

另一种选择是在Python绑定中使用现有的C++代码,这有其自身的优点和缺点。在这种情况下,您可以选择许多不同的选项。

包装的优点

  • 快速处理-如果C++代码提供了一个良好的接口
  • C++代码的性能不受影响

包装的缺点

  • 如果C++代码不能提供一个好的接口,那么将其封装在Python中使用会很痛苦
  • 该项目使用两种不同的语言进行维护

最新更新