在gitee上看到一个感兴趣的项目,《在C#中使用OpenCV(使用GOCW)》,https://gitee.com/jsxyhelu2020/gocw。
总得来说,这个项目实现了使用原生C++编写OpenCV算法,封装成动态链接库(windows平台是.dll),再使用C#通过CLR引用动态库中的函数方法。是我希望了解的实现方式。
按作者总结就是:
(1)分离界面和算法业务
(2)图像数据直接通过内存传值,高效率完成算法调用
(3)直接编写C++语法程序,方便维护改进
(4)在C#中可以通过CLR方式引用,提供函数级别接口
一、下载编译测试运行
从gitee上下载源码,根据提示一步步设置完毕,编译通过,但是在使用C#通过CLR引用动态库中的函数方法时却出错。
这个项目开源于2年前,使用的OpenCV版本是4.1.2。
下载了4.1.2依然是提示失败。
二、重新搭建项目
我决定重新搭建这个项目。改用OpenCV4.5.5版本。基于VS2022
(1)新建C++项目
(2)新建头文件和源文件:GOCW.h和GOCW.cpp
分别把源码贴进去,此处略去,可于文末下载源码查看。
(3)配置环境
根据文章《三味书屋-OpenCV在windows中的环境搭配 (luweidong.cn)》配置OpenCV在windows vs中的运行环境。
注意在配置运行环境前,在配置管理器中,选好运行平台,我这里选择x64

注意:高级->公共语言运行时支持,设置为公共语言运行时支持(/clr)。.net 目标框架版本填写:v4.7.2,需要与第(7)步新建的winform版本一致。

(4)删除默认文件
删除4个文件:framework.h、dllmain.cpp、pch.cpp、pch.h

(5)取消预编译头
第四步删除pch.h和pch.cpp,所以这里取消预编译头。在C/C++->预编译头,设置为:不使用预编译头。
在名为“GOCW”的C++项目上右键,选择属性,可以打开配置页。

(6)编译运行
首次编译后提示:不支持两阶段名称查找。

解决方法是打开项目属性,C/C++->语言,把其中的符合模式修改为:否。

(7)新建winform(.NET Framework)项目

基于.net 4.7.2。框架需要与(3)配置环境中的.net 目标框架版本一致。

放置一个button控件和一个picture box控件

添加引用,引用C++项目:GOCW

button代码:
Bitmap bmp = (Bitmap)Bitmap.FromFile("K:/test.png");
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;
注意:配置管理器中,各个平台需要一样

运行,测试成功。

下载码是:67E903C899,下载码是啥?如何下载=》点击查看