EmguCV 的前世今生和扩充

最近使用EmguCV,一直疑惑个问题EmguCV到底和OpenCV有什么关联。看我来扒一扒。

1.下载EmguCV的源码下来,先查找函数接口。

我们找到文件夹  Emgu.CV.Extern 发现里面全是C++ 代码。这个应该就是CVextern.dll的源代码。

随便打开一个*.h 看下。我这里打开core文件夹下的mat_c.h文件。可以看到头文件中内容如下:

#pragma once
#ifndef EMGU_MAT_C_H
#define EMGU_MAT_C_H


#include "opencv2/core/core_c.h"  //这是很熟悉的Opencv的头文件
#include "opencv2/core/ocl.hpp"  //这是很熟悉的Opencv的头文件
#include "emgu_c.h"


typedef uchar* (CV_CDECL *MatAllocateCallback)(int depthType, int channel, int totalInBytes, void* allocateDataActionPtr);
typedef void (CV_CDECL *MatDeallocateCallback)(void* freeDataActionPtr);

CVAPI(cv::MatAllocator*) emguMatAllocatorCreate(MatAllocateCallback allocator, MatDeallocateCallback deallocator, void* allocateDataActionPtr, void* freeDataActionPtr);
CVAPI(void) cveMatAllocatorRelease(cv::MatAllocator** allocator);


CVAPI(cv::Mat*) cveMatCreate();


再看上面CVAPI 在opencv中的意义:

#define CVAPI(rettype) CV_EXTERN_C CV_EXPORTS rettype CV_CDECL

CV_EXTERN_C 的宏定义是#define CV_EXTERN_C extern "C"

extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的

CV_EXPORTS 的宏定义为#  define CV_EXPORTS __declspec(dllexport) 

可见CV_EXPORTS暂时无实质性内容,只是一个预留宏定义,是为了OpenCV在编程上的可扩展性预留的

rettype是宏定义的参数了,这里放具体的类型,表示函数的返回类型!

CV_CDECL的宏定义是#define CV_CDECL __cdecl   __cdecl是VC的关键词。

看过后是不是很熟悉,是DLL的导出函数格式。再看些头文件均是如此导出的,也就是opencv中的函数均通过这种方式在cvextern.dll中导出。


2.再看emgu中是怎么调用opencv的函数的。

我在文件夹Emgu.cv下的Pinvoke下CvInvokeCore.cs下找到下面的代码

 [DllImport(ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention, EntryPoint = "cveReshape")]
      public static extern IntPtr cvReshape(
         IntPtr arr,
         IntPtr header,
         int newCn,
         int newRows);


ExternLibrary的内容是“cvextern”   CallingConvention =Cdecl = 2,  被调用方清理堆栈。这是使用平台 invoke 调用非托管函数的默认约定。

这是调用cvextern.dll的格式,查看下来,cs代码中有大量的这类代码,将opencv中函数引用过来。所以在我们调用某些函数的时候均使用CVinvoke.XXXX来调用。如果这里没有,我们可以扩展进去。只要上面的CVAPI有导出,。

3.有个疑问3.1版本,如何实现调用opencv,而不需要加载opencv的库。

4.Emgu的跨平台特性看似使用了mono。


总结:Emgu的底层基础是opencv,然后在这基础上建立起了新的庞大的大厦。

以上只是初步探秘,随着深入可能有些看法会转变,也请高手共同探讨。后面找到了官网的Emgu的结构图,我们可以看的更清楚。也验证了我们从源代码推测的部分结论。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值