OpenCV 1.x 后端
Posted
技术标签:
【中文标题】OpenCV 1.x 后端【英文标题】:OpenCV 1.x backend 【发布时间】:2015-10-13 11:46:46 【问题描述】:我想并行化 opencv 项目的源代码,它必须是纯 C 语言。我一直相信 opencv 1.x 是基于 C 的。但是在浏览 1.0 源代码时,我看到了 C++ 文件以及 new
运算符和类已被使用。它真的是 C 还是 C/C++ 的混合体。
【问题讨论】:
可能真正的问题是您仍在使用 OpenCV 1.x 大声笑不,我使用 C++ api 已经有一段时间了。仅针对这个项目,我需要专门使用C api。并行化代码仅适用于纯 C 【参考方案1】:对于使用 openCV 的普通开发人员来说没有任何意义。
openCV 提供了一个 C 接口,无论它是用 C、C++ 还是汇编程序实现的,都可以使用。它甚至可能(不是)在 PASCAL 或 COBOL 中实现并导出到 C 中可用的库中,这与使用它的开发人员无关。
在 openCV 1.0 的特殊情况下,它确实是使用 C++ 实现的。
C++ 的设计目标是与 C 的互操作性。 extern "C"
提供了这种互操作性,因此为 openCV 1.0 提供 C 接口很容易。
在示例中考虑 cxcore.h :
(...omited...)
#ifdef __cplusplus
extern "C"
#endif
/******************************************************************************
* Array allocation, deallocation, initialization and access to element
\******************************************************************************
/* <malloc> wrapper.
If there is no enough memory, the function
(as well as other OpenCV functions that call cvAlloc)
raises an error. */
CVAPI(void*) cvAlloc( size_t size );
(...omited... )
但是 OP 是关于分叉 openCV 以使其并行化。在这种情况下,这是一个非常相关的问题。 如果 1.0 在 C 中,2.0 在 C++ 中,那么使用 1.0 作为基础会有优势。 但事实并非如此,所以你不妨从最新的 openCV 中分叉出来。
【讨论】:
这为我清除了一切。实际上,在这种特殊情况下,实际的实现确实很重要,而不仅仅是接口,因为我们正在构建我们的并行化 api,它只适用于 C 源代码。 哦,所以您不只是将 openCV 用作库。您正在分叉 openCV。是的,是的,在这种情况下确实很重要。【参考方案2】:这个问题有两个方面:
首先,你是对的,OpenCV 1.0内部使用了 C++。
然而,external 接口是纯 C 语言,因此从用户的角度来看并不重要。
【讨论】:
以上是关于OpenCV 1.x 后端的主要内容,如果未能解决你的问题,请参考以下文章
基于DJango和Pybind11,实现网络后端调用OpenCV算法
基于DJango和Pybind11,实现网络后端调用OpenCV算法