GreenOpenCsharpWarper(GOCW)

现在将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:

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

时间: 2024-10-15 23:02:41

GreenOpenCsharpWarper(GOCW)的相关文章

(4opencv)如何基于GOCW,创建一个实时视频程序

直接使用提供的代码框架进行修改,是最快得到效果的方法:但是这样的灵活性较差,而且真正的程序员从来都不会停滞在这一步:我们需要的是"将框架解析到最小化.理清楚每个构建之间的关系",只有这样才能灵活运用. 一.准备工作 1.高拍仪已经接通,如果需要的话,还要安装驱动: 2.vs2012编程环境,能够编写Csharp和OpenCV程序(具体不清楚可以回过头来看配置): 3.是DirectShow.net(http://directshownet.sourceforge.net/docs.ht

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> p

我学习图像处理的小结

前一段时间,我一直在制作OpenCV基础知识的课件(<学习OpenCV3.0初级实战视频课程> http://edu.51cto.com/course/10381.html,<学习OpenCV3.0中级实战视频课程>http://edu.51cto.com/course/10712.html).因为一方面我感觉如果仅仅是有比如"答题卡识别"http://edu.51cto.com/course/8637.html,"图像拼接"http://e

群众利益至上

5月29日一大早,枣阳北城办事处顺城湾社区68岁居民摆吉水,像往常一样到公园晨练.老人惊奇地发现,顺城湾最后一批征迁房屋从眼中消失.四代祖居于此的顺城湾将永远留在老人记忆深处,取而代之的将是功能更齐全.环境更优雅.风光迤逦的沙河风光景观带."盼了多年的顺城湾改造终于变成现实,今后的日子会越过越滋润."摆吉水和几名老人难掩心中的喜悦. 一条不足1公里长的老街改造,让群众期盼了多年,这一"老大难"拆迁何以在25天内圆满解决? 枣阳首批棚户区改造顺城湾片区征迁工作给出了答

通过当前的view找到所在view的控制器

在项目中用到了这个功能,在网上找到的代码,现在贴出来(有时,我们常自定义UIView,点击view上的某个控件比如按钮,需要push到下个界面,view又没有- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;这个方法,又不想发通知,设置代理等,这个方法就派上用场了) 标签: <无> 代码片段(1)[全屏查看所有代码] 1. [代码]通过view找到view所在的控制器   

处理图像技术小结

前一段时间,我一直在制作OpenCV基础知识的课件,因为一方面我感觉如我现在的准备的东西缺乏一个系统的过程:另一方面我也在做视频的过程中,反省自己对基础知识是否掌握牢靠了,千万不能误人子弟.那么课件的制作,包括内容的顺序,主要还是基于<learningOpenCV3>的.结合制作课件,我对<learningOpenCV3>书后的习题较为仔细的解决,并且push到了Github上https://github.com/oreillymedia/Learning-OpenCV-3_exa

基于OpenCV实现“钢管计数”算法,基于Csharp编写界面,并实现算法融合

一.重构解决方案 GOCVhelper做算法研究和函数封装:GOImage做dll;Csharp程序开发界面: 解决OpenCV版本问题,进行函数封装. 现在环境配置已经精简 此外将.dll拷贝到能够被访问的地方就可以. 下一步在保证效果不变的情况下,进行函数封装.OK可行: 二.GOCW封装 采用输入图片是Mat直接输入:输出结果还是ini外部存储的方式,最为有效. 因为有良好的积累,所以很快就完成了基本算法移植 但是这还不够,有两个界面操作,1个是框选.一个是圆的产生和去除.其中框选需要结合