下面就用一个完整的实例来详细说明怎样用托管C++封装一个C++类以提供给C#使用。

现有一个Detector类需要使用,首先,要创建一个托管C++的DLL工程DAADll,然后在里面添加下面的代码:

DAADll.h

 #include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/contrib/contrib.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include "../libmi_dpm/face_detector.hpp" #pragma comment(lib, "../lib/lib3000fps.lib")
#pragma comment(lib, "../lib/liblinear.lib")
#pragma comment(lib, "../lib/libmi_dpm.lib")
//#pragma comment(lib, "MSCOREE.lib") using namespace System;
using namespace System::Collections::Generic;
using namespace System::Text;
using namespace System::Drawing; namespace DAADLL{
public ref class daaDll
{
public:
daaDll();
~daaDll();
!daaDll();
Int32 detectFasterMerge(cv::Mat& img);
Int32 detectFasterMerge(Image^ img);
void clean();
private:
mi_dpm::Detector * face_det;
};
}

这样就可以引用Detector类;

在DAADll.cpp中加入需要调用的功能

 #include "daaDll.h"

 #include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/contrib/contrib.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include "BitmapConverter.h"
#include "ImageHelper.h" using namespace System::IO; using namespace DAADLL;
using namespace DAADLL::Util; daaDll::daaDll()
{
face_det = new mi_dpm::Detector();
face_det->detectInit();
} daaDll::~daaDll()
{
this->!daaDll();
} daaDll::!daaDll()
{
face_det->detectClear();
if (face_det != NULL)
{
free(face_det);
face_det = NULL;
}
} void daaDll::clean()
{
face_det->detectClear();
} Int32 daaDll::detectFasterMerge(cv::Mat& cvImg)
{
std::vector<cv::Rect> rects;
std::vector<float> scores;
std::vector<int> picked;
if (cvImg.channels() >= )
{
cv::cvtColor(cvImg, cvImg, CV_BGR2GRAY);
cv::waitKey();
}
picked = face_det->detectFasterMerge(cvImg, rects, scores);
int n = picked.size();
for (int i = ; i < n; i++)
{
int idx = picked[i];
cv::rectangle(cvImg, rects[idx], cv::Scalar(, , ), );
}
cv::imwrite("tmp_timg_FastMerge.jpg", cvImg);
cv::waitKey();
return n;
} Int32 daaDll::detectFasterMerge(Image^ img)
{
cv::Mat cvImg = BitmapConverter::ToMat(img);
return detectFasterMerge(cvImg);
}

最后在C#项目(我这边是主界面winform)中引用创建的DAADll项目即可。

托管C++——在C#中使用C++的更多相关文章

  1. 将WCF寄宿在托管的Windows服务中

    在我之前的一篇博客中我介绍了如何发布WCF服务并将该服务寄宿于IIS上,今天我再来介绍一种方式,就是将WCF服务寄宿在Windows服务中,这样做有什么好处呢?当然可以省去部署IIS等一系列的问题,能 ...

  2. 浅谈 .NET 中的对象引用、非托管指针和托管指针 理解C#中的闭包

    浅谈 .NET 中的对象引用.非托管指针和托管指针   目录 前言 一.对象引用 二.值传递和引用传递 三.初识托管指针和非托管指针 四.非托管指针 1.非托管指针不能指向对象引用 2.类成员指针 五 ...

  3. 斗地主你什么时候才会托管?(.NET中的托管于非托管)

    文章部分引自<.NET4.0面向对象编程漫谈(基础篇)>第1章.NET面向对象编程基础(作者:金旭亮) 无意间看到一位四五岁左右小朋友在玩斗地主,总开始到结束,她一直都在使用“提示”(托管 ...

  4. 如何把遗留的Java应用托管在Service Fabric中

    一.概述 众所周知,微服务化尤其对遗留系统进行微服务化一般采用"Lift and Shift"的模式进行. Service Fabric作为一个微服务托管平台,不仅仅可以在上面跑. ...

  5. 如何托管ASP.NET Core应用到Windows Service中

    (此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:正在构思一个中间件的设计,考虑是否既可以使用最新的技术,也可以兼顾传统的部署模式.所以有 ...

  6. 浅谈 .NET 中的对象引用、非托管指针和托管指针

    目录 前言 一.对象引用 二.值传递和引用传递 三.初识托管指针和非托管指针 四.非托管指针 1.非托管指针不能指向对象引用 2.类成员指针 五.托管指针 前言 本文主要是以 C# 为例介绍 .NET ...

  7. 如何在AWS中为自己的S3托管站点添加SSL/TSL证书(https)

    概要 利用AWS的S3服务托管静态网站后,如何将自己的域名与该站点绑定,并为此域名提供SSL/TSL证书(https). 面向人群 已经掌握如何利用S3服务托管静态网站. 已经拥有自己的域名. 希望为 ...

  8. .net 中的托管与非托管

    托管代码 托管代码就是Visual Basic .NET和C#编译器编译出来的代码.编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码.中间语言被封装在一个叫程序集(assemb ...

  9. [转]在C#中使用托管资源和非托管资源的区别,以及怎样手动释放非托管资源:

    托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...

随机推荐

  1. 【转】php和java之间rsa加密互通

    以下是php封装好的类,引入即可使用 <?php /** * 作者:pjp * 邮箱:vippjp@163.com */ class RSA{ private $privateKey='';// ...

  2. 【BZOJ4999】This Problem Is Too Simple! 离线+树状数组+LCA

    [BZOJ4999]This Problem Is Too Simple! Description 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: 1. C i x(0<=x<2 ...

  3. 可能是目前市面上唯一能够支持全平台的RTMP推流组件:Windows、Linux、Android、iOS、ARM

    EasyRTMP是什么? EasyRTMP是一套RTMP直播推送功能组件,内部集成了包括:基本RTMP协议.断线重连.异步推送.环形缓冲区.推送网络拥塞自动丢帧.缓冲区关键帧检索.事件回调(断线.音视 ...

  4. 更精炼更专注的RTMPClient客户端EasyRTMPClient,满足直播、转发、分析等各种需求

    现状 EasyRTMPClient,熟悉的朋友就会联想到EasyRTSPClient项目(https://github.com/EasyDSS/EasyRTSPClient),EasyRTSPClie ...

  5. CNN延拓至 复数域

  6. Optimistic concurrency control

    Optimistic concurrency control https://en.wikipedia.org/wiki/Optimistic_concurrency_control Optimist ...

  7. vsftp时间差8个小时的解决方法

    $ vi /etc/vsftpd/vsftpd.conf use_localtime=YES ;

  8. HDU 5247 找连续数 (set妙用)

    找连续数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. python数据分析之:数据清理,转换,合并,重塑(一)

    DataFrame合并: merge运算是将一个或多个键将行链接起来.来看下面的这个例子: In [5]: df1=DataFrame({'key':['b','b','a','c','a','a', ...

  10. Java基础教程:面向对象编程[1]

    Java基础教程:面向对象编程 内容大纲 Java语言概述 Java语言特点 1.Java为纯面向对象的语言,它能够直接反映现实生活中的对象.总之,Everything is object! 2.平台 ...