C#调用OpenCV(C++原版)思路和实现方法(小白教程)

目录:

前言:

原本想着用OpenCV的话,只需考虑在编程语言环境下调用对应的库(包)就行了,因为之前也是做了一个利用python(OpenCV-python接口)下编写了一个停车场空位识别项目,但是没接触过实际的我,天真地认为这些语言封装库接口已经可以实现原本OpenCV的所有功能,但是看了面试题目和网上查询相关资料,发现语言封装库其实或多或少是原版OpenCV的各种阉割版,毕竟也可以理解:在为各种语言封装时肯定会牺牲本身的一些接口和API功能!
因此,原版的OpenCV非常强大,继承了C的快速和C++优秀的图形处理性能,由于C++和C语法糖和应用项目化其实没有.net C#好,实际的生成环境更是一种特殊的情况:用C#编写脚本(项目)调用原版的OpenCV(C++)!

为了展示和记录特意写了这一博文,希望大家能多多勘误!

一,下载和安装OpenCV到本地

为什么要本地安装呢?因为既然调用那么必须是要获得相应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#做视觉应用的一个常用点!

  • C#调用OpenCV(c++的.dll主要有两种常见的方式:托管和非托管两种形式!
  • 非托管的形式即是采用[DllImport]的形式,这种形式只能调用的C++的函数,适合用于简单的图形处理调用,这也是非常便捷的方法,由于只是演示C#调用OpenCV(c++的.dll),本文主要采用该方法!
  • 托管的形式用的是ref,可以调用C++类中的方法,适用于处理比较复杂的图形处理,特别是封装成类和方法,使得C#调用时处理复杂情景更好!

开发环境:与上文配置vs与opencv一样!

  • windows10专业版
  • opencv4.5.5
  • VS2019
  • C# .NET Framework4.5控制台应用程序

三,C++生成供C#调用OpenCV的.dll

既然要用到第一种方法那么就要建立一个C++空项目来生成.dll文件!

  • 在vs2019下,新建空项目:
    C#调用OpenCV(C++原版)思路和实现方法(小白教程)
    C#调用OpenCV(C++原版)思路和实现方法(小白教程)

; 1.添加头文件

点击头文件夹,右键点击添加->添加新建项(或者点击头文件后,快捷键Ctrl+Shift+A)

C#调用OpenCV(C++原版)思路和实现方法(小白教程)
C#调用OpenCV(C++原版)思路和实现方法(小白教程)
接着添加demo.h内容:
#pragma once
extern "C" __declspec(dllexport) void toCV();

上面得说明下的是,toCV();是我们后面在demo.cpp文件添加的返回为空的调用函数名,可根据自己实际添加!

2.添加cpp文件

C#调用OpenCV(C++原版)思路和实现方法(小白教程)
  • 在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那个名称对应!

3.添加模块定义文件

点击源文件夹,右键点击添加->添加新建项(或者点击头文件后,快捷键Ctrl+Shift+A)

C#调用OpenCV(C++原版)思路和实现方法(小白教程)
在Source.def下添加下面代码:
LIBRARY demo
  EXPORTS toCV

这里说明下:

  • LIBRARY 后跟着你的项目名(比如demo);
  • EXPORTS 后跟着你的调用函数名(比如toCV);

接着,先保存所有文件,看看有误语法错误等提示,如果没有,再按下面指示操作!

C#调用OpenCV(C++原版)思路和实现方法(小白教程)
点击vs最顶的菜单->项目->对应的项目名属性
C#调用OpenCV(C++原版)思路和实现方法(小白教程)

C#调用OpenCV(C++原版)思路和实现方法(小白教程)

完成上面配置方可点击重新生成解决方案,不然会报错,常见是上面配置类型没有选择.dll而是选择了.exe!

C#调用OpenCV(C++原版)思路和实现方法(小白教程)
C#调用OpenCV(C++原版)思路和实现方法(小白教程)

四,建立C#调用.dll的控制台程序

  • 你可以选择其他应用项目,只要能利用C++.dll中的tocv函数都行,为了简单演示,只是新建.net 控制台程序!
    C#调用OpenCV(C++原版)思路和实现方法(小白教程)
    C#调用OpenCV(C++原版)思路和实现方法(小白教程)

完成配置后,点击启动程序(此时程序代码是默认给出的,可先不用管),让项目生成x64的debug文件先!接着把所需图片和C++生成的.dll放到该目录下,如下所示:

C#调用OpenCV(C++原版)思路和实现方法(小白教程)
  • 接着添加Program.cs的代码:
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();
        }
    }
}

再点击启动程序,即可出现以下画面!

C#调用OpenCV(C++原版)思路和实现方法(小白教程)
接着想说的是,由于OpenCV版本太新,里面应用的函数名参数配置,头文件引用等,都会发生很大的变化,当你用的是新版本,vs中使用一般的图形处理函数可能函数构造和引用都发生很大变化,vs会提示引用文件不存在或函数构造无标识,所以不要怀疑,得查看官方源码或文档,及时替换,另一种解决方式是,使用旧版本的OpenCV,这样变化不多,而且资料很多!

五,参考资料推荐

最后文中若有不足,敬请批评指正!

Original: https://blog.csdn.net/SteveZhou212/article/details/125103432
Author: SteveDraw
Title: C#调用OpenCV(C++原版)思路和实现方法(小白教程)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/636803/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球