托管C++——在C#中使用C++
下面就用一个完整的实例来详细说明怎样用托管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++的更多相关文章
- 将WCF寄宿在托管的Windows服务中
在我之前的一篇博客中我介绍了如何发布WCF服务并将该服务寄宿于IIS上,今天我再来介绍一种方式,就是将WCF服务寄宿在Windows服务中,这样做有什么好处呢?当然可以省去部署IIS等一系列的问题,能 ...
- 浅谈 .NET 中的对象引用、非托管指针和托管指针 理解C#中的闭包
浅谈 .NET 中的对象引用.非托管指针和托管指针 目录 前言 一.对象引用 二.值传递和引用传递 三.初识托管指针和非托管指针 四.非托管指针 1.非托管指针不能指向对象引用 2.类成员指针 五 ...
- 斗地主你什么时候才会托管?(.NET中的托管于非托管)
文章部分引自<.NET4.0面向对象编程漫谈(基础篇)>第1章.NET面向对象编程基础(作者:金旭亮) 无意间看到一位四五岁左右小朋友在玩斗地主,总开始到结束,她一直都在使用“提示”(托管 ...
- 如何把遗留的Java应用托管在Service Fabric中
一.概述 众所周知,微服务化尤其对遗留系统进行微服务化一般采用"Lift and Shift"的模式进行. Service Fabric作为一个微服务托管平台,不仅仅可以在上面跑. ...
- 如何托管ASP.NET Core应用到Windows Service中
(此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:正在构思一个中间件的设计,考虑是否既可以使用最新的技术,也可以兼顾传统的部署模式.所以有 ...
- 浅谈 .NET 中的对象引用、非托管指针和托管指针
目录 前言 一.对象引用 二.值传递和引用传递 三.初识托管指针和非托管指针 四.非托管指针 1.非托管指针不能指向对象引用 2.类成员指针 五.托管指针 前言 本文主要是以 C# 为例介绍 .NET ...
- 如何在AWS中为自己的S3托管站点添加SSL/TSL证书(https)
概要 利用AWS的S3服务托管静态网站后,如何将自己的域名与该站点绑定,并为此域名提供SSL/TSL证书(https). 面向人群 已经掌握如何利用S3服务托管静态网站. 已经拥有自己的域名. 希望为 ...
- .net 中的托管与非托管
托管代码 托管代码就是Visual Basic .NET和C#编译器编译出来的代码.编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码.中间语言被封装在一个叫程序集(assemb ...
- [转]在C#中使用托管资源和非托管资源的区别,以及怎样手动释放非托管资源:
托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...
随机推荐
- HDOJ 题目3564 Another LIS(线段树单点更新,LIS)
Another LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- UITableView使用指南
本文转载至 http://blog.csdn.net/yu0089/article/details/8227402 一.概述 UITableView是iOS开发比不可少也是最重要的一个控件类.可以说任 ...
- vue element-ui 自动获取光标
<el-input ref="customerInput"></el-input> this.$refs.mark.$el.querySelector('i ...
- python中的raw字符串
在正则表达式的字符串前面加上r表示这个是一个raw字符串,只以正则表达式的元字符进行解析,不用理会ascii的特殊字符.
- java中final与static的使用场景
final Java关键词final有“无法改变”的含义,主要用于修饰非抽象类.方法或者变量.使用时注意: final类不能被继承,没有子类,final类中的方法默认是final的. final方法不 ...
- SHA-1算法c语言实现
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signatu ...
- linux c编程:make编译一
一个工程中的源文件不计其数,按照不同的功能分类在若干的目录里面,makefile定义了一系列的规则,来制定那些文件需要先编译,那些文件后编译,那些文件重新编译.makefile最大的好处就是自动化编译 ...
- python cookbook第三版学习笔记十一:类和对象(二)调用父类的方法
在子类中调用父类的方法,可以下面的A.spam(self)的方法. class A(object): def spam(self): print 'A.spam' class ...
- [egret+pomelo]实时游戏杂记(2)
[egret+pomelo]学习笔记(1) [egret+pomelo]学习笔记(2) [egret+pomelo]学习笔记(3) pomelo pomelo服务端介绍(game-server/con ...
- nodejs中的子进程,深入解析child_process模块和cluster模块
Node.js的进程管理 node遵循的是单线程单进程的模式,node的单线程是指js的引擎只有一个实例,且在nodejs的主线程中执行,同时node以事件驱动的方式处理IO等异步操作.node的 ...