Csharp调用基于Opencv编写的类库文件

现在将Csharp调用基于Opencv编写的类库文件(Dll)的方法定下来,我取名叫做GreenOpenCsharpWarper,简称GOCW。

一、CLR编写的DLL部分

1、按照正常方法引入Opencv;

2、提供接口函数,进行图像处理(这里只是实现了cvtColor,实际过程中可以用自己编写的复杂函数)

String^  Class1::Method(cli::array<unsigned char>^ pCBuf1)
{
     pin_ptr<System::Byte> p1 = &pCBuf1[0];
     unsigned char* pby1 = p1;
     cv::Mat img_data1(pCBuf1->Length,1,CV_8U,pby1);
     cv::Mat img_object = cv::imdecode(img_data1,IMREAD_UNCHANGED);
     //////////////////////////////////处理过程/////////
     cvtColor(img_object,img_object,40);
 /////////////////////////////////////////////////////////////////////////////////
     if (!img_object.data)
        return nullptr;
     //获得目录,保存文件
     cv::imwrite("c:/Method.jpg",img_object);
     return "c:/Method.jpg";
}
 
String^  Class1::Method2(cli::array<unsigned char>^ pCBuf1)
{
    pin_ptr<System::Byte> p1 = &pCBuf1[0];
    unsigned char* pby1 = p1;
    cv::Mat img_data1(pCBuf1->Length,1,CV_8U,pby1);
    cv::Mat img_object = cv::imdecode(img_data1,IMREAD_UNCHANGED);
    //////////////////////////////////处理过程///////////////////////
    cvtColor(img_object,img_object,6);
 /////////////////////////////////////////////////////////////////////////////////
    if (!img_object.data)
        return nullptr;
    //获得目录,保存文件
    cv::imwrite("c:/Method2.jpg",img_object);
    return "c:/Method2.jpg";
}

二、Winform调用接口部分(TIP:不仅可以用Winform调用,asp.net/webservice都是可以调用的)

1、直接引用clr dll

2、编写helper文件(应该也可以叫做 warpper),通过外部IO的方法获取clr dll的文件

class GOCsharpHelper
    {
        Class1 client = new Class1();
        string strResult1 = null;
        string strResult2 = null;
        //输入参数是string或bitmap
        public Bitmap ImageProcess(string ImagePath){
            Image  ImageTemp = Bitmap.FromFile(ImagePath);
            return ImageProcess(ImageTemp);
        }
        //输出结果是bitmap
        public Bitmap ImageProcess(Image image)
        {
            MemoryStream ms = new MemoryStream();
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] bytes = ms.GetBuffer();
            strResult1 = client.Method(bytes);
            Image ImageResult = Bitmap.FromFile(strResult1);
            return (Bitmap)ImageResult;
        }
        public Bitmap ImageProcess2(string ImagePath)
        {
            Image ImageTemp = Bitmap.FromFile(ImagePath);
            return ImageProcess2(ImageTemp);
        }
        //输出结果是bitmap
        public Bitmap ImageProcess2(Image image)
        {
            MemoryStream ms = new MemoryStream();
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] bytes = ms.GetBuffer();
            strResult2 = client.Method2(bytes);
            Image ImageResult = Bitmap.FromFile(strResult2);
            return (Bitmap)ImageResult;
        }
        public void Clear()
        {
            if (File.Exists(strResult1))
                File.Delete(strResult1);
            if (File.Exists(strResult2))
                File.Delete(strResult2);
        }
    }

3、使用例子(注意控件的dispose):

private void button2_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image != null)
                pictureBox1.Image.Dispose();
            if (pictureBox2.Image != null)
                pictureBox2.Image.Dispose();
           Image image1 = gocsharphelper.ImageProcess(" E:/sandbox/logo.jpg");
           pictureBox1.Image = image1;
           Image image2 = gocsharphelper.ImageProcess2("E:/sandbox/lena.jpg");
           pictureBox2.Image = image2;
         
        }

三、解释说明 

使用外部I/O不仅仅是权宜之计,实际上Opencv的Decode使用的就是外部I/O。就目前研究的水平来说,这是最稳定的。

目前搭建成功的框架已经能够完成“csharp调用opencv的”目标,并且在调试、参数传递方面都很强。

如果是处理静态图片,已经够用。

四、杀手程序

GOImageResearch:

使用这种方法编写的图像处理预分析程序。

时间: 2024-12-24 03:14:48

Csharp调用基于Opencv编写的类库文件的相关文章

关于在VB.NET中调用使用VC++编写的类库dll的一点笔记

前言 结对作业要求一出来,我就立刻想到了把“计算核心”封装成dll,然后使用vb.net编写UI调用dll的思路.然而在实现过程中却遇到了很多的问题. 我在这个过程中是负责使用vb.net编写UI并调用编写好的DLL进行计算的. 目标 使用c++把类封装到dll,并在vb.net中调用该dll,使用该dll中封装好的类.在查找资料的过程中,发现vb.net调用dll的方法主要有两种. (IDE:Visual Studio 2013 professional) 方法一:使用Declare语句 vb

windows 10(64位)下实现vs20120C++调用matlab r2014a编写的m文件生成的.dll,.lib,.h文件

如题. 环境:windows10 64位,vs 2010,matlab r2014a,配置成功,生成.dll,.h,.lib文件成功. 步骤一:matlab动态链接库文件编译生成 1)编写示例文件add.m function c = add(a, b); c = a + b; end; 2)编译打包 进入matlab主界面,在控制台输入deploytool命令,调用打包程序,选择"Library Compiler": 3)进入库文件编译程序界面,根据需要勾选C++ Shared Lib

csharp编写界面,opencv编写类库,解决 Pinvoke过程中的参数传递和平台调用问题

使用csharp 编写winform程序,不仅速度快,而且容易界面美化并找到其他类库的支持:而使用 opencv编写图形图像处理程序,是目前比较流行,而且高效的一种方法.如果需要将两者结合,需要解决的问题就是使用 csharp调用vc 下编写的库文件.两个难点,一个是平台调用的内存控制问题,一个是参数传递问题.关注点在解决实际问题 在现实中,我发现问题比较大的是两点,一点是内存控制问题,一个是平台调用问题. 一.内存控制:(1-6种方法是我验证后失败的方法,关注问题解决者可直接看第7点) 1.验

基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)

GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的功能增强. 这里将算法库开放源代码,并且编写一系列blog对函数实现进行说明.目的是在于“取之于互联网,用之于互联网”.并且也希望该库能够继续发展下去. 由于算法库基于Opencv和Mfc进行编写,所以要求阅读使用者具备一定基础. 最终提交的是GOCVHelper.h 和GOCVHelper版本号.

基于OpenCV的Android软件开发

最近在做Android软件开发,手头有一些C.OpenCV版本的代码想移植到手机中,于是调查了OpenCV在Android中的使用方法,总结如下. 我使用的Android软件开发环境为Android ADT(Android Developer Tools),它包含了Android软件开发必备的开发插件,下载下来解压就能用.对于编译C/C++ Android Native代码开发,需要NDK,也是下载下来解压,在eclipse里配置一下路径即可,如下图(Window->Preferences).

基于opencv和QT的摄像头采集代码( GoQTtemplate3持续更新)

在Linux操作系统上,编写带界面的图像处理程序,选择opencv+QT是一种很好的选择.GoQTtemplate3是我为编写Linux下图像处理程序实现的框架,希望能够为大家解决Linux环境下桌面图像处理程序,提供一些帮助. 文中相关代码请参考:https://github.com/jsxyhelu/GOQTtemplate3 一.基本环境构建 a.我们需要完整地安装QT.具体方法,是从网站上下载在线安装程序,并且直接安装 b.下载并且安装OpenCV 直接使用编译好的OpenCV类库 su

基于OpenCV的图片卡通化处理

学习OpenCV已有一段时间,除了研究各种算法的内容,在空闲之余,根据书本及资料的引导,尝试结合图像处理算法和日常生活联系起来,首先在台式机上(带摄像头)完成一系列视频流处理功能,开发平台为Qt5.3.2+OpenCV2.4.9. 本次试验实现的功能主要有: 调用摄像头捕获视频流: 将帧图像转换为素描效果图片: 将帧图像卡通化处理: 简单地生成"怪物"形象: 人脸肤色变换. 本节所有的算法均由类cartoon中的函数cartoonTransform()来实现: // Frame:输入每

基于 OpenCV 的人脸识别

基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从谷歌街景的图片拼接,到交互艺术展览的技术实现中,都有 OpenCV 的身影. OpenCV 起始于 1999 年 Intel 的一个内部研究项目.从那时起,它的开发就一直很活跃.进化到现在,它已支持如 OpenCL 和 OpenGL 的多种现代技术,也支持如 iOS

基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)

基于opencv和mfc的摄像头采集框架(GOMFCTemplate2) 编写带界面的图像处理程序,选择opencv+mfc是一种很好的选择:在读取摄像头数据方面,网上的方法很多,其中shiqiyu的camerads的方法是较好的. 基于现有资料,通过在实际项目中的积累,我总结出来一套结合opencv和mfc的摄像头采集框架.具有以下特点: 1.基于directshow,兼容性好,速度快.到目前为止,无论是工业相机还是普通相机,没发现不兼容的: 2.摄像头部分通过线程读取,保证界面的运行流畅: