日常生活中手机摄像头最常用的功能可能就是扫码了,而且大部分使用微信扫码,微信扫码的功能的确很强大,精度高、速度快。微信扫码近来加入了opencv开源项目了。现特地进行了尝试,并记录了整个过程,以上动图就是实际效果。可以看出在不同距离、视角、光线环境下都表现优异,普通笔记本电脑release模式下能够达到在70FPS左右。
以下则是记录步骤。
wechat_qrcode包含在opencv_contrib中,因此,需要将该部分联合进行编译。
https://github.com/opencv
在cmake中添加源码编译路径和生成路径,第一次点击configure。
第一次configure后,找到OPENCV_EXTRA_MODULES_PATH,将contrib路径添加进来,注意要具体到modules/,继续configure。
如果没有产生错误,则,点击Generate。
稍等,完成后,点击Open Project,或build文件夹下打开.sln。
1)VS中,先选择编译目标模式,再选中ALL_BUILD,生成。
如果发生错误,则需要查看具体错误原因,进行修改。
2)再仅生成INSTALL。
则,在生成的install文件夹下生成以下项目。
1)在VS中新建微信二维码识别工程
2)将上个步骤的include路径和.lib配置到项目属性中,
3)添加代码,如下
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
//加载图片解码
Ptr detector;
string detect_prototxt = "C:/D/opencv451/WeChat_lib/detect.prototxt";
string detect_caffe_model = "C:/D/opencv451/WeChat_lib/detect.caffemodel";
string sr_prototxt = "C:/D/opencv451/WeChat_lib/sr.prototxt";
string sr_caffe_model = "C:/D/opencv451/WeChat_lib/sr.caffemodel";
try
{
detector = makePtr(detect_prototxt, detect_caffe_model,
sr_prototxt, sr_caffe_model);
}
catch (const std::exception & e)
{
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";
cout << e.what() << endl;
return 0;
}
vector vPoints;
vector strDecoded;
VideoCapture capture;
capture.open(0, CAP_DSHOW);
if (!capture.isOpened())
{
cout << "can't open camera" << endl;
exit(-1);
}
Mat img;
while (capture.read(img))
{
double start = getTickCount();
strDecoded = detector->detectAndDecode(img, vPoints);
for (int i = 0; i < strDecoded.size(); i++)
{
cout << "decode-" << i + 1 << ": " << strDecoded[i] << endl;
Point pt1 = Point((int)vPoints[i].at(0, 0), (int)vPoints[i].at(0, 1));
Point pt2 = Point((int)vPoints[i].at(1, 0), (int)vPoints[i].at(1, 1));
Point pt3 = Point((int)vPoints[i].at(2, 0), (int)vPoints[i].at(2, 1));
Point pt4 = Point((int)vPoints[i].at(3, 0), (int)vPoints[i].at(3, 1));
line(img, pt1, pt2, Scalar(0, 255, 0), 2);
line(img, pt2, pt3, Scalar(0, 255, 0), 2);
line(img, pt3, pt4, Scalar(0, 255, 0), 2);
line(img, pt4, pt1, Scalar(0, 255, 0), 2);
putText(img, strDecoded[i], pt1, 0, 0.5, Scalar(255, 0, 0), 2);
}
double end = getTickCount();
double run_time = (end - start) / getTickFrequency();
double fps = 1 / run_time;
putText(img, format("FPS: %0.2f", fps), Point(20, 20), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255), 1, 8);
imshow("wechat_qrcode", img);
char ch = waitKey(1);
if (ch == 27)break;
}
waitKey();
return 0;
}
4)视频效果如前文
注:部分参考: https://mp.weixin.qq.com/s/2GZAJAUPHTXFOKDRv-D21Q