1. 简述
今天重新编译了最新的OpenCV4.0,发现里面多了很多机器学习相关的内容,后面做相关开发更加方便了。看到了跨度QR二维码也刚发布,这个功能同自己平时开发非常近,就测了一下官方的demo
2. 测试
测试代码是官方的live_detect_qrcode.cpp, 代码如下:
//测试二维码功能
void CameraCalibration::QRCodeDetect(Mat &input, string & decoded_info)
{
Mat gray_input;
cv::cvtColor(input, gray_input, cv::COLOR_RGB2GRAY);
Mat straight_barcode;
vector<Point> transform;
bool result_detection = false;
QRCodeDetector qrcode;
transform.clear();
//检测二维码
result_detection = qrcode.detect(gray_input, transform);
if (!result_detection) { return; }
else
{
DrawQRCodeContour(input,transform);
//解析二维码中的信息
decoded_info = qrcode.decode(gray_input, transform, straight_barcode);
if (decoded_info.empty()) { return; }
if (decoded_info.empty()) { std::cout << "QR code cannot be decoded\n"; decoded_info = "null";}
}
}
//画出带二维码的区域
void CameraCalibration::DrawQRCodeContour(Mat &color_image, vector<Point> transform)
{
if (!transform.empty())
{
double show_radius = (color_image.rows > color_image.cols)
? (2.813 * color_image.rows) / color_image.cols
: (2.813 * color_image.cols) / color_image.rows;
double contour_radius = show_radius * 0.4;
vector< vector<Point> > contours;
contours.push_back(transform);
drawContours(color_image, contours, 0, Scalar(211, 0, 148), cvRound(contour_radius));
RNG rng(1000);
for (size_t i = 0; i < 4; i++)
{
Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0, 255), rng.uniform(0, 255));
circle(color_image, transform[i], cvRound(show_radius), color, -1);
}
}
}
这里我简化了一下官方的代码,直接运行。 下面是运行的效果:
识别效果还可以,但是作为alpha版本,这个功能还有bug,识别一会儿之后,decode函数会莫名其妙的崩掉,测试了官方的demo也存在类似的问题。尝试了将图片进行缩小等动作均无效。。。无奈只能在github上提bug了。
要连续动态的使用这个功能,还有很多问题,但是单独一张已经有的图片检测,crash的几率会小很多。 另外,crash都是decode引起的,寻找二维码边框以及范围,还是没有问题的,decode可以使用自己的代码来实现,bug会少些。