该系列文章前面几篇介绍了轮廓以及其矩特征、几何特征等等。
本文会介绍轮廓更多的属性,它们可用于识别和分类物体、测量形状和分析图像。
1. 长宽比
长宽比是轮廓的宽度与高度的比值。它可以用于识别物体的形状。
2. 矩形度
矩形度是轮廓区域面积与其最小外接矩形区域面积的比值。它是衡量轮廓与矩形相似程度的一个参数。
3. 范围
范围是轮廓区域面积与其外接矩形区域面积的比值。它可以用于衡量轮廓的大小。
下面的例子是之前使用过的,分别画了一个正方形、三角形、五边形和圆。通过轮廓查找找到它们的轮廓后,计算轮廓的长宽比、矩形度、范围。
#include <iostream>
#include <opencv2/opencv.hpp>
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
using namespace std;
using namespace cv;
bool ascendSort(vector<Point> a,vector<Point> b)
{
return contourArea(a) > contourArea(b);
}
int main(int argc, char **argv) {
Mat image(1600, 1600, CV_8UC3, Scalar(0, 0, 0));
// 画一个正方形
rectangle(image, Point(100, 100), Point(400, 400), Scalar(255, 255, 0), -1);
// 画一个三角形
Point trianglePoints[3] = {Point(500, 800), Point(250, 1300), Point(800, 1100)};
fillConvexPoly(image, trianglePoints, 3, Scalar(255, 255, 0));
// 画一个五边形
Point pentagonPoints[5];
for (int i = 0; i < 5; i++) {
pentagonPoints[i] = Point(600 + 200 * cos(2 * CV_PI * i / 5), 600 + 200 * sin(2 * CV_PI * i / 5));
}
fillConvexPoly(image, pentagonPoints, 5, Scalar(255, 255, 0));
// 画一个圆形
circle(image, Point(1200, 1200), 300, Scalar(255, 255, 0), -1);
Mat gray,thresh;
cvtColor(image, gray, cv::COLOR_BGR2GRAY);
threshold(gray,thresh,0,255,THRESH_BINARY | THRESH_OTSU);
imshow("thresh", thresh);
vector<vector<Point>> contours;
vector&