Reconnaissance de code QR à l'aide du moteur de code QR OpenCV + WeChat

Contexte

Depuis l'épidémie de cette année, je n'ai pas écrit d'article. D'une part, l'épidémie a rendu le travail à domicile plus irritable, et d'autre part, j'ai été un peu paresseux ces derniers temps. Mais le travail doit encore continuer. Profitant de ces quelques jours pour optimiser le projet récent, j'ai trié comment utiliser OpenCV et le moteur de code QR WeChat pour réaliser la reconnaissance de code QR.

WeChat a ouvert sa fonction de décodage de code QR et a contribué à la communauté OpenCV. Son projet open source wechat_qrcode est inclus dans le projet OpenCV contrib. Depuis la version OpenCV 4.5.2, il peut être utilisé directement.

L'adresse github du projet : github.com/opencv/open…

L'adresse du fichier modèle : github.com/WeChatCV/op…

Le moteur d'analyse de code de WeChat prend en charge depuis longtemps des fonctions telles que la détection de code QR longue distance, le positionnement automatique de la mise au point et la détection et la reconnaissance de plusieurs codes. Il est basé sur la détection de code QR basée sur CNN.

Détecteur de code QR basé sur CNN

Forfait d'identification par code QR

Tout d'abord, définissez un AlgoQrCode.h

#pragma once
#include <opencv2/opencv.hpp>
#include <opencv2/wechat_qrcode.hpp>
using namespace cv;
using namespace std;

class AlgoQRCode
{
private:
	Ptr<wechat_qrcode::WeChatQRCode> detector;

public:
	bool initModel(string modelPath);

	string detectQRCode(string strPath);

	bool compression(string inputFileName, string outputFileName, int quality);

	void release();
};
复制代码

Le fichier d'en-tête définit certaines méthodes, notamment les méthodes de chargement des modèles, d'identification des codes QR, de libération des ressources et un objet détecteur pour l'identification des codes QR.

Écrivez ensuite le fichier source correspondant AlgoQrCode.cpp

bool AlgoQRCode::initModel(string modelPath) {
	string detect_prototxt = modelPath + "detect.prototxt";
	string detect_caffe_model = modelPath + "detect.caffemodel";
	string sr_prototxt = modelPath + "sr.prototxt";
	string sr_caffe_model = modelPath + "sr.caffemodel";
	try
	{
		detector = makePtr<wechat_qrcode::WeChatQRCode>(detect_prototxt, detect_caffe_model, sr_prototxt, sr_caffe_model);
	}
	catch (const std::exception& e)
	{
		cout << e.what() << endl;
		return false;
	}

	return true;
}

string AlgoQRCode::detectQRCode(string strPath)
{
	if (detector == NULL) {
		return "-1";
	}

	vector<Mat> vPoints;
	vector<cv::String> vStrDecoded;
	Mat imgInput = imread(strPath, IMREAD_GRAYSCALE);
//	vStrDecoded = detector->detectAndDecode(imgInput, vPoints);
        ....
}

bool AlgoQRCode::compression(string inputFileName, string outputFileName, int quality) {
	Mat srcImage = imread(inputFileName);

	if (srcImage.data != NULL)
	{
		vector<int>compression_params;
		compression_params.push_back(IMWRITE_JPEG_QUALITY);
		compression_params.push_back(quality);     //图像压缩参数,该参数取值范围为0-100,数值越高,图像质量越高

		bool bRet = imwrite(outputFileName, srcImage, compression_params);

		return bRet;
	}

	return false;
}

void AlgoQRCode::release() {
	detector = NULL;
}
复制代码

dans:

  • La méthode initModel() est utilisée pour charger le fichier de modèle d'algorithme et doit être appelée en premier, et n'a besoin d'être appelée qu'une seule fois.

fichier modèle

  • La méthode detectQRCode() doit effectuer de nombreux prétraitements sur l'image en fonction du scénario métier, puis reconnaître le code QR. Ces processus de prétraitement ne sont plus dans le cadre de cet article, et j'aurai l'occasion d'écrire un article séparé à l'avenir.
  • La méthode compression () est utilisée pour compresser les images. Parce que nous tournons avec des caméras industrielles, les images seront d'environ 30M +, elles seront donc compressées avant utilisation.
  • La méthode release() peut libérer l'objet détecteur à la fin du programme.

L'identification du code QR appelle en fait la méthode detectAndDecode() de l'objet détecteur.

Enfin, écrivez une fonction main() pour tester si elle est disponible :

20220216851652_compress

int main()
{
    AlgoQRCode algoQrCode = AlgoQRCode();
    algoQrCode.initModel("/Users/tony/IdeaProjects/creative-mirror-watcher/mirror/src/main/resources/");
    string value = algoQrCode.detectQRCode("/Users/tony/20220216851652_compress.jpeg");
    cout<<"value="<<value<<endl;
}
复制代码

Exécutez le résultat pour identifier le contenu du QR code :

value={
  "osVersion" : "iOS 13.3",
  "model" : "苹果 iPhone X",
  "ip" : "10.184.17.170",
  "port" : 10123
}
复制代码

À ce stade, l'encapsulation de la reconnaissance du code QR est pratiquement terminée et le package d'algorithme correspondant peut être compilé pour la plate-forme supérieure.

Nous devons finalement utiliser Java/Kotlin pour appeler le programme cv sur la plate-forme Windows. Parce que ce projet est un programme informatique hôte d'un appareil intelligent. Par conséquent, il est nécessaire d'écrire un programme jni pour que Java/Kotlin l'appelle, et ce processus ne sera pas élaboré.

Enfin, le programme cv et le code lié à jni sont finalement compilés dans un fichier dll, qui est appelé par le programme informatique hôte pour répondre à la demande finale.

Résumer

En fait, le code ci-dessus peut être utilisé sur diverses plates-formes, qu'il s'agisse d'un mobile, d'un ordinateur de bureau ou d'un serveur. WeChat a ouvert un moteur de code QR très rapide, ce qui nous a permis d'économiser beaucoup de travail.

Je suppose que tu aimes

Origine juejin.im/post/7079313321446506532
conseillé
Classement