IDE:visual studio 2013
使用库:Eigen opencv2.4.9
文档版本:1.0
解PnP问题时,用二维码的好处
- 二维码由黑白两色组成,容易通过对图像阈值处理而发现
- 二维码具有方向性(只要设计的不为中心对称),可以更好的辅助求解位姿
- 二维码具有可识别性,即可解析二维码内部黑白块的排列顺序,从而确定该二维码是否为我们所要用的二维码
二维码识别的流程
该流程以该二维码为例
- 阈值处理,二值化操作
- 去掉二维码周围一圈,即保存为5*5的信息
- 计算5*5图像内的海明距离,和程序所设定要查找的二维码的海明距离作比较
- 若该二维码即为程序所要查找的二维码,则用opencv自带的findContours查找角点
代码
#include "Marker.h"
/************************************************构造函数****************************************************/
Marker::Marker(): id(-1)
{
}
/************************************************析构函数****************************************************/
Marker::~Marker()
{
}
/*******************************************读取二维码内含信息**********************************************/
int Marker::getMarkerId(cv::Mat &markerImage, int &nRotations)
{
assert(markerImage.rows == markerImage.cols);
assert(markerImage.type() == CV_8UC1);
cv::Mat grey = markerImage;
//threshold image
cv::threshold(grey, grey, 125, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
//Markers are divided in 7x7 regions, of which the inner 5x5 belongs to marker info
//the external border should be entirely black
//去掉周围的一圈黑色,提取出5x5的网格
int cellSize = markerImage.rows / 7;
for (int y = 0; y<7; ++y)
{
int inc = 6;
//for first and last row, check the whole border
if (