热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GreenOpenCsharpWarper(GOCW)

GreenOpenCsharpWarper(GOCW),Go语言社区,Golang程序员人脉社

现在将Csharp调用基于Opencv编写的类库文件(Dll)的方法定下来,我取名叫做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:

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

 




推荐阅读
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
author-avatar
吃碰杠和_338
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有