服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 如何在C#中使用OpenCV(GOCW使用教程)

如何在C#中使用OpenCV(GOCW使用教程)

2022-10-25 13:16jsxyhelu C#

这篇文章主要介绍了如何在C#中使用OpenCV(GOCW使用教程),帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下

1、什么是GOCW

为了解决在Csharp下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的方法GreenOpenCsharpWrapper(GOCW)。通过这种方法,能够分离界面和算法业务,高效率完成算法调用,而且非常方便进行算法维护。应该说是我在多年项目实践中不断总结提炼出来的一点东西。
GOCW的发布地址为:https://gitee.com/jsxyhelu2020/gocw

2、GOCW有什么特点

分离界面和算法业务
图像数据直接通过内存传值,高效率完成算法调用
直接编写C++语法程序,方便维护改进
在C#中可以通过CLR方式引用,提供函数级别接口
开放源代码

3、GOCW在VS中的环境配置

下载gocw_master,解压后获得两个目录文件。

如何在C#中使用OpenCV(GOCW使用教程)

其中,GOCW是类库文件,而WINFORM_DEMO是引用范例。

使用VS2017或者更高版本打开WINFORM_DEMO.sln(或新建winform程序),在“引用”处添加GOCW的引用。

如何在C#中使用OpenCV(GOCW使用教程)

特别需要注意,正确编译GOCW需要OpenCV的正确配置,所以需要正确设置include和lib,并且保证对应版本的dll文件能够被正确访问。

如何在C#中使用OpenCV(GOCW使用教程)

如何在C#中使用OpenCV(GOCW使用教程)

特别需要注意1:保证dll和csharp程序的.net目标框架是一致的

如何在C#中使用OpenCV(GOCW使用教程)

如何在C#中使用OpenCV(GOCW使用教程)

特别需要注意2:保证dll和csharp程序的.net目标框架是一致的
配置管理器中,所有项目版本全部使用64位

如何在C#中使用OpenCV(GOCW使用教程)

 

4、测试代码

可以直接参考 WINFROM_DEMO

如何在C#中使用OpenCV(GOCW使用教程)

添加GOCW的头文件

usingGOCW;

编写GOCW调用代码,你也可以根据需要吧Client的定义放在Form中。你实际使用过程中需要修改lena的地址。

privatevoidbutton1_Click(objectsender,EventArgse)
{
Bitmapbmp=(Bitmap)Bitmap.FromFile("e:/template/lena.jpg");
GOCWClassclient=newGOCWClass();
//调用图像处理算法
MemoryStreamms=newMemoryStream();
bmp.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
byte[]bytes=ms.GetBuffer();
Bitmapbitmap=client.testMethod(bytes);
pictureBox1.Image=bitmap;
}

可以看到,实现了“灰度”变化。

如何在C#中使用OpenCV(GOCW使用教程)

 

5、原理简介

GOCW是通过CLR的方式进行调用,关于CLR的原理这里不展开。重点将一下你在哪里添加图像处理算法,打开GOCW.h文件

#pragmaonce
#include"opencv.hpp"
#using<system.drawing.dll>
usingnamespaceSystem;
usingnamespaceSystem::Data;
usingnamespaceSystem::IO;
usingnamespaceSystem::Drawing;
usingnamespaceSystem::Drawing::Imaging;
usingnamespacestd;
namespaceGOCW{
publicrefclassGOCWClass
{
public:
/////例子函数//////
//1.传递图像
/*MemoryStreamms=newMemoryStream();
b.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
byte[]bytes=ms.GetBuffer();
Bitmapbitmap=client.testMethod(bytes);*/
Bitmap^GOCWClass::testMethod(cli::array<unsignedchar>^pCBuf1);
//2.引用传递int
/*unsafe
{
int*value=stackallocint[1];
value[0]=0;
intiret=client.allTest(2,3,value);
}*/
intGOCWClass::allTest(inta,intb,int*c);

//3.引用传递字符串
System::String^GOCWClass::allTestStr(System::String^inputStr);
/////业务函数//////
/*unsafe
{
int*value=stackallocint[1];//返回代码
value[0]=0;
bitmap=client.fetchresult(bytes,value);//调用来自GOClrClasslibrary图像处理算法
if(value[0]==0)//0真1假
{
res=true;
}
else
{
res=false;
}
}*/
Bitmap^GOCWClass::fetchresult(cli::array<unsignedchar>^pCBuf1,int*errorCode);

};
}

这里以“三明治”的方法将各种实现的方法进行了申明,具体的实现在GOCW.cpp中,比如我们举一个例子。

//1.传递图像
Bitmap^GOCWClass::testMethod(cli::array<unsignedchar>^pCBuf1)
{
////////////////////////////////将输入cli::array<unsignedchar>转换为cv::Mat/////////////////////////
pin_ptr<System::Byte>p1=&pCBuf1[0];
unsignedchar*pby1=p1;
cv::Matimg_data1(pCBuf1->Length,1,CV_8U,pby1);
cv::Matimg_object=cv::imdecode(img_data1,cv::IMREAD_UNCHANGED);
if(!img_object.data)
returnnullptr;
////////////////////////////////////////////OpenCV的算法处理过程////////////////////////////////////
Matdraw=img_object.clone();
cvtColor(draw,draw,COLOR_BGR2GRAY);
cvtColor(draw,draw,COLOR_GRAY2BGR);
/////////////////////////将cv::Mat转换为Bitmap(只能传输cv_8u3格式数据)///////////////////////////////
if(!draw.data)
returnnullptr;
Bitmap^bitmap=MatToBitmap(draw);
returnbitmap;
}

在这段代码中

Matdraw=img_object.clone();
cvtColor(draw,draw,COLOR_BGR2GRAY);
cvtColor(draw,draw,COLOR_GRAY2BGR);

是具体业务函数,可以根据实际算法要求进行修改。关于参数的传入传出,在其他几个函数中都有说明。

6、初步小结

虽然GOCW相比较OpenCVSharp复杂一点,但是它能够和现有系统更紧密结合,优势也非常明显。如果你首先是图像处理开发者,需要为算法寻找一个可以运行的平台,那么GOCW基于CLR的封装形式,肯定更适合你!
感谢阅读至此,希望有所帮助!

以上就是如何在C#中使用OpenCV(GOCW使用教程)的详细内容,更多关于在C#中使用OpenCV(使用GOCW)的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/jsxyhelu/p/GOCW2020.html

延伸 · 阅读

精彩推荐
  • C#C# 后台处理图片的几种方法

    C# 后台处理图片的几种方法

    本篇文章主要介绍了C# 后台处理图片的几种方法,非常具有实用价值,需要的朋友可以参考下。...

    IT小伙儿10232021-12-08
  • C#在WPF中动态加载XAML中的控件实例代码

    在WPF中动态加载XAML中的控件实例代码

    这篇文章主要介绍了在WPF中动态加载XAML中的控件,实例分析了WPF中针对XAML中控件的动态调用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    kagula10952021-11-30
  • C#winform c#中子窗体关闭刷新父窗体的实例

    winform c#中子窗体关闭刷新父窗体的实例

    下面小编就为大家带来一篇winform c#中子窗体关闭刷新父窗体的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网5172021-12-27
  • C#C# 文件下载之断点续传实现代码

    C# 文件下载之断点续传实现代码

    本篇文章主要介绍了C# 文件下载之断点续传实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    sparkdev5002021-12-18
  • C#C#实现截取验证码图片

    C#实现截取验证码图片

    这篇文章主要为大家详细介绍了C#实现截取验证码图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    老狗子11102022-03-06
  • C#浅谈C#中的委托、事件与异步

    浅谈C#中的委托、事件与异步

    本文主要介绍了C#中的委托、事件与异步的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧...

    sxyy6172021-12-29
  • C#C# 常用公共方法

    C# 常用公共方法

    这篇文章主要为大家详细介绍了C# 常用公共方法,分享给大家,供大家参考,感兴趣的小伙伴们可以参考一下...

    码农-小菜鸟5232021-12-01
  • C#asp.net(C#)清除全部Session与单个Session的方法

    asp.net(C#)清除全部Session与单个Session的方法

    下面小编就为大家带来一篇asp.net(C#)清除全部Session与单个Session的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看...

    C#教程网10142021-12-14