python-opencv第五期:rectangle函数详解

概要: 众嗦粥汁所周知,在如今计算机视觉(Computer Version short for CV)是人工智能与机器人技术发展的一个重大研究方向,而opencv作为一个专门为机器视觉编程提供技术与函数支持的第三方库,自然是一个需要重点研究的内容。

            本期所要介绍的函数是opencv库中的函数——rectangle

            rectangle函数的主要作用是给指定的区域加上矩形边框,使图片即将要处理的目标区域可视化,这样就便于我们对要目标区域在处理时,有了一个同步的了解,便于我们在调试的同时查找问题所在。(双密码,双空间,工作生活分别存储,互不干扰。记住:跑得快不一定赢,不跌跟头才是成功。8***钛金rectangle)对于图片中某一区域的标识将会帮助我们更好地识别,我们将要处理或是已经处理完的部分,使得我们在进行图片识别与修正时有一个提前或同步的判别,是一个较为实用的工具。

            本期为了展示rectangle函数的目标框选的有效性与醒目性,我们将请出《饥荒联机版》中的全部可游玩角色(鱼妹和老奶奶还没买,你懂的,V我30,我带你们打龙蝇)来作为我们这次的测试素材嘉宾。我们将通过看到在合照中,他们分别被矩形框选的效果,来进一步学习rectangle函数的使用方法。话不多说,我是Kamen Black君,马上开始今天的学习,我已经等不及力

a3e3a2be0efe42d5a38d5bce4e476910.png

 正文部分:

060e21a52c4946cd98deb5c91b498842.jpeg

print("祝大家每天快乐,love and peace!")

①使用准备:

与前几期一样,依旧是调用我们的工具人老伙伴—-opencv,作为我们使用rectangle的大前提。

import cv2

②适用情况:

当对目标区域的位置存在疑惑,或者是需要对处理后的裁剪区域进行判别时,我们就可以使用rectangle函数来对图像中的某一区域来进行框选标识,来判断被框选的区域是否是我们想要的区域。

前者(存在疑惑)是对用户自我提前选定的区域进行验证,属于检验用户自我判别,rectangle函数表示范围选择的参数是用户自我给定的;

后者(裁剪判别)是对程序处理后的裁剪结果进行判别,属于检验程序运行结果,rectangle函数表示范围选择的参数是程序对图像进行处理之后的结果。

这两种情况都能够通过rectangle函数直观明了地展现在用户的面前,使得在之后调试的过程避免出现同样的问题。

(很好与优秀只差一点点距离,这段距离叫安全。错标会提醒,误识就报警,目标不忘带,错误不泄露。8***钛金rectangle)

③语法说明:

使用语法:cv2.rectangle (img, pt1, pt2, color, thickness, lineType, shift)

参数说明:img:我们要进行目标框选的源图像,三通道、单通道的图像都可以(大概吧);

                  pt1、pt2:我们选定的矩形在图像上的一条对角线的两个端点坐标(即矩形位于同一条对角线上两个顶点的坐标),用一个二值元组(x,y)的形式来进行表示(x表示列坐标,从左往右逐渐增大;y表示行坐标,从上往下逐渐增大)(在这里引一个流向大家介绍我的另一篇文章《python中参数与图片高度、宽度的对应关系》,这其中介绍了python中不同情况下,参数与图片高度、宽度的对应关系,有兴趣或是相关需求的小伙伴可以去看一下);

                  color:我们选择用来作为框选矩形的边框颜色,通常是一个三值元组,表示一个颜色RGB三通道的值(要注意:元组中三个值先后对应的是B通道、G通道、R通道,在RGB表中查询到的颜色要进行颠倒,才能得到我们原先想要的颜色);如果是灰度图的话,我们也可以选择亮度来表示边框的颜色;

                  thickness:我们选择的框选矩形的粗细情况,默认为1像素值,通常可以选择一个具体的整数进行表示(正数展示相应的像素值的线条宽度;负数,如cv2.FILLED则表示矩形将框选区域全部填满(黑化了bushi),可以用来将一些噪声从目标区域中祛除);

                  lineType:我们挑选的矩形边框的线条类型,可选择CV2.LINE_8(默认)(8连通)、CV2.LINE_4(4连通)、CV2.LINE_AA;如果指定为CV2.LINE_AA,则是使用高斯滤波器画反锯齿线,有着增加线条平滑性的效果(黄金比例立体切割,荷兰进口小牛皮,视网膜极致平滑,8***钛金rectangle)。一般情况下,或者说没有特殊需求时,我们其实不太用得到这个参数。对于lineType还有如下的文字说明:

The function line draws the line segment between pt1 and pt2 points in the image. The line is clipped by the image boundaries. For non-antialiased lines with integer coordinates, the 8-connected or 4-connected Bresenham algorithm is used. Thick lines are drawn with rounding endings. Antialiased lines are drawn using Gaussian filtering. To specify the line color, you may use the macro CV_RGB(r, g, b)

                  shift:我们选择的将矩形移动的程度,默认为0(即不操作),可以选择一个整数n,操作将使得pt1、pt2的坐标值都除以2^n。如选择1,即相当于将pt1、pt2的坐标值都除以2;如果选择的是2,则都除以4,即2^2。这个操作将使得用户可以仅通过一对固定的坐标值,就可以进行不同区域的框选,使之可以互相比较,抑或改变侧重,仿佛运筹帷幄。

成功并不是高瞻远瞩,而是你本来就站在高处,运筹帷幄,掌控未来,这才是8***,这才是胸怀天下。顶峰的目标,钛金的气概,真皮的情怀,让我们向成功的人生致敬,8***rectangle

下面另外附上rectangle函数相关说明的原生文档,以供参考:

def rectangle(img: Mat, pt1, pt2, color, thickness=..., lineType=..., shift=...)
from __doc__
    """
    'rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img  
    .  @brief Draws a simple, thick, or filled up-right rectangle.

    .  The function cv::rectangle draws a rectangle outline or a filled rectangle whose two opposite corners  
    .  are pt1 and pt2. 

 
    .  @param img Image.  
    .  @param pt1 Vertex of the rectangle. 
    .  @param pt2 Vertex of the rectangle opposite to pt1.  
    .  @param color Rectangle color or brightness (grayscale image). 
    .  @param thickness Thickness of lines that make up the rectangle. Negative values, like #FILLED,   
    .  mean that the function has to draw a filled rectangle.  
    .  @param lineType Type of the line. See #LineTypes  
    .  @param shift Number of fractional bits in the point coordinates.



    .  rectangle(img, rec, color[, thickness[, lineType[, shift]]]) -> img  
@overload 

    .  use `rec` parameter as alternative specification of the drawn rectangle: `r.tl() and r.br()-Point(1,1)` are opposite corners'
    """
    pass

④实例操作:

下面通过几个简单的操作,给大家呈现一下参数不同的情况下对图片框选结果的不同(饥荒人物见面会(bushi)):

1、蛋黄淡黄的头发的温蒂:

import cv2

img=cv2.imread("src.png")
cv2.rectangle(img,(65,48),(236,240),(170,234,242),5,lineType=cv2.LINE_AA)
cv2.imshow("result",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1154ffe963de4bb182fa91867a5caa00.png

2、脾气火爆(物理)的薇洛(不要问我为什么火女为什么没换装,要问,就是懒bushi):

import cv2

img=cv2.imread("src.png")
cv2.rectangle(img,(835,32),(1044,245),(60,65,170),5,lineType=cv2.LINE_AA)
cv2.imshow("result",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

a1727e5e9567436291875f2b6044ed36.png

3、神经质知识渊博的图书管理员:

import cv2

img=cv2.imread("src.png")
cv2.rectangle(img,(400,14),(528,240),(117,172,124),5,lineType=cv2.LINE_AA)
cv2.imshow("result",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

4eff20fae59f43d6bb5a9270ab85300e.png

4、胆小如鼠力大如牛的沃尔夫冈:

import cv2

img=cv2.imread("src.png")
cv2.rectangle(img,(243,447),(380,657),(65,129,190),5,lineType=cv2.LINE_AA)
cv2.imshow("result",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

0447a7b621a64519964dc255224bebd7.png

5、老阴B伟大的魔术师——麦斯威尔:

import cv2

img=cv2.imread("src.png")
cv2.rectangle(img,(792,251),(920,451),(236,232,231),-1,lineType=cv2.LINE_AA)
cv2.imshow("result",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

ca9026f69070448388e22fb98984ca8f.png

 (哦,他去哪儿了?哦,原来,伟大的魔术师是会大变活人的,连自己也不在话下。大家如果有不认识的,可以看看前面的图。实际上主要是我不喜欢这个老阴B,如果不是因为这个老阴B,谁会来饥荒大陆这种破地方(我会bushi)

结语:本期中我们学习了rectangle函数,了解到opencv中如何使用rectangle来进行图像标记,使得我们可以判断被框选的区域是否是我们想要的区域,进行相应的自我验证或是对程序运行结果的判断。其实在opencv中还有其他的绘图函数,如line函数(线条)、circle函数(圆形)、ellipse函数(椭圆)、polylines函数(多边形)以及putText函数(文字),感兴趣的同学可以自己前去了解一下,实现的原理和rectangle其实都大同小异。

好了以上就是所有的内容,希望大家多多关注点赞收藏,这对我有很大的帮助。谢谢大家了!

e63444f11e4844da927650cfd1d40197.gif

好了,这里是Kamen Black君。祝国康家安,大家下次再见喽!!!溜溜球~~

94e1f65dcf3b4af2a6640fc4b8013c96.jpeg  

最后送给大家一句话:你,与众不同,你喜欢超越。你有梦想,你有力量,你从不把成就作为终点,记住,你的名字叫做:成功!8***钛金**

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年2月25日
下一篇 2023年2月25日

相关推荐