导读
本文将一步步教您如何使用OpenCV实现基于一个标记的简单AR
作者开发环境:
Windows 10 (64bit)
Visual Studio 2015
OpenCV 3.2.0
源代码
您可以在此处获取源代码工程 去Github
使用的标记:
您可以打印下来,一张纸上打印多个便识别多个
Step 1 开始
在IDE中创建C++工程,并添加好OpenCV的相关环境配置,添加一个源文件,例如命名为SimpleAR.cpp
添加 include 并 使用命名空间
#include<opencv2\opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;
Step 2 类介绍
class MarkerBasedARProcessor
{
Mat Image, ImageGray, ImageAdaptiveBinary; //分别是 原图像 灰度图像 自适应阈值化图像
vector<vector<Point>> ImageContours; //图像所有边界信息
vector<vector<Point2f>> ImageQuads, ImageMarkers; //图像所有四边形 与 验证成功的四边形
vector<Point2f> FlatMarkerCorners; //正方形化标记时用到的信息
Size FlatMarkerSize; //正方形化标记时用到的信息
//7x7黑白标记的颜色信息
uchar CorrectMarker[7 * 7] =
{
0,0,0,0,0,0,0,
0,0,0,0,0,255,0,
0,0,255,255,255,0,0,
0,255,255,255,0,255,0,
0,255,255,255,0,255,0,
0,255,255,255,0,255,0,
0,0,0,0,0,0,0
};
void Clean(); // 用于新一帧处理前的初始化
void ConvertColor(); //转换图片颜色
void GetContours(int ContourCountThreshold); //获取图片所有边界
void FindQuads(int ContourLengthThreshold); //寻找所有四边形
void TransformVerifyQuads(); //变换为正方形并验证是否为标记
void DrawMarkerBorder(Scalar Color); //绘制标记边界
void DrawImageAboveMarker(); //在标记上绘图
bool MatchQuadWithMarker(Mat & Quad); // 检验正方形是否为标记
float CalculatePerimeter(const vector<Point2f> &Points); // 计算周长
public:
Mat ImageToDraw;// 要在标记上绘制的图像
MarkerBasedARProcessor();// 构造函数
Mat Process(Mat& Image);// 处理一帧图像
};
Step 3 主体流程
首先我们来看main()函数
int main()
{