转自:jsxyhelu特别感谢! cnblogs.com/jsxyhelu/p/GOCW2020.html 1.什么是GOCW?为了解决用C#编写OpenCV程序的问题,我进行了更深入的研究,并实现了一种有效且可用的方法GreenOpenCsharpWrapper(GOCW)。通过这种方法,可以将接口和算法业务分开,可以高效地完成算法调用,并且算法维护非常方便。
应该说,我多年来在项目实践中不断总结和完善一些东西。 GOCW的发布地址为:https://gitee.com/jsxyhelu2020/gocw 2. GOCW的特征是什么?分开接口和算法。
商业图像数据直接通过内存传输,算法得到有效调用。 C ++++语法程序是直接编写的,便于维护和改进。
在C#中,CLR可以引用它,提供功能级别的接口开放源代码。第三,在VS中下载GOCW的环境配置,下载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添加GOCW头文件;要编写GOCW调用代码,您还可以根据需要在表单中添加“客户端”的定义。在实际使用中,您需要修改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;}如您所见,“灰度” ;被实现的品种。
5.原理介绍GOCW是通过CLR调用的,此处将不扩展CLR的原理。重点关注在何处添加图像处理算法,打开GOCW.h文件#pragmaonce#include“ opencv.hpp” #usingusingnamespaceSystem; usingnamespaceSystem :: Data; usingnamespacespace :: IO; usingnamespaceSystem :: Drawing; usingnamespaceSystem :: Imaging; usingnamespacestd; namespaceGOCW {publicrefclassGOCWClass {public://///示例函数////////1.Transfer image / * MemoryStreamms = newMemoryStream(); b.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg); byte [] bytes = ms.GetBuffer(); Bitmapbitmap = client.testMethod(bytes); * / Bitmap ^ GOCWClass :: arrayunsignedchar> ^ pCBuf1); // 2。
通过引用传递int / * unsafe {int * value = stackallocint [1]; value [0] = 0; intiret = client.allTest(2,3,value);} * / intGOCWClass :: allTest(inta,intb,int * c); // 3。通过引用传递字符串系统::String ^ GOCWClass :: String ^ inputStr); /////业务功能/////// *不安全{int * value = stackallocint [1]; //返回码值[0 ] = 0; bitmap = client.fetchresult(bytes,value); //从GOClrClasslibrary if(value [0] == 0)// 0中调用图像处理算法true 1 false {res = true;} else {res = false;}} * / Bitmap ^ GOCWClass :: arrayunsignedchar> ^ pCBuf1,int * errorCode);};}这里,我们在“三明治”中声明各种实现方法。
方法。具体实现在GOCW.cpp中,例如,让我们举个例子。
// 1。传递图像Bitmap ^ GOCWClass :: array ^ pCBuf1){////////////////////////////将进入cli :: array转换到cv :: Mat ////////////////////// pin_ptrp1 =& pCBuf1 [0]; unsignedchar * pby1 = p1; cv::Matimg_data1(pCBuf1- >长度,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转换为位图(只能传输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更具竞争力
