如何在C#中使用OpenCV(GOCW使用教程)
作者:jsxyhelu 发布时间:2023-09-09 23:39:30
1、什么是GOCW
为了解决在Csharp下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的方法GreenOpenCsharpWrapper(GOCW)。通过这种方法,能够分离界面和算法业务,高效率完成算法调用,而且非常方便进行算法维护。应该说是我在多年项目实践中不断总结提炼出来的一点东西。
GOCW的发布地址为:https://gitee.com/jsxyhelu2020/gocw
2、GOCW有什么特点
分离界面和算法业务
图像数据直接通过内存传值,高效率完成算法调用
直接编写C++语法程序,方便维护改进
在C#中可以通过CLR方式引用,提供函数级别接口
开放源代码
3、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位
4、测试代码
可以直接参考 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;
}
可以看到,实现了“灰度”变化。
5、原理简介
GOCW是通过CLR的方式进行调用,关于CLR的原理这里不展开。重点将一下你在哪里添加图像处理算法,打开 GOCW.h文件
#pragma once
#include "opencv.hpp"
#using <system.drawing.dll>
using namespace System;
using namespace System::Data;
using namespace System::IO;
using namespace System::Drawing;
using namespace System::Drawing::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::testMethod(cli::array<unsigned char>^ 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::allTestStr(System::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::fetchresult(cli::array<unsigned char>^ pCBuf1, int* errorCode);
};
}
这里以“三明治”的方法将各种实现的方法进行了申明,具体的实现在GOCW.cpp中,比如我们举一个例子。
//1.传递图像
Bitmap^ GOCWClass::testMethod(cli::array<unsigned char>^ pCBuf1)
{
////////////////////////////////将输入cli::array<unsigned char>转换为cv::Mat/////////////////////////
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, 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);
是具体业务函数,可以根据实际算法要求进行修改。关于参数的传入传出,在其他几个函数中都有说明。
6、初步小结
虽然GOCW相比较OpenCVSharp复杂一点,但是它能够和现有系统更紧密结合,优势也非常明显。如果你首先是图像处理开发者,需要为算法寻找一个可以运行的平台,那么GOCW基于CLR的封装形式,肯定更适合你!
感谢阅读至此,希望有所帮助!
来源:https://www.cnblogs.com/jsxyhelu/p/GOCW2020.html


猜你喜欢
- 目录资源定义好之后,再使用时,可以指定以静态的方式使用资源,还是以动态的方式使用资源。资源我们都会使用了,接下来需要归类整理我们的资源,使用
- 不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。Java在java.math包中提供的API类B
- 最近由于工作要求:前端采用vue开发,后端采用springboot开发,前后端分离开发,最后前端页面又整合到后端来。经历多次采坑,总结以下方
- Android的应用被限制为最多占用16m的内存,至少在T-Mobile G1上是这样的(当然现在已经有几百兆的内存可以用了——译者注)。它
- Android语音合成与语音识别,供大家参考,具体内容如下这里调用科大讯飞语音的API,语音云开放平台介绍调用科大讯飞语音的API,需要加添
- Android 实现记住用户名和密码的功能是通过SharedPreference 存储来实现的。创建一个复选按钮,通过按钮的否选取来进行事件
- 之前我们在使用vue进行 h5 表单录入的过程中,遇到了Android软键盘弹出,覆盖 h5页面 输入框 问题,在此进行回顾并分享给大家:系
- 端口设置和contextpath的配置端口设置Spring boot 默认端口是8080,如果想要进行更改的话,只需要修改applicato
- C#事件实例详解C#和JAVA有许多相似的地方,设计思想差不多,语法及其相像,均传承自面向对象设计思想,灵感来自C++并取其精华去其“糟粕(
- 本文实例为大家分享了Unity shader百叶窗展示的具体代码,供大家参考,具体内容如下1.将图片划分为水平N栏,代码如下:Shader
- 1.雪崩效应 雪崩效应如上图所示,假设我们有3个微服务A,B,C,A调用B,B调用C,如果C挂掉了,由于B是同步调用,不断等待,导致资源耗尽
- 本文主要学习Java构造器与传值,供大家参考,具体内容如下构造器构造器介绍构造器是Java学习中一个很重要的概念,每个类的对象在使用关键字n
- 1. 树型结构1.1概念树是一种 非线性 的数据结构,它是由 n ( n>=0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是
- 在C#中,@符号不仅可以加在字符串常量之前,使字符串不作转义之用,还可以加在变量名之前,使变量名与关键字不冲突,这种用法称为“逐字标识符”。
- 1、super的使用:(1)super是一个关键字。(2)super和this很类似,我们对比着学习。2、先复习一下this关键字的使用。(
- 你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有100名学生在上课。游戏的规则是:1. 你首先说出三个不同的特殊数,
- 前言今天刷个题,遇到一个很有趣的问题,关于Comparator的使用,感觉也是一个关于写代码的一些小细节的问题关于ComparatorCom
- 1、Java字符串在 Java 中字符串被作为 String 类型的对象处理。 String 类位于 java.lang 包中,默认情况下该
- 1. WebView 远程代码执行漏洞描述 Android API l
- AsyncContextAsyncContext是Servlet 3.0使Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响