【OpenCV笔记 15-3】OpenCV计算物体最小包围矩形面积和周长

27 篇文章 0 订阅

本文将介绍OpenCV计算物体最小包围矩形面积和周长

两个函数:contourArea()和arcLength

知识点:

1.寻找最小包围矩形
2.计算最小轮廓的面积和长度
3.定义和输出vector容器点坐标

代码示例:

//寻找最小包围矩形
//计算最小轮廓的面积和长度
//定义和输出vector容器点坐标

#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <vector>
using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
	Mat testImage(600, 600, CV_8UC3);//画布大小600x600
	RNG& rng = theRNG();
	//按回车键一直更新
	while (1)
	{
		cout << "===========Begin============\n" << endl;
		testImage = Scalar::all(0);//将画布设置为黑色,每次按键后可更新
		//int count = (unsigned)rng % 100 + 8;//随机生成点的数量
		int count = rng.uniform(4, 6);//随机产生点的个数
		cout << "共产生 " << count << " 个随机点" << endl;
		cout << "各点坐标如下:" << endl;//输出产生随机点个数

		vector<Point>points;//vector容器存放点坐标

		for (int i = 0; i < count; i++)
		{
			Point point;
			//点坐标随机产生
			point.x = rng.uniform(testImage.cols / 5, testImage.cols * 4 / 5); //横坐标x在范围(600/1,600*4/5)随机产生
			point.y = rng.uniform(testImage.rows / 4, testImage.rows * 3 / 4);//纵坐标y在范围(600/4,600*3/4)随机产生
			points.push_back(point);
			cout << "Point" << i + 1 << ": " << point << endl;//依次输出随机产生每个点的坐标
		}

		//输出并标记各点坐标
		cout << "基于Mat的vector:\n" << Mat(points) << endl;//基于Mat类的vector将以矩阵形式输出坐标
		for (int i = 0; i < count; i++)
			circle(testImage, points[i], 5, Scalar(255, 0, 255), -1, 4);//以随机点为圆心,画出半径为5的实心圆

		//=============【1】寻找最小包围矩形================
		RotatedRect minRect = minAreaRect(Mat(points));
		Point2f vertex[4];//用于存放最小矩形的四个顶点
		minRect.points(vertex);//返回矩形的四个顶点给vertex
		//绘制最小面积包围矩形
		vector<Point>min_rectangle;
		for (int i = 0; i < 4; i++)
		{
			line(testImage, vertex[i], vertex[(i + 1) % 4], Scalar(0, 255, 0), 1, 8);//非常巧妙的表达式
			min_rectangle.push_back(vertex[i]);//将最小矩形的四个顶点以Point的形式放置在vector容器中
		}

		///=============【2】计算最小轮廓的面积和长度============
		double recArea=contourArea(min_rectangle);
		double recPerimeter = arcLength(min_rectangle,true);

		//输出
		cout << "最小包围矩形的面积: " << recArea << endl;
		cout << "最小包围矩形的周长: " << recPerimeter<< endl;
		cout << "\n===========End============\n" << endl;
		imshow("最小包围矩形的面积和长度", testImage);
		char key;
		key = (char)waitKey();
		if (key == 27 || key == 'q' || key == 'Q')//按下ESC 或q 或 Q 退出
			break;
		
	}
	return 0;
}

运行结果:

情形一:



情形二:




  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值