连续区域通常代表着场景中的某个物体。为了识别该物体,或将它与其他图像元素做比较,需要对此区域进行测量,以提取出部分特征。 OpenCV 中用于形状描述的函数有很多,我们把其中的几个应用到上节提取的区域。值得一提的是,我们还会使用包含四个轮廓的向量,这些轮廓分别代表前面已经识别的四头水牛。在下面的代码段中,我们将计算轮廓的形状描述子(从 contours[0]到 contours[3]),并在轮廓图像(宽度为 1)上画出结果(宽度为 2)。 第一个是边界框,用于右下角的区域:
cv::Rect r0= cv::boundingRect(contours[0]);
cv::rectangle(result,r0, 0, 2)
最小覆盖圆的情况也类似,将它用于右上角的区域:
float radius;
cv::Point2f center;
cv::minEnclosingCircle(contours[1],center,radius);
cv::circle(result,center, static_cast<int>(radius),
cv::Scalar(0),2);
计算区域轮廓的多边形逼近的代码如下(位于左侧区域):
std::vector<cv::Point> poly;
cv::approxPolyDP(contours[2],poly,5,true);
cv::polylines(result, poly, true, 0, 2);
注意,多边形绘制函数 cv::polylines 与其他画图函数很相似。第三个布尔型参数表示该轮廓是否闭合(如果闭合,最后一个点将与第一个点相连)。 凸包是另一种形式的多边形逼近(位于左侧第二个区域):
std::vector<cv::Point> hull;
cv::convexHull(contours[3],hull);
cv::polylines(result, hull, true, 0, 2);
最后,计算轮廓矩是另一种功能强大的描述子(在所有区域内部画出重心):
itc= contours.begin();
while (itc!=contours.end()) {
cv::Moments mom= cv::moments(cv::Mat(*itc++));
OpenCV 中用于形状描述的函数有很多,我们把其中的几个应用到上节提取的区域。值得一提的是,我们还会使用包含四个轮廓的向量,这些轮廓分别代表前面已经识别的四头水牛。在下面的代码段中,我们将计算轮廓的形状描述子(从 contours[0]到 contours[3]),并在轮廓图像(宽度为 1)上画出结果(宽度为 2)。 第一个是边界框:
cv::Rect r0= cv::boundingRect(contours[0]);
cv::rectangle(result,r0, 0, 2)
最小覆盖圆的情况也类似,将它用于右上角的区域:
float radius;
cv::Point2f center;
cv::minEnclosingCircle(contours[1],center,radius);
cv::circle(result,center, static_cast<int>(radius),
cv::Scalar(0),2);
计算区域轮廓的多边形逼近的代码如下:
std::vector<cv::Point> poly;
cv::approxPolyDP(contours[2],poly,5,true);
cv::polylines(result, poly, true, 0, 2);
注意,多边形绘制函数 cv::polylines 与其他画图函数很相似。第三个布尔型参数表示该轮廓是否闭合(如果闭合,最后一个点将与第一个点相连)。 凸包是另一种形式的多边形逼近:
std::vector<cv::Point> hull;
cv::convexHull(contours[3],hull);
cv::polylines(result, hull, true, 0, 2);
最后,计算轮廓矩是另一种功能强大的描述子(在所有区域内部画出重心):
itc= contours.begin();
while (itc!=contours.end()) {
cv::Moments mom= cv::moments(cv::Mat(*itc++));
}
|