EmguCV 的前世今生和扩充

2024-01-15 13:08
文章标签 今生 前世 扩充 emgucv

本文主要是介绍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的结构图,我们可以看的更清楚。也验证了我们从源代码推测的部分结论。


这篇关于EmguCV 的前世今生和扩充的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/608991

相关文章

ja-netfilter的前世今生和非对称加密的欺骗原理

文章目录 ja-netfilter起源官网插件插件配置文件插件的综合应用更多用法 非对称加密欺骗原理非对称加密和数字证书激活过程和欺骗手段分析代码示例第一步:生成自签名证书脚本第二步:使用自签名证书对产品激活信息进行签名 样例数据样例激活码(注:用于代码演示,直接粘贴到JetBrains 家 IDE 中无法完成激活!不用试,肯定提示无效,无法激活!!)样例power.conf(配合ja-ne

Anti-alias的前世今生

原文: http://www.cnblogs.com/gongminmin/archive/2011/05/16/2047506.html Anti-alias,简称AA,在图形学中广泛地用于提升渲染质量。经过几十年的发展,AA也从离线渲染逐步普及到了实时渲染的领域。本系列文章将总结一下在实时渲染中使用的AA方法的前世和今生。本片集中讨论硬件提供的AA方法。 图1. 一个像素内部的采样

EmguCV学习笔记 C# 9.2 VideoWriter类

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客 笔者的博

Go语言的前世今生与未来展望

Go语言的起源与发展 Go语言诞生于2009年底,是谷歌内部的一个实验性项目。它从一开始就受到C、Pascal、Alef和Oberon等多种编程语言的启发,由Robert Griesemer、Ken Thompson和Rob Pike三位资深程序员共同打造。作为一门现代的通用编程语言,Go迅速获得了广泛关注,其开放源码的特性更是吸引了全球开发者的参与。 Go的设计理念与应用场景 Go的设计初

将voc2012的扩充图片中的segment标注从mat,转成png data augmentation

这是matlab代码。也就是benchmark.解压后下图   代码 %save imageclear;rootdir = pwd;mat_dir = [rootdir, '/dataset/cls/'];img_dir = [rootdir, '/dataset/cls_img/'];if ~exist(img_dir,'dir')mkdir(img_dir);endlist

EmguCV学习笔记 VB.Net 第9章 视频操作

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客 笔者的

EmguCV学习笔记 VB.Net 8.2 分水岭法 watershed

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客 笔者的

Servlet的前世今生

前言   上世纪90年代,随着互联网的发展,B/S模式开始迅速发展。起初用户只是通过浏览器请求一些静态资源如html,但是很快静态资源的处理已经满足不了需求,于是根据用户请求的不同,动态的处理并返回资源的技术开始被迫切需求。   为了满足动态处理的需求,CGI(Common Gateway Interface)就出现了。CGI每处理一个请求就会建立一个进程,大量的进程会

EmguCV学习笔记 C# 第9章 视频操作

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客 笔者

EmguCV学习笔记 VB.Net 9.1 VideoCapture类

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客 笔者的博