/** * 检测图片集合中是否存在二维码 * @param mats * @return */ vector<Mat> PublicCardFrameDetection::checkisqrcode(vector<Mat> mats) { cout << "检测图片是否为二维码" << endl; vector<Mat> matlist; vector<Mat> mcard; for (auto ic = mats.begin(); ic != mats.end(); ic++) { auto mt = *ic; Mat threshold_output = preparateQrcode(mt); //容器声明 vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(threshold_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE); QRCodeScanner qrcode; vector<vector<Point>> found_contours = qrcode.getfinalcontours(mt,contours,hierarchy); vector<Point> final; if (found_contours.size() >= 3) { vector<int> indexs(4, -1); qrcode.check_center(found_contours, indexs); //获取最终的点集 for (int i = 0; i < 4; i++) { RotatedRect part_rect = minAreaRect(found_contours[indexs[i]]); Point2f p[4]; //分别将三个矩形Rect的坐标存入数组p part_rect.points(p); for (int j = 0; j < 4; j++) { final.push_back(p[j]); } //根据三个矩形坐标数组构成的点集,拟合最小矩形,获取三个矩形mat vector<Point> pts1{p[0], p[1], p[2], p[3]}; Rect rt = boundingRect(pts1); Mat mmt = mt(rt); // imshow("mmt",mmt); // waitKey(); matlist.emplace_back(mmt); // remove.emplace_back(mt); } } //判断是否为二维码 if (isqrcode(matlist)) { if (ic != mats.begin()){ mats.erase(ic,mats.end()); } else { mats.erase(ic); } break; } } return mats; }
/** * 判断是否为二维码 * @param matlist * @return 返回flag标志位 */ bool PublicCardFrameDetection::isqrcode(vector<Mat> matlist){ //设置flag标志位 bool flag = false; for (auto itx = matlist.begin(); itx != matlist.end(); itx++){ Mat mt = *itx; Mat canny; Canny(mt,canny,128,256,3); Mat dila; Mat element = getStructuringElement(MORPH_RECT, Size(3, 3)); dilate(canny, dila, element); vector<vector<Point>> rcontours; vector<Vec4i> rhierarchy; findContours(dila,rcontours,rhierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE); int childnum = 0; //分别遍历三个定位矩形的轮廓层级,若包含子轮廓数量>=1,且满足长宽比例关系则认为是二维码,则标志flag=true for (int i = 0; i < rhierarchy.size(); i++) { childnum = rhierarchy[i][2]; Rect pt = boundingRect(rcontours[i]); //限制查找最大轮廓,无父级轮廓 if (childnum >= 1 && rhierarchy[i][3] == -1) { if (0.75*Max(pt.size().width,pt.size().height) < Min(pt.size().width,pt.size().height)) { cout << i << "++rhiearchy===>" << rhierarchy[i] << endl; drawContours(mt, rcontours, i, Scalar(255, 0, 0), 1); imshow("drawcontours", mt); waitKey(); flag = true; } } } if (flag) break; } return flag; }