OpenCV中文网站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 安装 配置
查看: 1667|回复: 1

csharp通过托管和非托管的方法调用自己封装的opencv函数

[复制链接]
发表于 2017-1-15 09:38:53 | 显示全部楼层 |阅读模式
1、csharp通过非托管的方法调用opencv的c++函数,这种实现方法,如果想以图片作为参数进行传递,很难实现。在以前我都是采用传递string 或者int的方法来实现的。应该说当时为了实现这种结果,想了很多方法;
2、最新我发现,如果使用clr封装自己的opencv 函数,然后采用csharp进行调用的话,效果更好;
3、经过反复查阅stackoverflow等相关资料,我已经实现charp的托管调用opencv编写的dll,并且是直接以图片作为参数;
4、但是,由于opencv自己的问题。比如imdecode函数的实现方法,还是以文件I/O的方法进行调用的,所以现在的方法还是存在性能缺陷的。
结论是处理图片完全没有问题(我试验过20m的图片打开处理),但是处理视频会比较差。实现的效果就是“自己做的dll调用opencv”

但是,这方面的资料非常少,可以说问题比较小众,国内国外都比较少见。但是,我作为一线图像处理工程师,认为这种功能的实现是非常有价值的。我正在整理这方面的资料,肯定是要公布出来。但是这次我希望使用互联网的方式来实现。
如果有这方面需要的人,请mailto jsxyhelu@foxmail.com 或者在此跟帖,我们讨论一下各自问题细节,看一看如果把这种方法能够宣传出去,让更多真正需要的人能够立刻得到这种结果。

回复

使用道具 举报

 楼主| 发表于 2017-1-17 00:11:43 | 显示全部楼层

csharp编写界面,调用基于opencv的图像处理类库,小结

本帖最后由 jsxyheu2014 于 2017-1-17 00:16 编辑

原文地址:http://www.cnblogs.com/jsxyhelu/p/6291454.html


一、目前情况和优点
       位置在11.通过clr

   
       架在clr.dll中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  1. String^  Class1::Method(cli::array<unsigned char="">^ pCBuf1)
  2. {
  3.      pin_ptr<system::byte> p1 = &pCBuf1[0];
  4.      unsigned char* pby1 = p1;
  5.      cv::Mat img_data1(pCBuf1->Length,1,CV_8U,pby1);
  6.      cv::Mat img_object = cv::imdecode(img_data1,IMREAD_UNCHANGED);
  7.      //////////////////////////////////处理过
  8.      cvtColor(img_object,img_object,40);
  9.   ////////////////////////////////////////////////////////////////////
  10.      if (!img_object.data)
  11.         return nullptr;
  12.      //获得目录,保存文件
  13.      cv::imwrite("c:/strDst.jpg",img_object);
  14.      return "c:/strDst.jpg";
  15. }
复制代码




csharp这边,首先,有wrapper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  1. class GOCsharpHelper
  2.     {
  3.         Class1 client = new Class1();
  4.         string strResult = null;
  5.         //输入参数是string或bitmap
  6.         public Bitmap ImageProcess(string ImagePath){
  7.             Image  ImageTemp = Bitmap.FromFile(ImagePath);
  8.             return ImageProcess(ImageTemp);
  9.         }
  10.         //输出结果是bitmap
  11.         public Bitmap ImageProcess(Image image)
  12.         {
  13.             MemoryStream ms = new MemoryStream();
  14.             image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
  15.             byte[] bytes = ms.GetBuffer();
  16.             strResult = client.Method(bytes);
  17.             Image ImageResult = Bitmap.FromFile(strResult);
  18.             return (Bitmap)ImageResult;
  19.         }
  20.         public void Clear()
  21.         {
  22.          
  23.             if(File.Exists(strResult))
  24.             File.Delete(strResult);
  25.         }
  26.     }
复制代码


构然后有细节
  1. private void button2_Click(object sender, EventArgs e)
  2.         {
  3.             if (pictureBox1.Image != null)
  4.                 pictureBox1.Image.Dispose();
  5.             Image image = gocsharphelper.ImageProcess(" E:/sandbox/logo.jpg");
  6.            pictureBox1.Image = image;
  7.          
  8.         }
复制代码



通过复杂的方法,将串读入进来,然后转换为mat.这个过程是在内存中进行的,而且效果良好。但是imdecode采用了file I/O的方法,所以和直接写入磁盘是效果一样的。
此外,为opencv生成clr的dll,csharp中直接引用。
       优点:
       1、clr的优点,方便引用和调试;
       2、会生成过程文件,但是能够自动删除。
       3、效率还是有保障的。
二、存在问题
       主要问题还是发展的问题,新的模型,少有人运作,能否用于实际?框架是否合理?
三、发展计划
       算法衍生:我将现有代码运用于GOImageReasearch中,取得一些效果。


文中提及的代码实现
http://files.cnblogs.com/files/jsxyhelu/ClassLibrary1.zip  
http://files.cnblogs.com/files/jsxyhelu/GOImageResearch.zip
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站  

GMT+8, 2019-9-16 08:25 , Processed in 0.040768 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表