Reconocimiento de código QR usando el motor de código QR de OpenCV + WeChat

antecedentes

Desde la epidemia de este año, no he escrito un artículo. Por un lado, la epidemia ha hecho que trabajar desde casa sea más irritable y, por otro lado, he estado un poco perezoso últimamente. Pero el trabajo aún tiene que continuar Aprovechando estos pocos días para optimizar el proyecto reciente, resolví cómo usar el motor de código QR de OpenCV y WeChat para realizar el reconocimiento de código QR.

WeChat ha abierto su función de decodificación de código QR y ha contribuido a la comunidad OpenCV. Su proyecto de código abierto wechat_qrcode está incluido en el proyecto de contribución de OpenCV. Desde la versión OpenCV 4.5.2, se puede usar directamente.

La dirección de github del proyecto: github.com/opencv/open…

La dirección del archivo modelo: github.com/WeChatCV/op…

El motor de escaneo de códigos de WeChat ha admitido durante mucho tiempo funciones como la detección de códigos QR de larga distancia, el posicionamiento de enfoque automático y la detección y el reconocimiento de múltiples códigos. Se basa en la detección de códigos QR basada en CNN.

Detector de código QR basado en CNN

Paquete de identificación de código QR

Primero, defina 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();
};
复制代码

El archivo de encabezado define algunos métodos, incluidos métodos para cargar modelos, identificar códigos QR, liberar recursos y un objeto detector para identificar códigos QR.

Luego escriba el archivo fuente correspondiente 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;
}
复制代码

en:

  • El método initModel() se usa para cargar el archivo del modelo de algoritmo y debe llamarse primero, y solo necesita llamarse una vez.

archivo modelo

  • El método detectQRCode() necesita hacer mucho preprocesamiento en la imagen de acuerdo con el escenario comercial y luego reconocer el código QR. Estos procesos de preprocesamiento ya no están dentro del alcance de este artículo y tendré la oportunidad de escribir un artículo separado en el futuro.
  • El método de compresión () se usa para comprimir imágenes. Debido a que filmamos con cámaras industriales, las imágenes serán de aproximadamente 30M+, por lo que se comprimirán antes de usarlas.
  • El método release() puede liberar el objeto detector al final del programa.

Identificar el código QR es en realidad llamar al método detectAndDecode() del objeto detector.

Finalmente, escribe una función main() para probar si está disponible:

20220216851652_comprimir

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;
}
复制代码

Ejecute el resultado para identificar el contenido del código QR:

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

En este punto, la encapsulación del reconocimiento de código QR se completa básicamente y el paquete de algoritmo correspondiente se puede compilar para la plataforma superior.

En última instancia, necesitamos usar Java/Kotlin para llamar al programa cv en la plataforma Windows. Porque este proyecto es un programa de computadora host de un dispositivo inteligente. Por lo tanto, es necesario escribir un programa jni para que Java/Kotlin lo llame, y este proceso no se elaborará.

Finalmente, el programa cv y el código relacionado con jni finalmente se compilan en un archivo dll, que es llamado por el programa de la computadora host para lograr la demanda final.

Resumir

De hecho, el código anterior se puede usar en varias plataformas, ya sea móvil, de escritorio o servidor. WeChat abrió un motor de código QR muy rápido, lo que nos ahorró mucho trabajo.

Supongo que te gusta

Origin juejin.im/post/7079313321446506532
Recomendado
Clasificación