为了解决在Csharp下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的方法GreenOpenCsharpWrapper(GOCW)。通过这种方法,能够分离界面和算法业务,高效率完成算法调用,而且非常方便进行算法维护。应该说是我在多年项目实践中不断总结提炼出来的一点东西。
GOCW的发布地址为:https://gitee.com/jsxyhelu2020/gocw
分离界面和算法业务
图像数据直接通过内存传值,高效率完成算法调用
直接编写C++语法程序,方便维护改进
在C#中可以通过CLR方式引用,提供函数级别接口
开放源代码
下载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 <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);
是具体业务函数,可以根据实际算法要求进行修改。关于参数的传入传出,在其他几个函数中都有说明。
虽然GOCW相比较OpenCVSharp复杂一点,但是它能够和现有系统更紧密结合,优势也非常明显。如果你首先是图像处理开发者,需要为算法寻找一个可以运行的平台,那么GOCW基于CLR的封装形式,肯定更适合你!
感谢阅读至此,希望有所帮助!
以上就是如何在C#中使用OpenCV(GOCW使用教程)的详细内容,更多关于在C#中使用OpenCV(使用GOCW)的资料请关注小牛知识库其它相关文章!
问题内容: 我想使用Android Studio使用Gradle构建工具开发应用程序。我无法在上插入存储库和库。我的文件如下: 如何在项目中添加OpenCV? 问题答案: 您可以在Android Studio中轻松完成此操作。 请按照以下步骤将Open CV作为库添加到您的项目中。 libraries在项目主目录下创建一个文件夹。例如,如果您的项目是OpenCVExamples,则将创建一个Ope
我想使用Android Studio开发一个应用程序使用Gradle构建工具。我无法在上插入OpenCV repo和库。我的文件如下所示: 我如何在我的项目中添加OpenCV?
问题内容: 我刚刚在Windows 7计算机上安装了OpenCV。结果,我得到一个新目录: 在此目录中,我有两个文件:和。 然后,我尝试使用from Python。我执行以下操作: 结果,我收到以下错误消息: 我究竟做错了什么? 添加 至于有人建议在这里,我抄的内容的。它没有帮助。 加了2 我的环境变量具有以下值: 我需要改变什么吗?我需要添加一些东西吗? 加3 我认为我的问题很笼统:如何使用图书
问题内容: 我正在尝试使用IntelliJ IDEA 12在Java中开发OpenCV 2.4.5应用程序。我已经从这里的网站按照Eclipse的说明进行操作。 我遇到的问题是我可以将jar添加到我的库中,但是我不知道如何将本机添加到我的类路径中。 问题答案: 为了在Java中使用本机库,您需要指定java.library.path系统属性,以便JVM知道在哪里寻找它们。 在IntelliJ中,可
本文向大家介绍Ubuntu中Opencv的安装使用教程,包括了Ubuntu中Opencv的安装使用教程的使用技巧和注意事项,需要的朋友参考一下 前言 OpenCV为基于BSD许可(开源)发行的跨平台计算机视觉库,可运行在Linux、Windows和Mac OS上。它轻量级而且高效,提供了Python、Ruby、MATLAB等语言接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV不仅
问题内容: 我正在尝试在另一个图像中查找图像。 当我运行此命令时,一切正常执行,不会引发任何错误。但是我不确定从这里做什么。该文档说存储“比较结果图”。我尝试打印它,但是它给了我宽度,高度和台阶。 如何使用此信息查找一个图像是否在另一个图像中/位于该图像中? 问题答案: 返回相似度图,而不是位置。然后,您可以使用此地图查找位置。 如果您只寻找一个匹配项,则可以执行以下操作来获取位置: 然后找到最匹