OpenCV课程分享 怎么在C#中使用OpenCV

转自:jsxyhelu  在此特别鸣谢!
cnblogs.com/jsxyhelu/p/gocw2020.html 一、什么是gocw
为了解决在c#下编写opencv程序的问题,我做过比较深入的研究,并且实现了高效可用的方法greenopencsharpwrapper(gocw)。通过这种方法,能够分离界面和算法业务,高效率完成算法调用,而且非常方便进行算法维护。应该说是我在多年项目实践中不断总结提炼出来的一点东西。
gocw的发布地址为:https://gitee.com/jsxyhelu2020/gocw
二、gocw有什么特点
分离界面和算法业务
图像数据直接通过内存传值,高效率完成算法调用
直接编写c++语法程序,方便维护改进
在c#中可以通过clr方式引用,提供函数级别接口
开放源代码
三、gocw在vs中的环境配置
下载gocw_master,解压后获得两个目录文件。
其中,gocw是类库文件,而winform_demo是引用范例。
使用vs2017或者更高版本打开winform_demo.sln(或新建winform程序),在“引用”处添加gocw的引用。
特别需要注意,正确编译gocw需要opencv的正确配置,所以需要正确设置include和lib,并且保证对应版本的dll文件能够被正确访问。
特别需要注意1:保证dll和csharp程序的.net目标框架是一致的
特别需要注意2:
保证dll和csharp程序的.net目标框架是一致的
配置管理器中,所有项目版本全部使用64位
四、测试代码
可以直接参考 winfrom_demo
添加gocw的头文件
using gocw;  
编写gocw调用代码,你也可以根据需要吧client的定义放在form中。你实际使用过程中需要修改lena的地址。
private void button1_click(object sender, eventargs e){ bitmap bmp = (bitmap)bitmap.fromfile(e:/template/lena.jpg); gocwclass client = new gocwclass(); //调用图像处理算法 memorystream ms = new memorystream(); bmp.save(ms, system.drawing.imaging.imageformat.jpeg); byte[] bytes = ms.getbuffer(); bitmap bitmap = client.testmethod(bytes); picturebox1.image = bitmap;}  
可以看到,实现了灰度变化。
五、原理简介
gocw是通过clr的方式进行调用,关于clr的原理这里不展开。重点将一下你在哪里添加图像处理算法,打开 gocw.h文件
#pragma once#include opencv.hpp#using using namespace system;using namespace system::data;using namespace system::io;using namespace system::drawing;using namespace system::imaging;using namespace std;namespace gocw { public ref class gocwclass { public: /////例子函数////// //1.传递图像 /* memorystream ms = new memorystream(); b.save(ms, system.drawing.imaging.imageformat.jpeg); byte[] bytes = ms.getbuffer(); bitmap bitmap = client.testmethod(bytes);*/ bitmap^ gocwclass::array^ pcbuf1); //2.引用传递int /*unsafe { int* value = stackalloc int[1]; value[0] = 0; int iret = client.alltest(2, 3, value); }*/ int gocwclass::alltest(int a, int b, int* c); //3.引用传递字符串 system::string^ gocwclass::string^ inputstr); /////业务函数////// /*unsafe { int* value = stackalloc int[1];//返回代码 value[0] = 0; bitmap = client.fetchresult(bytes, value);//调用来自goclrclasslibrary图像处理算法 if (value[0] == 0)//0真1假 { res = true; } else { res = false; } }*/ bitmap^ gocwclass::array^ pcbuf1, int* errorcode); };}  
这里以三明治的方法将各种实现的方法进行了申明,具体的实现在gocw.cpp中,比如我们举一个例子。
//1.传递图像bitmap^ gocwclass::array^ pcbuf1){ ////////////////////////////////将输入cli::array转换为cv::mat///////////////////////// pin_ptr 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, cv::imread_unchanged); if (!img_object.data) return nullptr; ////////////////////////////////////////////opencv的算法处理过程//////////////////////////////////// mat draw = img_object.clone(); cvtcolor(draw, draw, color_bgr2gray); cvtcolor(draw, draw, color_gray2bgr); /////////////////////////将cv::mat转换为bitmap(只能传输cv_8u3格式数据)/////////////////////////////// if (!draw.data) return nullptr; bitmap^ bitmap = mattobitmap(draw); return bitmap;}  
在这段代码中
mat draw = img_object.clone();cvtcolor(draw, draw, color_bgr2gray);cvtcolor(draw, draw, color_gray2bgr);  
是具体业务函数,可以根据实际算法要求进行修改。关于参数的传入传出,在其他几个函数中都有说明。
六、初步小结
虽然gocw相比较opencvsharp复杂一点,但是它能够和现有系统更紧密结合,优势也非常明显。如果你首先是图像处理开发者,需要为算法寻找一个可以运行的平台,那么gocw基于clr的封装形式,肯定更适合你!
感谢阅读至此,希望有所帮助!
原文标题:c# 中使用 opencv
 转自:jsxyhelu
cnblogs.com/jsxyhelu/p/gocw2020.html

工业设计的奇迹--iPhone4
FPGA为科学家探索宇宙大爆炸提供帮助
【技术】电路板如何过孔处理
iPhone12配置已确认,A14芯片和全系5G功能
旋转式磁编码系统在CNC机床上的应用解析
OpenCV课程分享 怎么在C#中使用OpenCV
红米note5曝光:骁龙630+1600万主摄像头,最快7月底发布
300 MW火电机组脱硝控制策略设计与优化
运算放大器输出电流扩展电路原理图
openwifi OFDM接收机信道估计优化
OPPO发布的3D人脸识别技术到底有多牛逼
基于微流控器件和CMOS以及SOI绝缘体上硅芯片的集成
ALE Rainbow解决方案有哪些优势?
扩频通信的理论基础
教你看懂4602-050-394加速度传感器原理与应用
2020年基带芯片排行榜中海思位居第二
2.4g天线放大器电路图
MWC大会推波助澜 移动医疗百亿市场开启
欧莱雅推出一款Beauty Gifter智能机器人,意在促进消费市场
汽车焊装生产线输送设备特点及应用的介绍