OpenCV Python实现旋转矩形的裁剪

Python013

OpenCV Python实现旋转矩形的裁剪,第1张

环境

矩形操作是我们在 OpenCV 里最常用的操作,其中最为常见的就是包围框( Bounding Box )和旋转矩形( Rotated Box )。 其中包围框是最为常见的,对应 OpenCV 中的 boundingRect() ,使用正矩形框处物体,一般多用在目标检测中。使用包围框框柱目标物体,这种操作比较简单,但是通常框中也会有一些其他的区域。其次就是使用旋转矩形,也叫最小外接矩形,对应 OpenCV 中的 minAreaRect() ,用来使用旋转矩形最大限度的框出目标物体,减小背景干扰,在 OCR 任务中较为常用。

minAreaRect() 返回了所需区域的最小斜矩形的参数,与包围框直接返回四个顶点的坐标不同,最小外接矩形返回的是矩形的 ((x, y), (w, h), angle) ,对应了矩形的中心,宽度,高度和旋转角度。

旋转角度 angle 是水平轴( x 轴)逆时针旋转,与碰到的矩形的第一条边的夹角。并且这个边的边长是 width ,另一条边边长是 height 。也就是说,在这里 width 与 height 不是按照长短来定义的。

在 OpenCV 中,坐标系原点在左上角,相对于 x 轴,逆时针旋转角度为负,顺时针旋转角度为正,所以函数 minAreaRect() 返回的角度范围时 [-90~0) 。想象一个平放的长矩形,调用 minAreaRect() 返回的角度为 -90 度。如果我们旋转图像,直到矩形树立起来,这是调用 minAreaRect() 得到的角度依然是 -90 度。

第一种裁剪旋转矩形的方法是通过仿射变换旋转图像的方式。

仿射变换( Affine Transformation ) 是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”( straightness ,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”( parallelness ,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。)。

计算过程:

如果不做边长和角度的判断,则只会沿着 x 轴的顺时针方向做相同大小角度的旋转,不能保证旋转后的视角是正确的视角:

根据任务目标的类型,做边长和角度的判断并进行相应的调整,可以保证旋转后的视角是正确的视角:

第二种裁剪旋转矩形的方法是通过透视变换直接将旋转矩形的四个顶点映射到正矩形的四个顶点。

透视变换( Perspective Transformation )是将图片投影到一个新的视平面( Viewing Plane ),也称作投影映射( Projective Mapping )。

计算过程:

以上两种方法都可以用来抠取旋转矩形的内容。仿射变换方法需要预先对整张图进行旋转,通过观察旋转后的图像可以发现,有一部分图像被旋转出了图像边界,如果你要抠取的目标正好在图像边缘附近,那么很容易出界导致图像抠取的缺失。同时我们需要对宽、高和角度做出动态的调整;透视变换的方法直接对抠取区域进行了映射,这种方法可以省略旋转的步骤,并且不会出现抠取内容的缺失。同时我们只需要对4个顶点之间的映射关系做好定义即可,不需要考虑角度的问题。相对的,透视变换相对于仿射变换计算量更大一些,不过这在 c++ 的底层实现上带来的时延差距小于 ms 。

我把矩形和圆弧都用不同颜色填充了,你按照自己的需求修改一下吧,你的题目说的不清楚。

# Python3.6

# 使用turtle绘制Fibonacci螺旋

def draw_fibonacci(x):

    # F0=1

    # F1=1

    # Fn=F(n-1)+F(n-2)

    # 产生斐波那契数列,用于查表

    # 像这种计算复杂性指数增长的计算,不要写个函数去每次求一个数

    # 最好的办法是,按照规律写出查找表,用查找的方法来得到数据

    f_list = []

    for i in range(x):

        if i == 0:

            f_list.append(1)

        elif i == 1:

            f_list.append(1)

        else:

            f_list.append(f_list[i-1]+f_list[i-2])

    # 像素比例

    f0 = 50

    # 设置画笔属性

    turtle.pensize(5)

    turtle.pencolor("black")

    turtle.penup()

    turtle.home()

    turtle.pendown()

    for i in range(0, len(f_list)):

        # 绘制速度,1~10个不同速度等级,小于1或者大于10立即绘制

        turtle.speed(1)

        turtle.pendown()

        # 绘制矩形

        if i == 0:

            fill_color = "black"

        else:

            fill_color = (random.random(), random.random(), random.random())

        turtle.fillcolor(fill_color)

        turtle.begin_fill()

        turtle.forward(f_list[i]*f0)

        turtle.left(90)

        turtle.forward(f_list[i]*f0)

        turtle.left(90)

        turtle.forward(f_list[i]*f0)

        turtle.left(90)

        turtle.forward(f_list[i]*f0)

        turtle.left(90)

        turtle.end_fill()

        # 绘制圆弧

        fill_color = (random.random(), random.random(), random.random())

        turtle.fillcolor(fill_color)

        if i == 0:

            turtle.forward(f_list[i] * f0 / 2)

            turtle.begin_fill()

            turtle.circle(f_list[i] * f0 / 2, 360)

            turtle.end_fill()

            # 移动到一下起点

            turtle.forward(f_list[i] * f0 / 2)

            continue

        else:

            turtle.begin_fill()

            turtle.circle(f_list[i] * f0, 90)

            turtle.left(90)

            turtle.forward(f_list[i] * f0)

            turtle.left(90)

            turtle.forward(f_list[i] * f0)

            turtle.end_fill()

        # 移动到一下起点

        turtle.speed(0)

        turtle.penup()

        turtle.left(90)

        turtle.forward(f_list[i] * f0)

        turtle.left(90)

        turtle.forward(f_list[i] * f0)

    turtle.done()

if __name__ == "__main__":

    draw_fibonacci(6)

下面是我跑出来的结果:

用Python绘制螺旋文字

在前面的文章中小编使用Python已经绘制了较多的螺旋式的图案了,那么我们可以使用python将文字也用螺旋的方式绘制出来吗?答案是肯定的!下面小编来给大家介绍如何使用python绘制螺旋式的文字。

1

1

导入turtle库

from turtle import*

1

1

设置程序标题(标题可以自定义)

title("告白神器")

1

1

设置背景颜色

bgcolor('black')

1

1

定义一个变量,用于存放画笔的颜色

colors=['red','orange','yellow','green']

1

1

建立一个列表,用于存放文本内容

text=['I','love','you','forever']

1

1

将绘制的速度设置为0,加快绘制速度

speed(0)

1

1

使用循环语句控制绘制螺旋式的文字的次数

for i in range(70):

1

1

从变量colors中取出一个颜色作为画笔的颜色

pencolor(colors[i%4])

1

1

抬笔,停止绘制,使得绘制的文本之间不存留路径(线条)

penup()

1

1

绘制的文本之间需间隔一段距离,不致使得绘制的文本密集在一起

forward(i*6)

1

1

落笔,开始绘制

pendown()

1

1

设置文本的属性(内容、字体、字号)

write(text[i%4],font=("微软雅黑",int(i/4+4)))

1

1

向左旋转92度,形式螺旋的样式

left(92)

1

1

隐藏turtle,完成绘制

hideturtle()

1

1

好了,以上就是绘制螺旋文字的代码,下面我们来欣赏一下绘制的成果吧!

在这里插入图片描述

文章知识点与官方知识档案匹配

Python入门技能树人工智能深度学习

215740 人正在系统学习中

打开CSDN APP,看更多技术内容

python绘制旋风图

使用matplotlib对excel文件可以绘制旋风图。

编程语言习题集(1)

从今天开始,我们新开了一个栏目,叫做编程语言习题集,供大家对于常见的语言(Java、C#、C++、python、js)等进行相关的练习。与数理逻辑不同的是,我们这里是混合的,只挑选出容易错的题目来进行讲解。 1. C/C++ 1.1 Math.round(11.5) 等于多少 (). Math.round(-11.5) 等于多少 ( ) A.11 ,-11 B.11 ,-12 C.

继续访问

最新发布 Python——旋转字符串

用python解决经典算法题——旋转字符串

继续访问

python画彩色螺旋线图

python画彩色螺旋线图

继续访问

python 螺旋数组_黄哥Python:请大家来做题,数组螺旋输出

leetcode 上有一个题目,是数组顺时针螺旋输出,本人用Go 语言实现了,通过了测试,有兴趣的朋友,可以用Python 去实现。题目来源于leetcodehttps://leetcode.com/problems/spiral-matrix/Given a matrix of m x n elements (m rows, n columns), return all elements of ...

继续访问

打印n×n数字方阵python_Python实现打印螺旋矩阵功能的方法

本文实例讲述了Python实现打印螺旋矩阵功能的方法。分享给大家供大家参考,具体如下:一、问题描述输入N, 打印 N*N 螺旋矩阵比如 N = 3,打印:1 2 38 9 47 6 5N = 4,打印:1 2 3 412 13 14 511 16 15 610 9 8 7二、思路常规法是不断的对数据边界进行判断会很复杂,不妨考虑通过递归的解决每一层的数字。三、代码#coding:utf-8n = ...

继续访问

python生成扭曲带干扰验证码

python生成扭曲带干扰验证码,主要用于做训练集,可自行配置字体,干扰线数

python实现图形旋转_[宜配屋]听图阁

假设我们有一幅图像,图像中的文本被旋转了一个未知的角度。为了对文字进行角度的校正,我们需要完成如下几个步骤:1、检测出图中的文本范围2、计算出文本被旋转的角度3、将图像旋转特定的角度第一步、读取图像,并做二值化处理#读取图像,做二值化处理img = cv.imread('img/imageTextR.png')gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)cv...

继续访问

实现文字图片生成,文字图片旋转及文字图片扭曲(python版)

旋转和扭曲主要用到仿射变换及透视变换,直接上代码: #conding:utf-8 import cv2 import numpy as np from PIL import Image,ImageDraw,ImageFont,ImageOps width=30 height=30 #字体 font_path="C:\Windows\Fonts\msyhbd.ttf" img = Image....

继续访问

python识别文字是否颠倒_如何检测文本是否旋转180度或颠倒

检测文本是否旋转180度的一个简单方法是使用文本倾向于底部倾斜的观察结果。策略如下:将图像转换为灰度高斯模糊阈值图像找到阈值图像的上/下半部分roi计算每一半的非零数组元素阈值图像找到上半部分和下半部分的ROI接下来,我们拆分顶部/底部部分对于每一半,我们使用^{}计算非零数组元素。我们明白了('top', 4035)('bottom', 3389)如果两个像素的上半部比上半部大180度。如果它有...

继续访问

Python中曲率与弯曲的转换_4.13 Word 2016 艺术字的转换(弧形、跟随路径、弯曲排列)...

在 Word 2016 中,插入的艺术字有一项转换功能,它在艺术字样式的文字效果里。光从字面上看不容易看出是一项什么功能,其实是用于排列艺术字的,例如可以让艺术字弧形排列、跟随路径和弯曲排列。有了这项功能,Word 也能制作出原本只有图片处理软件才能制作出的文字排列效果。艺术字的“转换”分为两大类,一类是跟随路径,另一类是弯曲;前者只有四种样式,分别为:上弯弧、下弯弧、圆和按钮;而后者有36种样式...

继续访问

Python中用turtle库画旋涡

# 导入turtle import turtle # 笔的大尺寸 turtle.pensize(2) # 背景颜色 turtle.bgcolor("black") # 笔的颜色 colors = ["red","yellow","purple","blue","green"] # 如果想直接看成功图就加上这一行,不会看见画图的过程 turtle.tracer(False) # for循...

继续访问

案例:彩色螺旋文字

「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 案例:彩色螺旋文字 编程代码 import turtle turtle.Screen().bgcolor("black") pen = turtle.Pen() pen.speed(10) colors = ["red", "yellow", "blue", "green"] text = turtle.Screen().textinput.

继续访问

python 200次螺旋_用 Python 制作数字螺旋

Rikku 在无聊的时候经常会盯着一些非常枯燥而又有规律的事物发呆。比方说,Rikku 家里有一台洗衣机,它在洗衣服时,缸中的水是呈漩涡状的…好了,好了,你们尽管来鄙视我吧,这个怪诞的想法来着于 Rikku 家中洗衣机的水流漩涡:让数字从外至内以螺旋地形式排列,当然,是要用 Python 来实现。这是一个很有意思的挑战,下面是要达成的结果:1 2 310 11 49 12...

继续访问

python怎么画圆螺旋线_你对python实践感兴趣?教你使用python绘制彩色螺旋线

【摘要】希望通过本次课程让孩子或者家长了解一下python绘制图像的方法,对代码编程有个感性的认知。也好让大家能够理性选择,不要盲目跟从,选择适合自己当前阶段的学习内容,循序渐进,以兴趣自我探索为向导,所以这次的python绘制彩色螺旋线你需要了解。python绘制彩色螺旋线思路:旋转画线,每次画的长度是变量x的2倍,每次逆时针旋转91度,这样形成交叉螺旋,并不断扩大。python绘制彩色螺旋线代...

继续访问

Python输出螺旋形数组

Python输出螺旋形数组思路 思路 1、先初始化一个二维数组,从外向内,一圈圈填充。 2、每一圈由每组3个,共4组数构成。确定起点、数量、和方向即可用4个循环完成填充。 3、简化思路:循环第1组(蓝色),相应可以由步长3确定后面3组的位置,即循环1次即可。 按上图标数顺序依次填充即可完成一圈。 代码如下: #!/usr/bin/python3 # -*- coding: utf-8 _*_ ...

继续访问

python使用cv2库实现环形文字并旋转

python利用cv2实现环形文字

继续访问

螺旋状输出

总觉得做得很麻烦……Code: using System using System.Collections.Generic using System.Linq using System.Text namespace test3_1{

继续访问

python绘制六边形彩色螺旋线

效果图如下: 代码如下: # 导入turtle库 import turtle # 创建海龟画笔 t=turtle.Pen() # 调整海龟画笔速度 t.speed(0) # 创建颜色列表 colors=["red","yellow", "green", "blue","orange", "purple"] for i in range(90): # 通过索引取出列表颜色赋值给画笔 t.pencolor(colors[i%len(colors)]) # 画笔移动i t

继续访问

turtle绘图案例[难度2星]:螺旋文字(彩色/渐大/交互)

我喜欢turtle绘图,因为代码一点点的改动,总会带来意想不到的惊喜。 一些让我心动过的案例,分享给大家,也珍藏给自己。 ——Python教学路上的爬行者 案例1 单色螺旋文字 【效果预览】 看下图左上角的标题,写的是"Python Turtle Graphics”,翻译为“Python海龟绘图” 本文较长,建议收藏后慢慢享用 【代码参考】 # 案例1:单色螺旋文字 # 文字的颜色,也就是画笔的颜色,是由第5行代码控制。 import...

继续访问

python

深度学习