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

这篇具有很好参考价值的文章主要介绍了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 <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/legacy/constants_c.h"
#include <opencv2/opencv.hpp>
#include <time.h>
#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,这样变化不多,而且资料很多!

五,参考资料推荐

  • VS2019如何永久配置本地OpenCV4.5.5使用
  • 如何通过C#调用OpenCV函数(自制OpenCV的c++ dll文件)
  • C#调用 opencv cv::Mat 图像, 采用折中方法
  • 自制OpenCV的C++ dll文件,C#调用OpenCV函数
  • OpenCV C++如何使RGB图像变为灰度图像
  • C#调用C++、Opencv的Dll
  • 最后附上该例程的项目文件,直接点击下载即可:C#调用C++文件(OpenCV)思路和实现方法(小白教程)的例程文件

最后文中若有不足,敬请批评指正!文章来源地址https://www.toymoban.com/news/detail-434456.html

到了这里,关于C#调用OpenCV(C++原版)思路和实现方法(小白教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#生成dll给c++调用 方法二COM方式 vs2022 NO Make Assembly COM-Visible选错了 不需要clr

    有些C++项目中也用了C语言.c,用方法一就无法使用【不能使用 /clr 选项编译 C 文件】。就用方法2。  参考:  https://www.5axxw.com/questions/content/2ozion  1.C# 生成dll     编译正常,C# dll就完成了。 2.C++调用示例

    2024年02月14日
    浏览(47)
  • UE5- c++ websocket里实现调用player里的方法

    获取到引用了,就可以自然的调用。忽略 前置已经添加了websocket,具体步骤参考,链接 在UWebSocketGameInstance.h里新增代理,并在链接成功后进行绑定。 说明, 声明一个代理。DECLARE_DELEGATE_OneParam(JSONMessageTrigger, FString) 声明触发器。public:     JSONMessageTrigger JSONMessageTrigger; 下面到

    2024年02月10日
    浏览(47)
  • Opencv(C++)学习之 一种用opencv实现高斯曲线拟合的方法

    项目中需要实现数据的高斯拟合,进而提取数据中标准差,手头只有opencv库,经过资料查找验证,总结该方法。 1、opencv中solve可以实现对矩阵参数的求解; 2、线的拟合就是对多项式参数求解的过程,多项式可表示为矩阵形式; 3、高斯公式中的指数幂,可以通过取对数的方

    2024年02月21日
    浏览(40)
  • unity教程||Unity调用安卓方法实现安装apk文件

    记录下,个人之前做一个项目的时候碰到一个需求,安卓端的app中需要做冷更新,这里简单解释下冷更新,其实就是拿当前的app的版本号比对服务器上的版本号,如果服务器上有新版本,就下载新版本的apk,然后安装替换掉整个app,就是冷更新。但是具体实现的时候碰到个问

    2024年02月07日
    浏览(47)
  • OpenCV安装教程(全网最细,小白直接上手!!!)

    OpenCV是Python、Ruby、MATLAB的接口,OpenCV在计算机视觉的发展中发挥了重要的作用,使成千上万的人能够在视觉上做更多的工作。由于在VSLAM技术研究过程中,经常会涉及OpenCV不同版本在ubuntu系统下的安装。文章简单总结了一下两个版本的OpenCV在ubuntu系统下的步骤,对小白超级友

    2024年02月03日
    浏览(47)
  • C#调用C++动态库

    在C#开发过程中,我们可能会遇到需要调用Windows API 或是第三方库的场景,然而有时候这些库是由C++编写的,并不能直接应用在C#的程序中,这为开发带来许多阻力。本文介绍两种使用C#调用C++动态库的方式,以及在这个过程中可能遇到的问题,看完之后会对你的困境有所帮助

    2024年02月16日
    浏览(30)
  • C#调用C++ dll异常排查

    最近在做的一款程序,长时间运行总会出现莫名的问题。有时是自动关闭,有时程序报错,有时调用的dll异常…… 由于开始与C++组合作时,使用其提供的dll出现过数据读写时异常(内存操作异常),于是怀疑他们提供的dll有内存泄漏。于是想通过日志或其它方法来确认这个猜

    2024年01月21日
    浏览(55)
  • C++调用C# dll成功示例

    一.准备C# dll类库 。生成CSLib.dll  二、写C++应用调用  1)需要把dll复制到运行目录下。(不然会提示找不到dll System.IO.FileNotFoundException:“未能加载文件或程序集“CSLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件) 2)设置\\\"公共语言运

    2024年02月14日
    浏览(61)
  • Unity Native Plugin C#和C++互相调用

    官方链接 1.DLL的方式: C++代码:编译成DLL,导入Unity C#代码: 2.还有一种是C++源码作为插件,只支持il2cpp。 C++代码:直接放到Unity的Assets目录下 C#源文件:区别只在导入时不写具体的文件名,写:__Internal即可,因为用IL2CPP 后端的方式,会把C++源文件放到工程内部一块编译。

    2024年02月12日
    浏览(44)
  • 详述C++ 调用opencv编译成dll并调用的全过程

     其中,extern \\\"C\\\":告诉编译器将被它修饰的代码按C语言的方式进行编译。             __declspec(dllexport):告诉编译器和链接器被它修饰的函数或变量需要从DLL导出,以供其他应用程序使用;与其相对的还有一句代码是__declspec(dllimport),此修饰符的作用是告诉编译器和链接

    2024年02月04日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包