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算法

如何在opencv中显式访问mjpeg后端进行视频捕获

S3 Zeta使用python和opencv

如何使用 OpenCV Python 和 GStreamer 后端创建 x264 RTSP 服务器

windows7 opencv 都有哪些配置