二維碼生成原理沒有精力去研究,發現有可以用的輪子,就不重複造輪子了,站在巨人的肩膀上做事。參考了一大堆博客,忘記了他們的鏈接,沒有能補上,抱歉。
需要用到的庫:
1、opencv
2、qrencode,已經編譯好了,下載:鏈接: https://pan.baidu.com/s/1_eUhkdEGvs9XiVNyy52DzA 提取碼: w1xi
裏面好像也有opencv編譯好的庫,沒有就發郵件給我:[email protected]
步驟:
1、直接調用:QRcode_encodeString,傳入參數
QRcode * code = QRcode_encodeString(src.c_str(), 0, QR_ECLEVEL_H, QR_MODE_8, 1);
2、返回的數據用opencv生成圖片,qrencode可以生成png圖片,但是需要配置zlib,麻煩,直接opencv生成
for (int i = 0; i < code->width; ++i) {
for (int j = 0; j < code->width; ++j)
{
img.at<uchar>(i, j) = (code->data[i*code->width + j] & 0x01) == 0x01 ? 0 : 255;
}
}
3、縮放生成的二維碼,因爲生成的比較小,需要放大,最後那個參數,選錯了會很模糊
cv::resize(img, img, cv::Size(img.rows * 10, img.cols * 10),0,0, cv::INTER_NEAREST);
4、加白邊框,其實就是放到一張比它大的圖片上
//白底
result = 255 - result;
//轉換成彩色
cv::cvtColor(result, result, cv::COLOR_GRAY2BGR);
cv::cvtColor(img, img, cv::COLOR_GRAY2BGR);
//建立roi
cv::Rect roi_rect = cv::Rect((result.rows - img.rows) / 2, (result.cols - img.rows) / 2, img.cols, img.rows);
//roi關聯到目標圖像,並把源圖像複製到指定roi
img.copyTo(result(roi_rect));
5、加logo,其它就是貼到它中心,因爲選擇生成的規格是高容錯率的,所以加人小logo對掃碼沒有影響。
roi_rect = cv::Rect(result.cols/ 2- logo.cols/2, result.rows/2 - logo.rows / 2, logo.cols, logo.rows);
logo.copyTo(result(roi_rect));
#include <qrencode.h>
#include <iostream>
int main()
{
cv::Mat logo = cv::imread("C:/Users/Administrator/source/repos/zbarcode/mini.png", cv::IMREAD_ANYCOLOR);
if (logo.empty())
{
std::cout << "logo empty!\n";
system("pause");
return -1;
}
std::string src = "welcome to china,bbbbbbbbbbb";
// 使用qrencode進行字符串編碼
QRcode * code = QRcode_encodeString(src.c_str(), 0, QR_ECLEVEL_H, QR_MODE_8, 1);
if (code == NULL) {
std::cout << "code = NULL" << std::endl;
return -1;
}
cv::Mat img = cv::Mat(code->width, code->width, CV_8U);
for (int i = 0; i < code->width; ++i) {
for (int j = 0; j < code->width; ++j)
{
img.at<uchar>(i, j) = (code->data[i*code->width + j] & 0x01) == 0x01 ? 0 : 255;
}
}
cv::resize(img, img, cv::Size(img.rows * 10, img.cols * 10),0,0, cv::INTER_NEAREST);
cv::Mat result = cv::Mat::zeros(img.rows + 30, img.cols + 30, CV_8U);
//白底
result = 255 - result;
//轉換成彩色
cv::cvtColor(result, result, cv::COLOR_GRAY2BGR);
cv::cvtColor(img, img, cv::COLOR_GRAY2BGR);
//建立roi
cv::Rect roi_rect = cv::Rect((result.rows - img.rows) / 2, (result.cols - img.rows) / 2, img.cols, img.rows);
//roi關聯到目標圖像,並把源圖像複製到指定roi
img.copyTo(result(roi_rect));
roi_rect = cv::Rect(result.cols/ 2- logo.cols/2, result.rows/2 - logo.rows / 2, logo.cols, logo.rows);
logo.copyTo(result(roi_rect));
cv::imshow("code", result);
cv::waitKey(0);
system("pause");
return 0;
}
生成的二維碼