精华内容
下载资源
问答
  • 主要为大家详细介绍了Opencv绘制最小外接矩形、最小外接圆的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了Opencv实现最小外接矩形和圆,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 最小外接矩形

    2018-01-27 21:55:47
    凸包 蛮力 最小面积 最小外接矩形 文件选择 随机生成 凸包点位 然后求解
  • 在图像裁剪操作中,opencv和pillow两个库都具有相应的函数,但是这两个库中的函数仅仅能对与图片平行的矩形进行裁剪操作,如果想要对目标的最小外接矩形进行裁剪该如何操作呢?如下所示: 具体处理该问题的思路如下...
  • 主要介绍了python opencv minAreaRect 生成最小外接矩形的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 最小外接矩形

    2018-05-09 09:39:35
    利用opencv找图像中形状的最小外接矩形,进而可获得最小外接矩形的信息等
  • 包含多个区域的最小外接矩形''' image = cv2.imread('./label.png') B, G, R = cv2.split(image) ret, thresh = cv2.threshold(G, 128, 255, cv2.THRESH_BINARY) print(thresh.shape) # 单通道复制为三通道 ...代替...
  • 资源中包含了两个m文件。...minboundrect.m用于绘制运动目标的最小外接矩形框,可任意设置最小外接矩形框的角度。 本人做的是视频中运动车辆的检测,读者可自行更换检测算法以及参数调整以匹配不同的运动场景。
  • 主要介绍了python3+openCV 获取图片中文本区域的最小外接矩形实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 主要介绍了Python实现图片查找轮廓、多边形拟合、最小外接矩形代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 多边形最小外接矩形算法 程鹏飞 题目 给出求一个多边形最小外接矩形的算法并证明求得的是最小外接矩形. 最小外接矩形英文简称为SMBR(smallest minimum bounding rectangle,它和MBR(minimum bounding rectangle)不...
  • 最小外接矩形matlab

    2015-12-21 19:31:17
    minboundrect: Compute the minimal bounding rectangle of points in the plane % usage: [rectx,recty,area,perimeter] = minboundrect(x,y,metric)
  • 使用opencv画出图形的最小外接矩形与最小外接圆,首先求出图形的轮廓,设有滚动条可以选择最佳阈值,然后画出图形的最小外接圆与最小外接矩形,算法的效果很好!
  • 该代码可用于求取一个多边形的最小外接矩形
  • 最小外接矩形求解MBR

    2020-04-06 10:57:35
    参考网页上的历程,完善了软件功能,实现了最小外接矩形求解。在QT上测试通过,输入随意的不等数量的点,运行算法,获取最小矩形的边的所有参数。
  • 截取最小外接矩形

    2014-07-08 20:46:20
    利用帧间差分法对于经过处理后得到的图像作处理,得到了有一定角度倾斜的最小外接矩形
  • 简单多边形的最小外接矩形算法,适用于玻璃排样等。
  • matlab 求最小外接矩形

    2014-06-13 13:28:42
    求多个目标的最小外接矩形,有说明,matlab版
  • 检测图像的最小外接矩形 matlab代码
  • matlab计算目标最小外接矩形,主要利用minboundrect函数。
  • 主要为大家详细介绍了OpenCV实现最小外接矩形,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 应用OpenCV开源库,通过对图像的分析,确定图像中电子器件重心的像素位置
  • 前段时间毕设卡在求一系列点的最小外接矩形, 卡了好久在导师的帮助下终于解决了. 来分享下思路 说明 本篇所有的坐标系都是建立在右手坐标系下的情况. 虽然为了符合常识认知, 我会把这个坐标系做一个旋转, 但本质上它...

    引言

    前段时间毕设卡在求一系列点的最小外接矩形, 卡了好久在导师的帮助下终于解决了. 来分享下思路

    说明

    本篇所有的坐标系都是建立在右手坐标系下的情况. 虽然为了符合常识认知, 我会把这个坐标系做一个旋转, 但本质上它还是一个右手坐标系. 所谓的右手坐标系就是 Z = X × Y , Y = Z × X , X = Y × Z Z = X \times Y, Y = Z \times X, X = Y \times Z Z=X×Y,Y=Z×X,X=Y×Z, 其中 X , Y , Z X, Y, Z X,Y,Z是一组正交基, × \times ×表示两个向量的叉乘

    二维空间内的方案

    这要是在二维空间内那是非常好解决的, 比如用 [ x , y ] [x, y] [x,y]表示一个点 P P P的坐标, 假设有 P 1 , P 2 , … , P N P_1, P_2, …, P_N P1,P2,,PN N N N个点.

    X , Y X, Y X,Y坐标的最大最小值 x m i n , x m a x , y m i n , y m a x x_{min}, x_{max}, y_{min}, y_{max} xmin,xmax,ymin,ymax, 那么这些点的最小外接矩形的四个顶点坐标就是 [ x m i n , y m i n ] , [ x m i n , y m a x ] , [ x m a x , y m a x ] , [ x m a x , y m i n ] [x_{min}, y_{min}], [x_{min}, y_{max}], [x_{max}, y_{max}], [x_{max}, y_{min}] [xmin,ymin],[xmin,ymax],[xmax,ymax],[xmax,ymin]

    三维空间内不能用上述的思路去求 X , Y , Z X, Y, Z X,Y,Z坐标的6个最值, 这样得到的结果是不唯一的. 因为二维空间的平面经过升维后, 对应到三维空间内是立方体, 而不是三维内的平面. 两者有本质的区别, 自然不能用同一套方案去实践.

    方案

    既然在三维内不能解决问题, 自然而然首先想到把三维降为成二维, 在二维空间内解决最小外接矩形就用上面的思路. 但是问题是, 三维的平面在二维应该是一条线, 而不是二维平面. 这个其实也很好解决, 只需要把平面的法向量作为 Z Z Z轴, 就可以把三维平面降维到二维平面, 因为此时平面内所有点的 Z Z Z坐标都是相等的.

    说白了严格来说这种方案不能算降维, 只是重新旋转了坐标系, 使某一个维度上的坐标值是一个定值

    假设原坐标系是 [ X Y Z ] [XYZ] [XYZ](下图中的黑色坐标系), 新的坐标系是 [ X ′ Y ′ Z ′ ] [X'Y'Z'] [XYZ], 平面(下图中蓝色矩形)的方程是 A x + B y + C z + D = 0 Ax + By + Cz + D = 0 Ax+By+Cz+D=0, 有 N N N个点 P 1 , P 2 , … , P N P_1, P_2, …, P_N P1,P2,,PN(下图中红色点)

    在这里插入图片描述

    那么不难发现, 新的坐标系只是把原来的坐标系经过了一个旋转, 也就是说, 要求的其实是一个3x3的变换矩阵 G G G.

    为了方便, 重新画一张图.

    在这里插入图片描述

    选定新坐标轴

    从所有的点中任选 A , B A, B A,B两点, 得到向量 A B AB AB, 单位化后得到 n 1 n_1 n1

    将平面的法向量 [ A , B , C ] [A, B, C] [A,B,C], 单位化, 得到 n 3 n_3 n3

    由右手坐标系的定义, 剩下的 n 2 = n 3 × n 1 n_2 = n_3 \times n_1 n2=n3×n1

    变换矩阵 G G G

    假设 [ X Y Z ] [XYZ] [XYZ]坐标系下的点用一个列向量 P = [ x , y , z ] T P=[x, y, z]^T P=[x,y,z]T表示, 对应到新的 [ X ′ Y ′ Z ′ ] [X'Y'Z'] [XYZ]坐标系下的点 P ′ = [ x ′ , y ′ , z ′ ] T P'=[x', y', z']^T P=[x,y,z]T, 令
    G = [ n 1 x n 1 y n 1 z n 2 x n 2 y n 2 z n 3 x n 3 y n 3 z ] G = \begin{bmatrix} \large n_{1x} & \large n_{1y} & \large n_{1z} \\ \large n_{2x} & \large n_{2y} & \large n_{2z} \\ \large n_{3x} & \large n_{3y} & \large n_{3z} \\ \end{bmatrix} \large G=n1xn2xn3xn1yn2yn3yn1zn2zn3z
    而且由于 n 1 , n 2 , n 3 n_1, n_2, n_3 n1,n2,n3是一组正交基, G必然是可逆的

    那么有 P ′ = P ∗ G P' = P * G P=PG, 其中 ∗ * 表示点乘

    后续

    剩下的工作就很简单了, 设所有点组成的矩阵为
    Q = [ P 1 T P 2 T . . P N T ] Q = \begin{bmatrix} \large P_1^T & \large P_2^T & .. & \large P_N^T \end{bmatrix} \large Q=[P1TP2T..PNT]
    那么同样有 Q ′ = Q ∗ G Q' = Q*G Q=QG

    然后只要取 [ X ′ Y ′ Z ′ ] [X'Y'Z'] [XYZ]坐标的6个最值(实际上是5个, 因为 z m i n , z m a x z_{min}, z_{max} zmin,zmax是相等的), 当成二维的情况就可以计算新的坐标系下最小外接矩形的4个边界点的坐标了. 这里假设这4个边界点为 B ′ = [ B 1 ′ T , B 2 ′ T , B 3 ′ T , B 4 ′ T ] B'= [B_1'^T, B_2'^T, B_3'^T, B_4'^T] B=[B1T,B2T,B3T,B4T]

    则原坐标系下这4个边界点的坐标为 B = B ’ ∗ G − 1 B = B’ * G^{-1} B=BG1.

    展开全文
  • C++/Qt:最小外接矩形

    千次阅读 2019-12-17 20:48:11
    以凸包的某条边作为矩形的一条边,求包围所有点的面积最小外接矩形。(感觉是对的)下图中蓝色为凸包,红色为MBR。 分享给有需要的人,代码质量勿喷。 一、求凸包,返回 xjListCH 参考:凸包 二、MBR中用到的函数 //...

    以凸包的某条边作为矩形的一条边,求包围所有点的面积最小外接矩形。(感觉是对的)下图中蓝色为凸包,红色为MBR。

               

     

    分享给有需要的人,代码质量勿喷。

    一、求凸包,返回 xjListCH

    参考:凸包

    二、MBR中用到的函数

    //返回 点与点的平面距离
    double TwoDistancePointAndPoint(const xjPoint &p1, const xjPoint &p2)
    {
    	double x1 = p1.x, y1 = p1.y;
    	double x2 = p2.x, y2 = p2.y;
    
    	double dis = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
    
    	return dis;
    }
    
    //返回 点(p0)  到线(p1,p2)的距离
    double TwoDistancePointAndLine(const xjPoint &p0, const xjPoint &p1,const xjPoint &p2)
    {
    	double dis12 = TwoDistancePointAndPoint(p1, p2);//线段长度
    	double dis01 = TwoDistancePointAndPoint(p0, p1);//p1与p0的距离
    	double dis02 = TwoDistancePointAndPoint(p0, p2);//p2与p0的距离
    	double HalfC = (dis12 + dis01 + dis02) / 2;// 半周长
    	double s = sqrt(HalfC * (HalfC - dis12) * (HalfC - dis01) * (HalfC - dis02));//海伦公式求面积
    	double xj2DisPL = 2 * s / dis12;// 返回点到线的距离(利用三角形面积公式求高)
    
    	return xj2DisPL;
    }

    三、最小外接矩形

    /*返回 最小外接矩形点*/
    /* xjListCH 凸包点 */
    void xjMinimumBoundingRectangle(QList<xjPoint> &xjListMBRpoint, double &length, double &width, QList<xjPoint> xjListCH)
    {
    	//外接矩形
    	QList<xjPoint> xjListCH2;
    	int xjPcount = xjListCH.size();
    	for (int i = 0; i < xjPcount; i++)
    	{
    		xjListCH2.append(xjListCH.at(i));
    	}
    	qSort(xjListCH2.begin(), xjListCH2.end(), [](const xjPoint &a, const xjPoint &b) {return a.x < b.x; });
    	double minX = xjListCH2.at(0).x;
    	double maxX = xjListCH2.at(xjPcount - 1).x;
    	qSort(xjListCH2.begin(), xjListCH2.end(), [](const xjPoint &a, const xjPoint &b) {return a.y < b.y; });
    	double minY = xjListCH2.at(0).y;
    	double maxY = xjListCH2.at(xjPcount - 1).y;
    
    	//依次判断
    	double minArea = 99999999;
    	xjListCH.push_back(xjListCH.at(0));
    	for (int a = 0; a < xjListCH.size() - 1; a++)
    	{
    		xjPoint p0 = xjListCH.at(a);
    		xjPoint p1 = xjListCH.at(a + 1);
    
    		if ((p0.y == p1.y)|| (p0.x == p1.x)) // 水平或垂直
    		{
    			double side1 = maxY - minY;
    			double side0 = maxX - minX;
    			double xjArea = side0 * side1;
    
    			if (xjArea <= minArea)
    			{
    				length = max(side0, side1);
    				width = min(side0, side1);
    				minArea = xjArea;
    
    				//外接矩形四个点
    				xjPoint pLB;
    				pLB.x = minX;
    				pLB.y = minY;
    				pLB.z = 0;
    				xjPoint pRB;
    				pRB.x = maxX;
    				pRB.y = minY;
    				pRB.z = 0;
    				xjPoint pRT;
    				pRT.x = maxX;
    				pRT.y = maxY;
    				pRT.z = 0;
    				xjPoint pLT;
    				pLT.x = minX;
    				pLT.y = maxY;
    				pLT.z = 0;
    
    				xjListMBRpoint.clear();
    				xjListMBRpoint.append(pLB);
    				xjListMBRpoint.append(pRB);
    				xjListMBRpoint.append(pRT);
    				xjListMBRpoint.append(pLT);
    			}
    		}
    		else //不水平 不垂直
    		{
    			double k1 = (p1.y - p0.y) / (p1.x - p0.x);
    			double b1 = p0.y - k1 * p0.x;
    			double side0 = -3;
    			xjPoint Pside0;
    			for (int j = 0; j < xjListCH.size(); j++)
    			{
    				if ((j == a) || (j == (a + 1)))
    					continue;
    
    				xjPoint p = xjListCH.at(j);
    				double dis = abs(TwoDistancePointAndLine(p, p0, p1));
    				if (dis >= side0)
    				{
    					side0 = dis;
    					Pside0.x = p.x;
    					Pside0.y = p.y;
    					Pside0.z = p.z;
    				}
    			}
    			double b11 = Pside0.y - k1 * Pside0.x;
    
    			//垂直方向
    			double k2 = -1.0 / k1;
    			double bb = p0.y - k2 * p0.x;
    			double side1_positive = -3;
    			xjPoint Pside1_positive;
    			double side1_negative = 9999999;
    			xjPoint Pside1_negative;
    			for (int j = 0; j < xjListCH.size(); j++)
    			{
    				xjPoint p = xjListCH.at(j);
    				double dis = (k2*p.x - p.y + bb) / (sqrt(k2*k2 + 1));
    				if ((dis>=0)&&(dis >= side1_positive))
    				{
    					side1_positive = dis;
    					Pside1_positive.x = p.x;
    					Pside1_positive.y = p.y;
    					Pside1_positive.z = p.z;
    				}
    				if ((dis<0)&&(dis <= side1_negative))
    				{
    					side1_negative = dis;
    					Pside1_negative.x = p.x;
    					Pside1_negative.y = p.y;
    					Pside1_negative.z = p.z;
    				}
    			}
    
    			double b2 = Pside1_positive.y - k2 * Pside1_positive.x;
    			double b22 = Pside1_negative.y - k2 * Pside1_negative.x;
    
    			//面积和周长
    			double side1 = abs(side1_positive)+abs(side1_negative);
    			double xjArea = side0 * side1;
    			
    			if (xjArea <= minArea)
    			{
    				length = max(side0, side1);
    				width = min(side0, side1);
    				minArea = xjArea;
    
    				//外接矩形四个点
    				xjPoint br0;
    				br0.x = (b1 - b22) / (k2 - k1);
    				br0.y = k1 * br0.x + b1;
    				xjPoint br1;
    				br1.x = (b11-b22) / (k2-k1);
    				br1.y =  k1* br1.x + b11;
    				xjPoint br2;
    				br2.x = (b2-b11) / (k1-k2);
    				br2.y =  k1* br2.x + b11;
    				xjPoint br3;
    				br3.x = (b2-b1) / (k1-k2);
    				br3.y = k1 * br3.x + b1;
    
    				xjListMBRpoint.clear();
    				xjListMBRpoint.append(br0);
    				xjListMBRpoint.append(br1);
    				xjListMBRpoint.append(br2);
    				xjListMBRpoint.append(br3);
    			}
    		}
    	}
    
    	//MBR提示信息
    	QString MBRinfo = "chMBR: length = " + QString::number(length, 'f', 4) + ", ";
    	MBRinfo += "width = " + QString::number(width, 'f', 4) + ", ";
    	MBRinfo += "minimum area = " + QString::number(minArea) + ", ";
    	MBRinfo += "circumference = " + QString::number((length + width) * 2);
    }

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,141
精华内容 2,056
关键字:

最小外接矩形