原本想着用OpenCV的话,只需考虑在编程语言环境下调用对应的库(包)就行了,因为之前也是做了一个利用python(OpenCV-python接口)下编写了一个停车场空位识别项目,但是没接触过实际的我,天真地认为这些语言封装库接口已经可以实现原本OpenCV的所有功能,但是看了面试题目和网上查询相关资料,发现语言封装库其实或多或少是原版OpenCV的各种阉割版,毕竟也可以理解:在为各种语言封装时肯定会牺牲本身的一些接口和API功能!
因此,原版的OpenCV非常强大,继承了C的快速和C++优秀的图形处理性能,由于C++和C语法糖和应用项目化其实没有.net C#好,实际的生成环境更是一种特殊的情况:用C#编写脚本(项目)调用原版的OpenCV(C++)!
为了展示和记录特意写了这一博文,希望大家能多多勘误!
为什么要本地安装呢?因为既然调用那么必须是要获得相应OpenCV接口的调头文件或者C++文件!
下载可到官网去下载,主要看看是什么对应的系统环境(windows,Linux,Mac OX)!
由于你的VS版本要与OpenCV的SDK文件对应(比如我的VS2019是要VC15或16),这里是VS-VC对应版本表
下载文件安装程序其实可以发现,该版本是269MB,实际安装到文件目录后是2点多个G!(可见里面的功能和文件是多么丰富的!随着版本的更新,这只会越庞大,所以要留足内存哦!)
实际配置方法可参考我写的这个:VS2019如何永久配置本地OpenCV4.5.5使用
配置必须完成,不然后面的步骤根本没办法做!
c#和C++虽然两者衍生自C语言爸爸,两者更是有多个类似的地方,但是终究语言环境的差异,这两者并不能互通,但是做好接口和生成和调用.dll(动态链接库)就可以无缝连接,这也是目前C#做视觉应用的一个常用点!
开发环境:与上文配置vs与opencv一样!
- windows10专业版
- opencv4.5.5
- VS2019
- C# .NET Framework4.5控制台应用程序
既然要用到第一种方法那么就要建立一个C++空项目来生成.dll文件!
点击头文件夹,右键点击添加->添加新建项(或者点击头文件后,快捷键Ctrl+Shift+A)
接着添加demo.h内容:
#pragma once
extern "C" __declspec(dllexport) void toCV();
上面得说明下的是,toCV();是我们后面在demo.cpp文件添加的返回为空的调用函数名,可根据自己实际添加!
#include
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/legacy/constants_c.h"
#include
#include
#include"demo.h" //这里对应你新建的那个头文件
using namespace std;
using namespace cv;
void toCV()
{
//从文件中读入图像
Mat img = imread("1.jpg", 1);
Mat dst;
//如果读入图像失败
if (img.empty()) {
printf("打开图片失败!\n");
}
namedWindow("RGB", WINDOW_AUTOSIZE);
imshow("RGB", img);
cvtColor(img, dst, COLOR_BGR2GRAY);
namedWindow("GRAY", WINDOW_AUTOSIZE);
imshow("GRAY", dst);
printf("测试成功!成功把rgb图转成灰度图!");
//此函数等待按键,按键盘任意键就返回
waitKey(0);
}
以上代码主要是将一个RGB原图转化为灰度图,并打印输出成功提示和两张图的窗口的函数toCV(),与前面的demo.h那个名称对应!
点击源文件夹,右键点击添加->添加新建项(或者点击头文件后,快捷键Ctrl+Shift+A)
在Source.def下添加下面代码:
LIBRARY demo
EXPORTS toCV
这里说明下:
- LIBRARY 后跟着你的项目名(比如demo);
- EXPORTS 后跟着你的调用函数名(比如toCV);
接着,先保存所有文件,看看有误语法错误等提示,如果没有,再按下面指示操作!
点击vs最顶的菜单->项目->对应的项目名属性
完成配置后,点击启动程序(此时程序代码是默认给出的,可先不用管),让项目生成x64的debug文件先!接着把所需图片和C++生成的.dll放到该目录下,如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
using System.Runtime.InteropServices;//由于使用非托管,一定得添加这个
namespace App
{
class Program
{
[DllImport("demo.dll")]
private extern static void toCV();
static void Main(string[] args)
{
toCV();
ReadKey();
}
}
}
再点击启动程序,即可出现以下画面!
接着想说的是,由于OpenCV版本太新,里面应用的函数名参数配置,头文件引用等,都会发生很大的变化,当你用的是新版本,vs中使用一般的图形处理函数可能函数构造和引用都发生很大变化,vs会提示引用文件不存在或函数构造无标识,所以不要怀疑,得查看官方源码或文档,及时替换,另一种解决方式是,使用旧版本的OpenCV,这样变化不多,而且资料很多!
最后文中若有不足,敬请批评指正!