C#调用C++、Opencv的Dll

转载 2018年04月17日 12:02:04

C#调用C++、Opencv的代码可以通过托管和非托管两种形式

非拖管的形式即是采用[DllImport]的形式,这种形式只能调用的C++的函数,

托管的形式用的是ref,可以调用C++类中的方法

首选介绍下非托管的形式:

一、无参数传递下的非托管形式

(1).C++中建立“win32项目”为dll格式应用程序

(2).新建cpp程序add.cpp

代码如下:

extern "C" _declspec(dllexportint add2(int x,int y)

{

   return x+y;

}

 

(3).编译,将生成dll程序(debug目录下 )

(4).C#建立控制台应用程序

代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Runtime.InteropServices; //一定得有

namespace CSDll

{

   class Program

   {

       [DllImport("Dll2.dll",EntryPoint="add2",ExactSpelling=true,CallingConvention=CallingConvention.Cdecl)]

        public static extern int add2(int a,int b);

       

        static void Main(string[] args)

        {

            Console.WriteLine(add2(1, 2));

            Console.Read();

            

        }

   }

}

 

(5).C++生成的dll一定要放在C#的bin目录下的debug中

 

二、传递opencv中的Mat图像

(1)C++ 工程下建立“win32项目”应用程序的dll

(2)创建cpp,代码如下:

#define DLL_API extern "C" _declspec(dllexport)    

 

#include <opencv2\opencv.hpp>

#include "opencv2/imgproc/imgproc.hpp" 

#include "opencv2/highgui/highgui.hpp" 

#include <cv.h>

using namespace cv;

 

DLL_API uchar * _stdcall run1(char* filename, int & width, int & height, int & step ) 

{

 

   IplImage* uu = cvLoadImage(filename);

         IplImage* dst1 = cvCreateImage(cvSize(uu->width,uu->height),8,1);

         cvCvtColor(uu,dst1,CV_RGB2GRAY);

         Mat ss(dst1);

         uchar * data = new uchar[dst1->height*dst1->width];

 

         data= ss.data;

         width = ss.size().width;

         height = ss.size().height;

         step = ss.step;

 

         return data;

}

 

(3)编译,生成dll,并将dll放在C#所建工程的bin->debug目录下

(5)C#工程下创建窗体应用程序

首先传递C++中的彩色图,代码如下

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Runtime.InteropServices;

 

 

namespace ImageCS2

{

   public partial class Form1 : Form

   {

 

        [DllImport("ImageCPP.dll")]

        public static extern IntPtr run1(string a, out int width, out int height, out int step);

        public Form1()

        {

            InitializeComponent();

        }

 

 

        private void button1_Click(object sender, EventArgs e)

        {

            string filename;

            OpenFileDialog op = new OpenFileDialog();

            if (op.ShowDialog() == DialogResult.OK)

            {

                filename = op.FileName;

                int width, height, step;

                IntPtr dst = run1(filename, out width, out height, out step);

                Bitmap img = new Bitmap(width, height, step, System.Drawing.Imaging.PixelFormat. Format24bppRgb, dst);

               pictureBox1.Image = img;

 

            }

        }

   }

}

 

 

 

 

(6) C++传递灰度图,在C#中的代码略有差别,代码如下:

  [DllImport("raildetection.dll")]

        public static extern IntPtr run1(string a , out int width, out int height, out int step);

        private void button1_Click(object sender, EventArgs e)

        {

            string filename;

            OpenFileDialog op = new OpenFileDialog();

            if (op.ShowDialog() == DialogResult.OK)

            {

                filename = op.FileName;

                int width, height, step;

                IntPtr dst =  run1(filename,out width,out height, out step);

               Bitmap img = new Bitmap(width, height, step, <strong>System.Drawing.Imaging.PixelFormat.Format8bppIndexed</strong>,dst);              

               <strong>img.Palette = CvToolbox.GrayscalePalette;</strong>

               pictureBox1.Image = img;

 

            }

        }

 

 

 

public static class CvToolbox

   {

 

       // #region Color Pallette

        /// <summary>

        /// The ColorPalette of Grayscale for Bitmap Format8bppIndexed

        /// </summary>

        public static readonly ColorPalette GrayscalePalette = GenerateGrayscalePalette();

 

        private static ColorPalette GenerateGrayscalePalette()

        {

            using (Bitmap image = new Bitmap(1, 1, PixelFormat.Format8bppIndexed))

            {

                ColorPalette palette = image.Palette;

                for (int i = 0; i < 256; i++)

                {

                    palette.Entries[i] = Color.FromArgb(i, i, i);

                }

                return palette;

            }

        }

   }

 

 

三、托管形式调用C++中的代码:

(1)C++工程下建“win32项目”应用程序的dll

 

(2)建头文件:factory.h

#ifndef  FACTORY_H

#define FACTORY_H

 

#include<opencv2/opencv.hpp>

 

using namespace std;

using namespace cv;

class factory

{

public:

         void show();

};

#endif

(3)建CPP   factory.cpp

#include"factory.h"

#include<opencv2/opencv.hpp>

 

using namespace cv;

 

void factory::show()

{

         Mat img=imread("E://Image//1.jpg");

         imshow("src",img);

         waitKey(0);

}

(4)建头文件clrClass.h

#pragma once

#include"factory.h"

public ref class clrClass

{

public:

         clrClass(void);

         ~clrClass(void);

         int member;

         void showImage();

private:

         factory *clrFac;

};

(5)建CPP  clrClass.cpp

#include"clrClass.h"

#include"factory.h"

 

 

clrClass::clrClass(void)

{

         clrFac=new factory();

}

clrClass::~clrClass(void)

{

 

}

void clrClass::showImage()

{

         clrFac->show();

}

(6)使用C++托管类进行封装。新增clrClass类。并且右击C++项目->属性->配置属性->公共语言运行时支持->公共语言运行时支持(、\clr),然后进行编译生成DLL。托管形式不是将生成的dll放在C#项目工程的bin->debug目录下,使用方法后面介绍

(7)C#创建控制台应用程序

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace gg2

{

   class Program

   {

        [STAThread]

        static void Main(string[] args)

        {

            clrClass clr = new clrClass();

            clr.showImage();

 

        }

   }

}

 (8)右击C#项目中的引用,将生成的dll添加在引用中,就可以使用C++的类方法了

C#调用C++ dll 总结 内含(opencv)

一直都想搞搞C#调用C++DLL,一直没有时间或搞的shihou
  • wazwx
  • wazwx
  • 2014-05-11 19:46:03
  • 3386

在C#中使用C++的DLL,并且在DLL中包含有opencv的代码,通过“障眼法”操作

最近,老师在做项目,要我实现上述标题需求。 第一步:
  • peng825223208
  • peng825223208
  • 2014-07-23 19:48:10
  • 3310

在VS2010上使用C#调用非托管C++生成opencv代码的DLL文件

背景       在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。本篇文章将引导...
  • qq_16542775
  • qq_16542775
  • 2016-08-22 15:15:39
  • 1561

c++ c# opencv dll 调用的方法

一,c++dll c#调用  参数传递  需求:C#传递一个路径给C++ DLL ,DLL接口返回一个字符串给C# c++接口定义: int plate_recognize(const char ...
  • maoxue2008
  • maoxue2008
  • 2017-08-18 20:02:38
  • 160

如何通过C#调用OpenCV函数(自制OpenCV的c++ dll文件)

写在前面:学习CUDA过程中看到了可以用OpenCV写一个类,然后直接调用的方法,感觉很有意思(基础太差,可能这是个很基础的问题)。于是就想在 C# 中调用OpenCV的方法,发现有点麻烦,需要生成 ...
  • zhangzhe_0305
  • zhangzhe_0305
  • 2017-10-31 08:19:58
  • 314

c#调用c++程序(DLL方法,以及opencv,运行开源的人脸识别seetaface)

谨以此篇文章记录我2017.9.19日改bug的旅程 前段时间把开源的人脸识别代码编译运行了起来,奈何又有新的需求出现,能够在asp.net写的网站上调用人脸识别,这就涉及到了怎么用c#来调用c++函...
  • u014119694
  • u014119694
  • 2017-09-19 22:45:13
  • 935

C#调用托管C++类(DLL)

利用托管C++对C++类进行包装,从而实现在C#中调用C++类。
  • u010049298
  • u010049298
  • 2015-03-06 22:20:59
  • 650

Csharp调用c++的DLL类库

  • 2014年04月13日 21:08
  • 10.33MB
  • 下载

在c#中调用c++里导出的DLL之相关说明

一般我们会有这样一种情况,函数由c++来写,在c#里调用这一函数。这一要求是因为,同样地代码,c++的运行速度比c#运行速度快。 比如说,我们使用OpenCV获取摄像机图像,在xna中显示出来。 ...
  • wzdark
  • wzdark
  • 2012-04-10 19:44:23
  • 983

VS 2015 +opencv 2.4.13 C++ .dll文件编写及调用

作为一个 小白。。捣鼓了几天的 .dll文件  也算是有了点心得,本文也只是个人理解   1.对于VS 2015 与 opencv 2.4.13的问题。 2.对于VS 2015 与 opencv3.0...
  • STAR_RUB
  • STAR_RUB
  • 2016-11-12 15:34:10
  • 1316
收藏助手
不良信息举报
您举报文章:C#调用C++、Opencv的Dll
举报原因:
原因补充:

(最多只允许输入30个字)