将OpenCV_contrib中的wechat_qrcode模块修改成一个即插即用的模块



最终代码可以在我的github上找到

出发点

微信向OpenCV_contrib开源的模块wechat_qrcode放在了OpenCV4.5以上的版本,而很多旧的代码用的都是OpenCV3,迁移起来很麻烦,因此就想着能不能把这个模块单独拿出来编译使用

1. 编译OpenCVOpenCV_contrib

根据官网教程,手动编译OpenCVOpenCV_contrib,这里我编译的版本是3.4.8

2. 下载wechat_qrcode模块源码

OpenCV_contrib官网下载源码,选一个版本高一点的,比如4.8.1,版本不限,只要包含wechat_qrcode这个模块就可以了。下载完后解压。

3. 复制wechat_qrcode模块源码

进入到解压后的opencv_contrib-4.8.1/modules文件夹,将wechat_qrcode这个文件夹复制一份
在这里插入图片描述

4. 修改CMakeLists.txt,使其成为一个即插即用的模块

新建一个工程文件夹

文件结构如下

.
├── build
├── CMakeLists.txt
├── main.cpp
└── wechat_qrcode
    ├── CMakeLists.txt
    ├── include
    ├── LICENSE
    ├── model   # 用来存放CNN模型的文件夹
    ├── perf
    ├── README.md
    ├── samples
    ├── src
    └── test

其中

  • main.cpp是主文件,在里面使用wechat_qrcode的功能
  • wechat_qrcode就是上一节复制的文件夹,将其复制到这里

下载wechat_qrcode所需的CNN模型

下载地址,并复制到 wechat_qrcode/model文件夹里面

修改第一层级的CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(wechat_qrcode VERSION 0.1.0 LANGUAGES C CXX)

set(OpenCV_DIR "/home/lyxichigoichie/3rdparty/opencv3/build")  #directory of OpenCVConfig.cmake, the folder where you build opencv
find_package(OpenCV REQUIRED QUIET)
# message(${OpenCV_LIBS})

add_subdirectory(wechat_qrcode)

# include directories
include_directories(
	wechat_qrcode/include
)

# message(${sourcelist})
add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBS} wechat_qrcode)

修改wechat_qrcode文件夹内的CMakeLists.txt

见注释

# 指定OpenCV的搜索路径
set(OpenCV_DIR "/home/username/3rdparty/opencv3/build")  #directory of OpenCVConfig.cmake, the folder where you build opencv
find_package(OpenCV REQUIRED QUIET)   # 搜索OpenCV
# message(${OpenCV_LIBS})

# include directories
include_directories(
	include
    ${OpenCV_INCLUDE_DIRS}
)

# link directories
link_directories(
	include
    ${OpenCV_LIBRARY_DIRS}
)

file(GLOB_RECURSE sourcelist src/*.cpp)   # 递归地查找出该文件夹下所有的cpp文件,见https://www.cnblogs.com/yongdaimi/p/14689417.html
# message(${sourcelist})

add_library(wechat_qrcode SHARED ${sourcelist})
target_link_libraries(wechat_qrcode ${OpenCV_LIBS})

上面做的事其实就是将这个模块里的所有源文件编译成一个动态库

add_library(wechat_qrcode SHARED 
			src/wechat_qrcode.cpp
			src/imgsource.cpp
			# ......剩余的cpp文件
			)

这样,每次使用这个模块的时候只需要把wechat_qrcode文件夹拷贝到工程目录下,然后再在第一层级的CMakeLists.txt中添加subdirectory即可

main.cpp

参考链接,需要修改里面的几个路径

  • modelDir: 存放wechat_qrcode所需的CNN模型的路径,建议使用绝对路径
  • img = imread("/home/lyxichigoichie/Pictures/qrcode.png");: 二维码路径
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

using namespace std;
using namespace cv;

#include <opencv2/wechat_qrcode.hpp>
int main() 
{
	const std::string modelDir = "/home/lyxichigoichie/3rdparty/opencv4.8.1/build/downloads/wechat_qrcode/";
	 
	// 构造(使用异常捕获构造函数是否正常)
	wechat_qrcode::WeChatQRCode detector{
        modelDir + "detect.prototxt", 
        modelDir + "detect.caffemodel",
        modelDir + "sr.prototxt",     
        modelDir + "sr.caffemodel"
    };
    
    // 临时变量
    Mat img;
	vector<Mat> points;   // qrcode: Retangle, not RotatedBox
	
    // auto camIdx = 0; 
    img = imread("/home/lyxichigoichie/Pictures/qrcode.png");

	// 检测
	auto res = detector.detectAndDecode(img, points); 
	// 结果叠加
	for(size_t idx = 0; idx < res.size(); idx ++){
		Point pt1 = points[idx].at<Point2f>(0);
		Point pt2 = points[idx].at<Point2f>(2);
		Rect rect{pt1, pt2};
		Point center = (pt1 + pt2) / 2;
		// 绘制矩形框
		rectangle(img, rect, {0,0,255}, 2);
		circle(img, center, rect.height / 15, {0,0,255}, -1);
		// 解码字符串
		putText(img, res[idx], {pt1.x, pt2.y + 16}, 1, 1, {0,0,255});    
	}

	imshow("image", img);
	waitKey();
}

编译运行即可

  • 30
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
微信二维码是一种常用的二维码形式,用于快速扫描获取相关信息。Linux是一种开源的操作系统,拥有广泛的用户群体和开发者社区。OpenCV_contribOpenCV一个开源扩展库,提供了更多的功能和算法。 在Linux操作系统上,可以使用OpenCV_contrib提供的功能来实现微信二维码的识别和解码。通过OpenCV_contrib,我们可以直接调用特定的函数和方法,利用OpenCV强大的图像处理和计算机视觉功能来解码和分析二维码。 为了在Linux上使用OpenCV_contrib,我们首先需要在我们的系统上安装OpenCVOpenCV_contrib扩展库。我们可以从官方网站上下载源代码,然后进行编译安装。一旦安装完,我们就可以使用OpenCV_contrib提供的微信二维码识别功能了。 使用OpenCV_contrib进行微信二维码识别的过程大致如下:首先,我们需要获取一张包含微信二维码的图像。然后,我们将图像传递给OpenCV_contrib提供的特定函数,该函数将处理图像并尝试从解码出二维码信息。最后,我们可以从函数的返回值获取解码后的信息。 使用OpenCV_contrib进行微信二维码识别的过程需要一定的编程知识和经验。我们需要了解OpenCV的基本用法和函数调用方式,了解如何处理图像和二维码数据。另外,我们还可以根据实际需求自定义一些功能,如二维码定位、纠错等。 总之,通过在Linux操作系统上使用OpenCV_contrib,我们可以方便地实现微信二维码的识别和解码功能,为用户提供更好的使用体验和便利性。同时,开源和开放的特性也使得OpenCV_contrib可以吸引更多的开发者参与,共同推动算法和功能的发展和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值