检测出特定轮廓,可进一步对其特征进行描述,从而识别物体。
1. 如下函数,可以将轮廓以多种形式包围起来。
// 轮廓表示为一个矩形
Rect r = boundingRect(Mat(contours[]));
rectangle(result, r, Scalar(), );
// 轮廓表示为一个圆
float radius;
Point2f center;
minEnclosingCircle(Mat(contours[]), center, radius);
circle(result, Point(center), static_cast<int>(radius), Scalar(), );
// 轮廓表示为一个多边形
vector<Point> poly;
approxPolyDP(Mat(contours[]), poly, , true);
vector<Point>::const_iterator itp = poly.begin();
while (itp != (poly.end() - ))
{
line(result, *itp, *(itp + ), Scalar(), );
++itp;
}
line(result, *itp, *(poly.begin()), Scalar(), );
// 轮廓表示为凸多边形
vector<Point> hull;
convexHull(Mat(contours[]), hull);
vector<Point>::const_iterator ith = hull.begin();
while (ith != (hull.end() - ))
{
line(result, *ith, *(ith + ), Scalar(), );
++ith;
}
line(result, *ith, *(hull.begin()), Scalar(), );
2. 将轮廓数据存储在记事本中,然后读取数据,存入vector<cv::Point>中
void readFromTxt(string name,int q)
{
ifstream file(name);
int i = ;
while (file) {
string line;
getline(file, line);
if (line == "")break;
cv::Point p;
int num;
for (int i = ;; i++)
{
if (line[i] == ';') {
num = i + ;
break;
}
}
int x = , y = ;
int k;
for (int i = ; i < num; i++) {
if (line[i] == ',') {
k = i;
for (int j = ; j < k; j++)
{
x += (line[j] - '') * (pow(, k - j - ));
}
}
if (line[i] == ';') {
for (int j = k + ; j < i; j++) {
y += (line[j] - '') * (pow(, i - j - ));
}
}
}
p.x = x;
p.y = y;
if(q == )shitou.push_back(p);
else if (q == )jiandao.push_back(p);
else bu.push_back(p);
}
}
其中每行的存取格式为:
, ;
, ;
, ;
3. 使用mathShapes函数比较两个形状的相似度
函数返回值 为 相似度大小,完全相同的图像返回值是0。对于第一种比较方法来说返回值最大是1。
double cvMatchShapes( const void* object1, const void* object2,
int method, double parameter= ); 参数含义
object1——第一个轮廓或灰度图像
object2——第二个轮廓或灰度图像
method——比较方法:
CV_CONTOURS_MATCH_I1
CV_CONTOURS_MATCH_I2
CV_CONTOURS_MATCH_I3.
parameter——比较方法的参数
4. 判断某点是否在轮廓内
double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)
contour——输入轮廓
pt ——要测试的点
measureDist ——为真则计算点到最近轮廓的整数距离,
否则,只判断点的位置。返回值+1(在轮廓里面)、-1(在轮廓外面)、0(在轮廓上)。
参考:http://mobile.51cto.com/aengine-435442.htm