ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

求最小外接矩形的面积(C++实现)

2021-06-27 17:03:23  阅读:293  来源: 互联网

标签:外接 物体 最小 long C++ 矩形 pixel


目录

求最小外接矩形的原理

最近在做课程设计的过程中遇到了一个问题,需要求出一幅图像中物体的矩形度,但是求解矩形度需要用到该物体的最小外接矩形的面积。所以我查了各种资料想要写一个求解物体最小外接矩形的代码。

首先我们来看一下求解的原理。一个物体的与x轴和y轴平行的外接矩形就是这个物体的简单外接矩形,显然,物体的简单外接矩形是比较容易计算面积的。那么我们只需要将物体旋转一定的角度,再求出旋转后的简单外接矩形,最后得到最小的简单外接矩形的面积就行了,而旋转的角度在正负90°之间,以1°为1个间隔。

因为我们只要求解面积而不需要将这个矩形画出来,所以可以采用C++中的set容器来实现,set容器具有自动排序的功能。

大致实现算法如下:
在这里插入图片描述

C++实现代码

// 求解最小外接矩形面积
long lengthAndWidth(LPSTR lpSrcStartBits, long lSrcWidth, long lSrcHeight, int label)
{
	unsigned char* lpSrc;
	int* pixel = new int[2];
	pixel[0] = pixel[1] = 0;
	long lLineBytes = WIDTHBYTES(lSrcWidth * 8);
	// 旋转角度(弧度)
	float	fRotateAngle;
	// 旋转角度的正弦和余弦
	float fSina, fCosa;
	int rotate = 0;
	long x0, y0;
	std::set<int> setx,sety;
	long min = 10000000;
	long square = 0;
	for (rotate = -90;rotate <= 90;rotate++)
	{
		// 将旋转角度从度转换到弧度
		fRotateAngle = (float)((rotate)*PI / 180.0);
		// 计算旋转角度的正弦
		fSina = (float)sin((double)fRotateAngle);
		// 计算旋转角度的余弦
		fCosa = (float)cos((double)fRotateAngle);
		for (long i = 0;i < lSrcHeight;i++)//旋转
		{
			for (long j = 0;j < lSrcWidth;j++)
			{
				lpSrc = (unsigned char*)lpSrcStartBits + lLineBytes * (lSrcHeight - 1 - i) + j;
				if (*lpSrc == label)
				{
					x0 = j * fCosa - i * fSina + 0.5;
					y0 = j * fSina + i * fCosa + 0.5;
					setx.insert(x0);
					sety.insert(y0);
				}
			}
		}
		square = abs((*setx.rbegin() - *setx.begin() + 1) * (*sety.rbegin() - *sety.begin() + 1));
		if(min > square)
		{
			min = square;
			pixel[0] = *setx.rbegin() - *setx.begin() + 1;
			pixel[1] = *sety.rbegin() - *sety.begin() + 1;
		}
		setx.clear();sety.clear();
	}
	return (pixel[0]*pixel[1]);
 }

当然这份代码只对8位图像有效,我们也可以参照算法把它改成适用于24位图像的代码。

参考文章:
https://zhuanlan.zhihu.com/p/97855964.

标签:外接,物体,最小,long,C++,矩形,pixel
来源: https://www.cnblogs.com/lyy-0011/p/14940915.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有