转自: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<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::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<unsigned char>^ 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
-
算法 +关注
关注
22文章
3696浏览量
88675 -
C语言 +关注
关注
171文章
6445浏览量
115492 -
函数 +关注
关注
3文章
2402浏览量
59461 -
代码 +关注
关注
25文章
2978浏览量
64018 -
opencv +关注
关注
29文章
425浏览量
39623
发布评论请先 登录
相关推荐
【飞凌RK3568开发板试用体验】使用OpenCV进行人脸识别
为什么OpenCV使用BGR颜色格式?
OpenCV如何帮助相机自动化视觉跟踪
ok5718怎么调用arm环境下的opencv2来进行交叉编译cpp呢?
在JetsonNano上编译OpenCV源码与OpenCV C++ YOLOv5程序演示
MCU如何部署OpenCV
OpenCV编程:OpenCV3.X训练自己的分类器

关于C#课程总结
分享一下编译opencv与temgine后端的教程
在全志Tina Linux的Ubuntu20.04交叉编译OpenCV 4.5.2
Tina下运行在Ubuntu中交叉编译的Opencv 4.5.1
OpenCV Webinar 2丨如何在OpenCV中调用Tengine推理,实现开发效率翻倍

怎样去生成能在Qt中应用的opencv库呢
在Ubuntu下交叉编译opencv以生成ARM版本的opencv时遇到一些问题
RK3568上OpenCV 的编译移植
LabVIEW+Python+openCV
移植OpenCV-4.3.0的过程
OpenCV中的Python实现
OpenCV学习之路--5--OpenCV3.4.10的ARM版本移植到开发板 精选资料分享
如何将Opencv移植到ARM上
Vivado HLS实现OpenCV图像处理的设计流程与分析
迅为i.MX6ULL开发板-移植OpenCv2.4.9-搭建OpenCv编译环境
基于OpenCV如何提取中心线
Vivado设计流程分析 Vivado HLS实现OpenCV的开发流程

OpenCV的移植方法
【创龙TL437x-EVM评估板免费试用】在创龙TL437x-EVM评估板移植OpenCV
OpenCV中自带组件HighGUI怎么使用?
香橙派RK3399芯片开发板Orange Pi 4安装OpenCV的方法
OpenCV的起源和应用领域
iTOP4412开发板-QtE-opencv-UVC摄像头测试文档
在DM8168上移植opencv用哪一个版本比较好?
如何使用Borland C++ Builder6.0来开发OpenCV的程序

如何使用SDK在独立模式下的OpenCV应用程序
如何安装和配置OpenCV及OpenCV的几个小问题解答

人脸识别历程中的opencv库是1.0还是emcv版本?
在QT中使用OpenCV的方法详细说明

【Toybrick RK3399Pro AI开发板试用体验】编译安装OpenCV 3.4.7
怎样在树莓派上设置OpenCV进行人脸检测
概述在Linux下编译安装OpenCV的步骤
在Vivado中如何实现OpenCV设计
OpenCV学习资料汇总(入门教程+实例程序)
OpenCV三维重建的实现

opencv编译安装笔记(Linux、Ubuntu )

ARM-Linux环境下安装OpenCV
【芯灵思A83T试用体验】3、交叉编译OpenCV2.4.9
【NanoPi NEO试用体验】OpenCV使用篇
Nanopi M3 u***摄像头使用opencv
【DragonBoard 410c试用体验】使用cmake编译opencv工程
【DragonBoard 410c试用体验】安装Debian系统 + 编译opencv
用OpenCV进行基本绘图_OpenCV3编程入门-源码例程
OpenCV3编程入门-源码例程全集-OpenCV开发环境的配置
【DragonBoard 410c试用体验】之OpenCV加载图片实验
【DragonBoard 410c试用体验】之搭建OpenCV开发环境并Demo测试
opencv备忘单
opencv基础的学习手册
【NanoPi M2试用体验】OpenCV3.1搭建
【Raspberry Pi 3试用体验】+编译opencv
【NanoPi M2申请】下载宝与OpenCV学习
【LeMaker Guitar试用体验】之opencv环境搭建并测试
【LeMaker Guitar试用体验】3.Ubuntu Mate系统安装OpenCV2.4.9
NanoPi 2接USB摄像头使用OpenCV
Qt使用openCV库
【WRTnode2R试用体验】+WRTnode添加OpenCV支持
【WRTnode2R试用体验】OpenCV交叉编译,开发OpenCV C++程序
最新OpenCV专题出炉啦~最全OpenCV教程及各种图像处理、目标跟踪、识别案例
最全OpenCV教程及图像处理、目标跟踪、识别案例

评论