文章目录

  • 前言
  • 一、编译OpenCV和opencv_contrib
  • 二、制作Dotnet可以调用的dll
    • 第一步:创建C++空项目并添加一个类
    • 第二步:配置OpenCV环境
    • 第三步:将C++代码编译成dll
  • 三、使用Dotnet验证
  • 总结

前言

Dotnet使用OpenCV库有两种方式:
一是使用opencvsharp,目前已经支持到OpenCV4.5.3。
二是使用C++编译源码,生成托管或者非托管的dll,给Dotnet使用。
推荐方式一的OpenCVSharp,可以直接使用,但是他发布的版本默认设置BUILD_opencv_wechat_qrcode=OFF,关闭了微信解码库,因此感兴趣的同学需要自己编译了。笔者因为之前需要,已经编译了C++版本的OpenCV4.5.2,所以再次封装dll更加便捷。


一、编译OpenCV和opencv_contrib

笔者的编译环境跟下面文章一致,所以直接参考下面大神的文章吧,很详细。
win10 下编译用于 Visual Studio 2019 的 OpenCV4.5.2(含 opencv_contrib 扩展模块)附编译好的OpenCV(图文)

二、制作Dotnet可以调用的dll

首先解释一下,托管DLL和非托管DLL的区别:
1,狭义解释讲,托管DLL就在Dotnet环境生成的DLL文件。非托管DLL不是在Dotnet环境生成的DLL文件。
2,托管DLL文件,可以在Dotnet环境通过 “添加引用” 的方式,直接把托管DLL文件添加到项目中。然后通过 Using DLL命名空间,来调用相应的DLL对象 。非托管DLL文件,在Dotnet环境应用时,通过 DllImport 调用。
3,非托管需要对调用方法一个个声明引用,托管则不需要
参考文章:托管DLL和非托管DLL的区别
笔者是在C++环境编译好的OpenCV,再次封装一个接口给C#调用,所以选非托管。

第一步:创建C++空项目并添加一个类

代码如下(示例):
ZrdDecoder.h

#pragma once#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/wechat_qrcode.hpp>//extern "C" _declspec(dllexport) int Init();
extern "C" _declspec(dllexport) const char* Decoder(const char*);//存放解码结果
char decoder_result[256] = { 0 };//微信解码器构造
cv::Ptr<cv::wechat_qrcode::WeChatQRCode> detector = nullptr;class ZrdDecoder
{};

ZrdDecoder.cpp

#include "ZrdDecoder.h"int Init()
{try {detector = cv::makePtr<cv::wechat_qrcode::WeChatQRCode>("models\\detect.prototxt","models\\detect.caffemodel","models\\sr.prototxt","models\\sr.caffemodel");return 0;}catch (const std::exception& e) {std::cout <<"\n---------------------------------------------------------------\n""Failed to initialize WeChatQRCode.\n""Please, download 'detector.*' and 'sr.*' from\n""https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode\n""and put them into the current directory.\n""---------------------------------------------------------------\n";std::cout << e.what() << std::endl;return -1;}
}
const char* Decoder(const char* imgpath)
{if (!imgpath){return "";}cv::Mat img = cv::imread(imgpath);if (!img.data){return "";}if (!detector){if (Init() < 0){return "";}}std::vector<cv::Mat> points;auto res = detector->detectAndDecode(img, points);if (res.size() > 0){memset(decoder_result, 0, 256);memcpy(decoder_result, res[0].c_str(), res[0].length());return decoder_result;}else{return "";}
}

示例代码只封装了一个接口Decoder,且只返回第一个二维码的识别结果,如果需要其他接口或者返回值如二维码区域等可以自己封装。

第二步:配置OpenCV环境

1,项目–属性—配置属性–VC++目录—包含目录,填入已经编译好的OpenCV头文件位置

D:\opencv-4.5.2-contrib\opencv\newbuild\install_src\include
D:\opencv-4.5.2-contrib\opencv\newbuild\install_src\include\opencv2

2,项目–属性—配置属性–VC++目录—库目录,填入已经编译好的opencv_world452d.lib文件位置

D:\opencv-4.5.2-contrib\opencv\newbuild\install_src\x64\vc16\lib



4,拷贝模型文件
模型文件是CNN神经网络对二维码定位用的,拷贝到代码能找到的位置即可。

第三步:将C++代码编译成dll

1,项目–属性—配置属性–常规—配置类型—动态库(.dll)
,2,项目–属性–配置属性–C/C++–高级—编译为—编译为C++代码(/TP)

3,生成

三、使用Dotnet验证

1,创建C#控制台应用程序:

using System;
using System.Runtime.InteropServices;namespace ZrdDecoderDemo
{class Program{[DllImport("ZrdDecoder.dll", CallingConvention = CallingConvention.Cdecl)]extern static IntPtr Decoder(IntPtr path);static void Main(string[] args){try{IntPtr imgpath = Marshal.StringToHGlobalAnsi("images\\2021-12-18-19-02-37-cap.jpg");IntPtr result = Decoder(imgpath);string strResult = Marshal.PtrToStringAnsi(result);Console.WriteLine("二维码识别结果:" + strResult);}catch (Exception ex){Console.WriteLine($"ex:{ex}");}Console.ReadLine();}}
}

2,拷贝需要的库和模型

images:待测试的二维码图片,可以任意位置,代码能找到就行
models:上述四个模型文件,需要ZrdDecoder.dll能找到
opencv_wrold452d.dll:opencv和opencv_contrib的debug库
ZrdDecoder.dll:C++生成的库

结果如下:


总结

文章配置均为debug环境,示例代码简洁为主
参考文章:https://blog.csdn.net/yumkk/article/details/106746882

win10下编译OpenCV的微信二维码库给Dotnet使用相关推荐

  1. Opencv之微信二维码检测与解析

    简介 微信二维码检测器是由微信计算机视觉团队(WeChatCV)提供的一个高性能.轻量级的二维码检测与解码库.它已广泛应用于腾讯的各种应用,包括微信.微信.QQ.QQ浏览器等.微信二维码检测仪有四个主 ...

  2. opencv微信二维码引擎的使用(for java)

    前面讲了windows系统下opencv+opencv的编译方法,编译方法和编译好的文件如下: Windows下联合编译opencv+opencv_contrib微信二维码引擎 OpenCV4.5.2 ...

  3. 使用 OpenCV + 微信二维码引擎实现二维码识别

    Part1背景 今年自疫情以来,我都没有写过文章.一方面是疫情导致居家办公比较烦躁,另一方面最近有点懒了.但是工作还是要继续,趁这几天优化了一下最近的项目,我整理了一下如何使用 OpenCV 和微信二 ...

  4. 微信分享朋友圈链接怎么显示图片-企业微信二维码转成名片

    一.背景 在移动端业务开发的中,很多时候会进行h5页面的分享操作,但是原生的微信分享效果并不能满足我们业务的需求,如下图: 企业微信二维码转成名片 我们可以看的原生的分享描述是一个页面链接,分享图标也 ...

  5. CameraX 下使用 OpenCV 微信二维码识别

    前言 前面,我们已经介绍了两种集成 wechat_qrcode 微信二维码识别能力的做法: 完整编译 OpenCV 和 OpenCV Contrib Native C++ 单独集成 wechat_qr ...

  6. win10 vs2022 .net6 opencvsharp 4.5.5自己编译wecharts 微信二维码扫描模块。

    文章主要介绍如何自己编译opencvsharp源码,因为需要.net 6 ,所以介绍vs2022 的编译. https://github.com/shimat/opencvsharp 首先在githu ...

  7. Opencv4.5.1 微信二维码识别功能 QRCode 编译与使用 C++

    日常生活中手机摄像头最常用的功能可能就是扫码了,而且大部分使用微信扫码,微信扫码的功能的确很强大,精度高.速度快.微信扫码近来加入了opencv开源项目了.现特地进行了尝试,并记录了整个过程,以上动图 ...

  8. 重磅!微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力

    点击上方"CVer",选择加"星标"置顶 重磅干货,第一时间送达 本文转载自:OpenCV团队 2011年12月微信3.5版本正式上线"扫一扫&quo ...

  9. 全网首发微信二维码引擎Android平台移植

    2011年12月微信3.5版本正式上线"扫一扫"二维码,历经9年蜕变,"扫一扫"从二维码名片到扫码支付.从小程序码到健康码,二维码已经成为一种生活方式,连接着数 ...

最新文章

  1. qconshanghai2014
  2. Spring学习总结——Spring实现AOP的多种方式
  3. LINUX服务器出网带宽 一直被占用原因查找
  4. 美国体验圣帕特里克节(St.Patrick's Day)
  5. python处理netcdf_在python中高效读取netcdf变量
  6. union与struct的区别
  7. 老式Windows桌面的终结:Windows 11来了,DaaS还会远吗?
  8. libsvm3.22——在matlab(32位和64位)中的安装
  9. Nginx 凭啥并发数可以达到 3w?
  10. ext3与ext4主要区别
  11. Linux 编译安装 openssl库
  12. Express Session的使用
  13. 2016用户体验行业调查报告
  14. Python+Django+LeanCloud+腾讯云函数学习记录(第一周学习记录)
  15. 时光机特效在哪里?推荐这三个实用软件给你
  16. html5单位转换器,液体单位在线换算工具
  17. 二分法求三次方根代码
  18. python-collections
  19. h61 nvme硬盘_一盒在手,说走就走-ORICO M.2双盘位移动硬盘盒评测
  20. 简述相关与回归分析的关系_浅谈相关分析与回归分析的关系

热门文章

  1. php notice 影响,PHP notice/warning 对性能的影响
  2. Java Web --HTML(尚硅谷2022版Javaweb)
  3. 比较两组数据的差异用什么图更直观_科研数据可视化:巧妙运用各种形式的图表...
  4. 刷题-洛谷-P1179 数字统计
  5. 基于java+SpringBoot+HTML+MySQL精准扶贫网站的设计与实现
  6. UE4 C++ 动态读取图片
  7. Ubuntu安装播放器 或 Linux上比较好用强大、并且可以倍速播放的播放器SMplayer
  8. 第7章第31节:四图排版:四张图片两两一组并行排列 [PowerPoint精美幻灯片实战教程]
  9. 定制ToolChain for ARM
  10. 马蹄疾 | 详解 JavaScript 异步机制及发展历程(万字长文)