关于OpenCV中minAreaRect角度记录

这篇具有很好参考价值的文章主要介绍了关于OpenCV中minAreaRect角度记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题引出

最近看到stackflow关于minAreaRect的讨论:

  1. MinAreaRect angles - Unsure about the angle returned
  2. OpenCV’s RotatedRect angle does not provide enough information

大概问题是minAreaRect这个接口返回的角度信息不足以反映返回的旋转矩形的旋转信息,例如返回角度为30度,那它到底是下面图中的哪一个呢?
opencvminarearect角度,Learn OpenCV,opencv,python,计算机视觉,minAreaRect,旋转角度

那有人回答说OpenCV返回的角度是根据长边来的,是长边与竖直线之间的角度,如要使用那个角度就需要通过返回的size信息与角度信息结合就知道了。

他这么理解我暂时也没发现什么问题,但如果你想利用这个角度做些事情,这样理解可能不是很方便。因为你还得根据当前的角度去计算新的角度,例如给定与旋转矩形相同大小的矩形,让你旋转到旋转矩形的角度,可能就得想半天了。这里提供一个可能会更好理解的方式。

我们先来看一下,当给定一个旋转矩形后,通过minAreaRect接口返回的角度和返回的宽高来查看OpenCV是怎么旋转的。(注意这里使用的4.1.2版本的OpenCV,其它版本可能不一致,我遇到过只返回正值角度的版本,但这影响使用本文方法理解

我们有如下两种旋转矩形
opencvminarearect角度,Learn OpenCV,opencv,python,计算机视觉,minAreaRect,旋转角度

左图opencv返回的是-30度,size为(365, 47)
右图opencv返回的是-60度,size为(47, 365)

二、OpenCV是怎么“想”的

我们怎么理解它是怎么得到这些旋转角度的旋转矩形呢?根据返回的宽高结果,可以这样想,上图中左图是宽大于高的矩形旋转得到的,右图是使用高大于宽的矩形旋转得到的,所以初始状态分别为如下两图:
opencvminarearect角度,Learn OpenCV,opencv,python,计算机视觉,minAreaRect,旋转角度

然后两种框分别绕着矩形框中心逆时针旋转对应的角度(左图旋转30,右图旋转60度就得到了)。(至于这里为什么是顺时针旋转,这里跟返回值的正负无关,上面提到过有的版本会返回正值,具体可以根据你用的版本检查一下是否是顺时针。)

三、怎么通过minAreaRect返回的角度用于自己的计算

现在假定我们的任务是根据获取到的旋转角度,对一个相同大小的矩形进行旋转对应的角度。
我们假设所有矩形的初始状态都是宽大于高的情况,如下图所示
opencvminarearect角度,Learn OpenCV,opencv,python,计算机视觉,minAreaRect,旋转角度

当我们有一个上图这样的初始化矩形后,怎么分别旋转到左右两图两种情况呢?
首先需要说明的是旋转操作我们采用cv2.getRotationMatrix2D接口,这个接口需要提供旋转中心,旋转角度,缩放值三个参数。
旋转中心就是当前矩形框的中心,缩放值设为1就是不缩放,重点是角度的计算。

对于左图,它在opencv的旋转方式里,初始化就是宽大于高的框,所以只需要对应的转30就可以了,至于是正30还是负30(逆时针还是顺时针),我们这里明显是逆时针,所以根据当前版本的OpenCV返回角度取反就可以了。
对于右图,它在opencv的旋转方式里,初始化是高大于宽的框,所以我们需要先将我们假设的框转90度或者-90度,然后在逆时针旋转60即可。为了方便计算,前面水平框逆时针旋转90再逆时针旋转60即可,就是90+60度。

Talk is cheap, the code is below:文章来源地址https://www.toymoban.com/news/detail-631179.html

import cv2.cv2 as cv2
import numpy as np


print(cv2.__version__)


def drawPolygons(img, polygon, scalar):
    poly = polygon.reshape((-1, 1, 2)).astype(np.int)
    cv2.polylines(img, [poly], True, scalar, 2)


def get_horizontal_rect(center, size):
    points = np.zeros((2, 2))
    points[0] = center - size / 2.0
    points[1] = center + size / 2.0

    horizontal_rect = np.array([points[0],
                                [points[1][0], points[0][1]],
                                points[1],
                                [points[0][0],points[1][1]]])

    return horizontal_rect


if __name__ == "__main__":
    img = np.ones((640, 640, 3), dtype=np.uint8) * 255

    points = np.array([[29, 200],
                         [346, 18],
                         [370, 59],
                         [53, 241]])
    # points = np.array([[52, 17],
    #                  [369, 200],
    #                  [346, 241],
    #                  [29, 58]])
    rotated_bbox = cv2.minAreaRect(points)
    rotated_bbox_center, rotated_bbox_size, rotated_bbox_angle = rotated_bbox

    rotated_bbox_size = np.array(list(rotated_bbox_size))
    print(rotated_bbox)
    rect_bbox = cv2.boxPoints(rotated_bbox).astype(np.int)
    # drawPolygons(img, points, (255, 0, 0))
    drawPolygons(img, rect_bbox, (0, 255, 0))

    new_img = np.ones((640, 640, 3), dtype=np.uint8) * 122
    width, height = rotated_bbox_size
    if width < height:
        rotated_bbox_size = np.array([height, width])
        rotated_bbox_angle = rotated_bbox_angle - 90
    horizontal_rect = get_horizontal_rect(rotated_bbox_center, rotated_bbox_size)
    # drawPolygons(new_img, horizontal_rect, (0, 255, 255))
    # 输入角度为正值表示逆时针旋转
    rot_matrix = cv2.getRotationMatrix2D(rotated_bbox_center, -rotated_bbox_angle, 1.0)
    print("rot_matrix: ", rot_matrix)

    horizontal_rect = np.concatenate([horizontal_rect, np.ones((len(horizontal_rect), 1))], axis=-1)

    rot_box = horizontal_rect @ rot_matrix.T
    rot_box = rot_box.astype(np.int)
    drawPolygons(new_img, rot_box, (255, 0, 0))
    print(horizontal_rect, rot_box)

    concat_img = np.concatenate([img, new_img], axis=1)

    cv2.imshow('img', concat_img)
    cv2.waitKey(0)

到了这里,关于关于OpenCV中minAreaRect角度记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于从安全角度看机器学习:真实的故事

      今天,我们从安全的角度对机器学习进行考察,并回顾一些最有趣的事件。 机器学习如何应用于信息安全 一方面,机器学习帮助信息安全产品检测攻击,并帮助专家识别数据中新的依赖关系。另一方面,ML正在成为网络犯罪分子的工具之一。第三,机器学习本身也会有漏洞

    2024年02月11日
    浏览(31)
  • opencv 多角度模板匹配

    总结一下实现多角度模板匹配踩的坑 一 、多角度匹配涉及到要使用mask,首先opencv matchTemplateMask自带的源码如下: 可以看到使用用了四次dft来计算卷积,目标图像要与mask卷三次,来计算目标图像在模板区域内的和,平方和。其中最后一次CCorr(I, mask2)可以省略掉,它跟CCorr(I

    2024年02月07日
    浏览(35)
  • opencv人与摄像头距离、角度检测

    参考: https://chtseng.wordpress.com/2018/09/18/%E5%A6%82%E4%BD%95%E4%BC%B0%E7%AE%97%E5%89%8D%E6%96%B9%E4%BA%BA%E7%89%A9%E7%9A%84%E8%B7%9D%E9%9B%A2/ https://blog.csdn.net/captain5339/article/details/128857313

    2024年02月14日
    浏览(26)
  • 机器视觉初步4:Opencv简介与学习角度

    了解一个新应用的最好方式就是先去官网转转。 Opencv官网 OpenCV(开源的计算机视觉库)是基于BSD协议,因此它可免费用于学术和商业用途。其提供C++,C,Python和Java接口,支持Windows,Linux,Mac OS,iOS和Android。OpenCV致力于高效运算和即时应用开发。因其是用优化的C/C++编写的,故其可以充分

    2024年02月11日
    浏览(29)
  • opencv快速实现任意角度二维码矫正

    那天听到领导他们在讨论,说要将图片进行个矫正处理,还叫来了算法部的大佬来讨论将要如何处理这个,讨论场面很是激烈 不得不说好奇心是个很神奇的东西,就把我给吸引过去了 我定眼一看,感觉作为JAVA开发的我自己也能进行处理 因为看到了图片后,发现了图片中一个

    2024年02月05日
    浏览(51)
  • opencv实战--角度测量和二维码条形码识别

    首先导入一个带有角度的照片 然后下面的代码注册了一个鼠标按下的回调函数, 还有一个点的数列,鼠标事件为按下的时候就记录点,并画出点,由于点是画在图像上面的,那么就要求了img是需要刷新的所以将他们放在while True里面 当有按键按下的的时候就把图片归为原来的

    2024年02月16日
    浏览(48)
  • Python-opencv计算两条直线或者线段角度

    通过斜率关系计算,公式如下图: 需注意在求斜率时不要出现竖直情况,python计算会报错,但按理说应该可以计算出无穷的,此处先放这吧,等后期有时间再来解释这里原因。 通过余弦定理计算三点角度: 若三边为a,b,c ,则如图所示,在△ABC中: 使用前提:分母不要有

    2024年02月15日
    浏览(31)
  • 【软件工程导论】从已考完期末的角度记录软导常考内容

    什么是软件工程?它的目标和内容是什么? 软件工程是一种用科学知识和技术原理来定义、开发、维护软件的一门学科。软件工程是一门工程性学科,目的是成功的建造一个大型软件系统,所谓成功是要达到以下几个目标:付出较低的开发成本,达到要求的软件功能;取得较

    2024年02月11日
    浏览(33)
  • 【Spring专题】「技术原理」从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理

    ExceptionHandler是Spring框架提供的一个注解,用于处理应用程序中的异常。当应用程序中发生异常时,ExceptionHandler将优先地拦截异常并处理它,然后将处理结果返回到前端。该注解可用于类级别和方法级别,以捕获不同级别的异常。 在Spring中使用ExceptionHandler非常简单,只需在需

    2023年04月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包