精华内容
下载资源
问答
  • cv2.minAreaRect()
    2021-08-05 12:03:21

    功能:

            求出在点集下的最小面积矩形。

    输入:

            格式:

                    points = array.shape=(n, 1, 2);

            解释:

                    其中points是点集,数据类型为ndarray,array([[[x1,y1]],[[x2,y2]],....,[[xn,yn]]]);

    输出:

            格式:

                    rect = tuple((x, y), (w, h), angle);

            解释:

                    rect[0]:返回矩形的中心,(x,y),实际上为y行x列的像素点;       

                    rect[1]:返回矩形的长和宽,顺序一定不要弄错了,在旋转角度上有很重要的作用;

                    rect[2]:返回矩形的旋转角度,由x轴逆时针转至W(宽)的角度, 范围是(-90,0] ;

    原理:

            (坑)

    更多相关内容
  • cv2.minAreaRect函数使用情况说明

    千次阅读 多人点赞 2021-03-19 14:59:20
    opencv定义的旋转框角度情况说明 1. 环境 python 3.5+ opencv 4.5.1+ 2. 函数参数说明 ...points为 shape=[N,2]的Ndarray,要求使用int32、int64的array,对于float32不推荐,因为...# cv2.minAreaRect 使用样例 .

    opencv定义的旋转框角度情况说明

    目录

    1. 环境

    2. 函数参数说明

    3. 实际操作

    4. 图解


    1. 环境

    '''
        python 3.5+
        opencv-python 4.5.1+
        
        由于本人探索了一段时间的影像旋转目标检测,只要涉及角度定义,总是出现问题,
        百度到的博客,都是老旧的,和实际执行效果有所出入,因此,重新可视化,发现问题。
        opencv版本,是角度定义处理的关键,不同版本定义有很大差别,
        这里以最新的opencv-python4.5.1为例:
    
        如图,如代码,角度定义为:“顺时针”与“X轴正向”最近的边的夹角,角度范围为[0,90],而非(0,90]
    '''

    2. 函数参数说明

    points为 shape=[N,2]的Ndarray,要求使用int32、int64的array,对于float32不推荐,因为结果不一样!

    eg:points=np.array([[x1,y2],[x2,y2],[x3,y3],[x4,y4],[x5,y5]], dtype=np.int64)

    3. 实际操作

    import cv2
    import numpy as np
    
    def draw_rbbox(img, points):
        img = cv2.drawContours(img, [points], 0, (255, 0, 0), 2)
        rect = cv2.minAreaRect(points)
        print(rect)
        points_rect = cv2.boxPoints(rect)
        box = np.int0(points_rect)
        img = cv2.drawContours(img, [box], 0, (0, 0, 255), 2)
        return img
    
    print(cv2.__version__)  # 4.5.1
    img = np.zeros([500,500,3], dtype=np.uint8)
    # 样例1
    points1 = np.array([[100,100],[180,200],[140,270],[60,160]])
    # 样例2
    points2 = np.array([[320.4896, 306.2144],
                       [320.4896, 281.0297],
                       [381.2337, 281.0297],
                       [381.2337, 306.2144]], dtype=np.int64)
    # 样例3
    points3 = np.array([[222.4992, 345.3907],
                       [222.4992, 317.4076],
                       [281.2018, 317.4076],
                       [281.2018, 345.3907]], dtype=np.int64)
    # 样例4
    points4 = np.array([[450,100],[480,160],[200,300],[150,240]])
    
    img = draw_rbbox(img, points1)
    img = draw_rbbox(img, points2)
    img = draw_rbbox(img, points3)
    img = draw_rbbox(img, points4)
    cv2.imwrite(r'/home/111.jpg', img)
    '''
        样例依次对应xywh-angle
        ((120.000, 185.0000), (157.735, 74.963), 51.3401)
        ((350.499, 293.499), (60.999, 24.999), 0.0)
        ((251.5, 331.0), (28.0, 59.0), 90.0)
        ((316.7883, 203.832), (75.515, 332.871), 64.9831)
    '''
    

    4. 图解

    展开全文
  • 网上很多例子都说cv2.minAreaRect函数的输出的角度范围在[-90,0],但是实测输出范围在[0,90]。再进行调研,确定为opencv4.5版本升级改动引起。 cv2.minAreaRect输入:四边形的四个点(不要求顺序)。 输出:最小...

            网上很多例子都说cv2.minAreaRect函数的输出的角度范围在[-90,0],但是实测输出范围在[0,90]。再进行调研,确定为opencv4.5版本升级改动引起。

            cv2.minAreaRect输入:四边形的四个点(不要求顺序)。

            输出:最小外接矩形的中心点坐标x,y,宽高w,h,角度anlge,输出形式为元组((x,y),(w,h),anlge),顺序格式不变。

    1、4.5版本

            4.5版本定义为,x轴顺时针旋转最先重合的边为w,angle为x轴顺时针旋转的角度,angle取值为(0,90]。

    cnts, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    rect = cv2.minAreaRect(cnts[0])
    box = np.int0(cv2.boxPoints(rect))
    print(rect)

            输出结果:((201.25, 92.10), (20.93, 101.94), 67.47)

            中心点坐标:(201, 92),宽高: (20, 101),角度: 67。

            配合旋转函数,可实现框的拉平。旋转函数(逆时针旋转):

    import cv2
    import numpy as np
    
    def rotate(img, angle, center=None, scale=1.0, fill=0, interpolation=cv2.INTER_LINEAR, expand=True):
        if center is not None and expand:
            raise ValueError('`auto_bound` conflicts with `center`')
    
        h, w = img.shape[:2]
        if center is None:
            center = ((w - 1) * 0.5, (h - 1) * 0.5)
        assert isinstance(center, tuple)
    
        matrix = cv2.getRotationMatrix2D(center, angle, scale)
        if expand:
            cos = np.abs(matrix[0, 0])
            sin = np.abs(matrix[0, 1])
            new_w = h * sin + w * cos
            new_h = h * cos + w * sin
            matrix[0, 2] += (new_w - w) * 0.5
            matrix[1, 2] += (new_h - h) * 0.5
            w = int(np.round(new_w))
            h = int(np.round(new_h))
        rotated = cv2.warpAffine(
            img,
            matrix, (w, h),
            flags=interpolation,
            borderValue=fill)
        return rotated

    执行旋转:

    rotate(img, -23, center=(201, 92), expand=False)

    结果:

     角度说明:

            角度为x轴顺时针旋转,第一次接触到矩形边界时的值,范围:0~90°,第一次接触的边界为宽,区分方向可以使用宽、高的值来确定。

     角度按逆时针旋转方式调整为:

    if rect[1][0] > rect[1][1]: # w > h 
        angle = int(rect[2]) 
    else: 
        angle = -(90 - int(rect[2]))

    2、4.5之前版本

            有网友测试4.1.*,4.2.*,4.3.*,4.4.*下minAreaRect函数的都一样,就是网上常见的角度输出为[-90~0]情况。但是实测python版本4系列的都为上述4.5版情况,可能是c++版本的不同吧。这里补充[-90~0]情况。

    rect = cv2.minAreaRect(cnts[0])

            rect[0]返回最小外接矩形的中心点,rect[1]为最小外接矩形的宽、高。rect[2]为旋转角度。

            宽、高和角度定义如下:角度为x轴沿逆时针旋转遇到的第一个边时的旋转角度,因为是逆时针旋转所以角度为0~-90度。约定:遇到的第一个边为宽、另一个边为高。

    展开全文
  • 函数 cv2.minAreaRect() 返回一个Box2D结构 rect:(最小外接矩形的中心(x,y),(宽度,高度),旋转角度)。 分别对应于返回值:(rect[0][0], rect[0][1]), (rect[1][0], rect[1][1]), rect[2] 注意 :旋转角度...

    https://blog.csdn.net/qq_37385726/article/details/82313558

    OpenCV - minAreaRect返回值的解释
    函数 cv2.minAreaRect() 返回一个Box2D结构 rect:(最小外接矩形的中心(x,y),(宽度,高度),旋转角度)。
    分别对应于返回值:(rect[0][0], rect[0][1]), (rect[1][0], rect[1][1]), rect[2]

    在这里插入图片描述
    注意 :旋转角度θ是水平轴(x轴)逆时针旋转,与碰到的矩形的第一条边的夹角。并且这个边的边长是width,另一条边边长是height。也就是说,在这里,width与height不是按照长短来定义的。
    在opencv中,坐标系原点在左上角,相对于x轴,逆时针旋转角度为负,顺时针旋转角度为正。在这里,θ∈(-90度,0]。

    numpy.int0 (np.int0),这个其实就是numpy.int64(np.int64)

    展开全文
  • 1)] points=np.array(points) area = cv2.minAreaRect(points) print(area) output: ((0.5, 0.5), (1.0, 1.0), -90.0) 解释:就是将上述绘制的矩形采用另一种方式表达(x,y,w,h,angle),这个看起来比较高端一点。...
  • cv2.minAreaRect(cnt)是cv2.findContours()找轮廓函数返回轮廓数组后,绘制每个轮廓的最小外接矩形的方法。详解请看我的另两篇文章: https://mp.csdn.net/mp_blog/creation/editor/119903415 ...
  • 关于不同版本opencv的cv2.minAreaRect函数问题 在做旋转矩形目标检测时碰到一个问题,我所使用的数据集的标签为不规则四边形的四个点的坐标(x1,y1,x2,y2,x3,y3,x4,y4),要将其转化为旋转目标检测的标签(x,y,longside...
  • 在本地调试DBNet后处理函数时,代码跑到bounding_box = cv2.minAreaRect(contour)时报错,cv2.error: C:\projects\opencv-python\opencv\modules\imgproc\src\convhull.cpp:137: error: (-215) total >...
  • 该函数生成点集的最小外界矩阵,矩阵的四个角坐标按照顺时针旋转方向,起始点为最下角 results = cv2.minAreaRect(polygon) #中心点 ...result2 = cv2.boxPoints(cv2.minAreaRect(polygon)) print
  • cv2.minAreaRect(Points)旋转角度问题
  • draws a rectangle around that area using cv2.minAreaRect The idea was that cv2.minAreaRect returns the angle as well, which I could use to deskew the image. However, in my case it's –90°. You can ...
  • opencv 之 cv2.minAreaRect angle角度问题

    千次阅读 2020-10-14 14:39:12
    经过经验总结和反复的trials and ...2. 邻近x轴的边即为矩形的宽,另一边为height 原理图如下图: minAreaRect函数返回矩形的中心点坐标,长宽,旋转角度[-90,0),当矩形水平或竖直时均返回-90 # -*- codi.
  • 以后要用到,转载记录一下。
  • 最近使用不同版本的opencv的cv2.minAreaRect函数处理图像时,发现版本不同出现的结果完全不一样,这边尝试了不同版本的函数返回值结果,做一个较为详细的记录 to be continue。。。
  • opencv里求最小外接矩形的函数是cv2.minAreaRect() OpenCV中minAreaRect()最小外接矩形详解 其大致思路: 先求轮廓点集的凸包convex hull 关于凸包convex hull: 凸包维基百科 凸包算法维基百科 关于凸包算法 ...
  • Opencv之cv2.minAreaRect

    万次阅读 多人点赞 2018-09-02 10:57:44
    一、cv2.minAreaRect函数原型 二、minAreaRect函数返回rect对象   一、cv2.minAreaRect函数原型 cv2.minAreaRect(Points) 其中points是点集,数据类型为ndarray,array((x1,y1),(x2,y2),....,(xn,yn)) 而...
  • 今天博主遇到了一个及其坑的问题,python的opencv4.5.1.48这个版本的cv2.minAreaRect函数返回的角度错误,水平的矩形也返回90度,应该是新版的bug,只需要降低版本就可以解决,比如4.0.1.23
  • 最近在做目标检测的相关问题,当用到opencv中的minAreaRect函数时,并不像其他博客里面说的会产生负的角度,个人很是疑问,经过一番查找,发现可能是opencv的版本问题,在一下博客中看到的: 连接 更改一下版本,...
  • 求两个带角度矩形的 交集,后续可以 计算iou 参数定义:rect 矩形的 x,y w h ,theta ...r1 = cv2.rotatedRectangleIntersection(rect1, rect2) # 区分正负角度,逆时针为负,顺时针为正 order_pts = cv2.convexHul.
  • 这里面相对比较核心的是cv2.boundingRect和cv2.minAreaRect,后者用的非常多,上述所有方法的输入都是点集,对于minAreaRect,输入的是findContours找到的点集,然后获取一个完整的边界矩形,这个边界矩形通常会作为...
  • cnt = np.array([[x1,y1],[x2,y2],[x3...rect = cv2.minAreaRect(cnt) # 得到最小外接矩形的(中心(x,y), (宽,高), 旋转角度) box = cv2.boxPoints(rect) # cv2.boxPoints(rect) for OpenCV 3.x 获取最小外接矩形的...
  • 使用python opencv返回点集cnt的最小外接矩形,所用函数为 cv2.minAreaRect(cnt) ,cnt是所要求最小外接矩形的点集数组或向量,这个点集不定个数。 1 cv2.minAreaRect(points) → retval 参数说明:...

空空如也

空空如也

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

cv2.minarearect