vector< pair<int, int> > tooNearCandidates; //移除那些角点互相离的太近的四边形?? ?? ?? //移除角点太接近的元素????
for (int i = 0;i < detector.size();i++) //选择排序法
{
for (int j = i + 1;j < detector.size();j++)
{
float distSquared = 0;
for (int c = 0;c < 4;c++)
{
Point v = detector[i][c] - detector[j][c]; //四个顶点一一对应相减
distSquared += v.dot(v); //向量点乘,求距离
}
distSquared /= 4;
if (distSquared < 100) //
{
tooNearCandidates.push_back(pair<int, int>(i, j));
}
}
}
vector<bool> removalMask(detector.size(), false);
for (int i = 0;i < tooNearCandidates.size();i++)
{
float p1 = perimeter(detector[tooNearCandidates[i].first]);
float p2 = perimeter(detector[tooNearCandidates[i].second]);
//谁周长小 移除谁
int removalIndex;
if (p1 > p2)
{
removalIndex = tooNearCandidates[i].second;
}
else
{
removalIndex = tooNearCandidates[i].first;
}
removalMask[removalIndex] = true;
//cout << removalIndex;
}
markDetector.clear();
for (int i = 0;i < detector.size();i++)
{
if (!removalMask[i])
{
markDetector.push_back(detector[i]);
}
}
cout << markDetector.size() << endl;
vector<RotatedRect>rotateRects;
for (int i = 0;i < markDetector.size();i++)
{
RotatedRect r = minAreaRect(Mat(markDetector[i]));
Point2f ver[4];
r.points(ver);
for (int k = 0;k < 4;k++)
{
line(g_src, ver[k], ver[(k + 1) % 4], Scalar(0, 0, 255), 2, 8, 0);
//cout << "第" << k + 1 << "个点坐标为" << vertices[i] << endl;
}
rotateRects.push_back(r);
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-78133-2.html
况且国内形式也需要一场外部战争来提高国民的凝聚力
期待