由于项目需要,我之前做了一个基于圆形图案的标记识别,其目的是实现单目相机对标记物的识别和定位。标记如下所示:

这个东西有四个圆形组成,打印出来后,测量其尺寸,就可以通过识别其图像位置,再使用P4P解算,就可以得到该平面相对于相机的三维方向和倾角。
首先是识别:
ima = ardrone.getImage();
SimpleBlobDetector::Params params;
params.minThreshold = 40;
params.maxThreshold = 160;
params.thresholdStep = 5;
params.minArea = 100;
params.minConvexity = 0.7f;
params.minInertiaRatio = 0.8f;
params.maxArea = 8000;
params.filterByCircularity = true;
params.minCircularity = 0.5;
params.maxCircularity = 1.5;
params.maxInertiaRatio = 1;
params.maxConvexity = 1;
cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params);
cvtColor(ima, gray, CV_BGR2GRAY); // smooth it, otherwise a lot of false circles may be detected
//normalize(gray, gray, 0, 255, 32);
//cout << gray.rows <<' '<<gray.cols<< endl;
std::vector<KeyPoint> keypoints;
if (keypoints.size() != pointnum)continue;
int fail = 0;
for (int i = 1; i < pointnum; i++)
{
if (abs(keypoints[0].size - keypoints[i].size) / keypoints[0].size > 0.3)fail = 1;
}
if (fail == 1)continue;
vector<vector<int>>dis;
for (int i = 0; i < pointnum; i++)
{
vector<int> temp;
for (int j = 0; j < pointnum; j++)
{

最低0.47元/天 解锁文章
5959





