zoukankan      html  css  js  c++  java
  • opencv学习(三)——绘图功能

    绘图功能

    我们将学习以下函数:cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText()等。

    在这些功能中,有一些相同的参数:

    • img:你要绘制形状的图像。
    • 形状的颜色。对于BGR,将其作为元组传递,例如:(255,0,0)对于蓝色。对于灰度,只需传递标量值即可。
    • thickness: 线或圆等的厚度。如果传 -1 就是像圆的闭合图形,它将填充形状。默认 thickness = 1。
    • lineType:线条类型,如 8 连接线,抗锯齿线等。默认情况下,是 8 连接线。cv.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线。

    一、画线

    要绘制一条线,需要传递线的开始和结束坐标。我们将创建一个黑色图像,并从左上角到右下角在其上绘制一条蓝线。

    import cv2 
    import numpy as np
    
    def cv_show(name, img):
        cv2.imshow(name, img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
        
    #创建黑色的图像
    img = np.zeros((512, 512, 3), np.uint8)
    #绘制一条厚度为5的蓝色对角线
    line = cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
    cv_show('line', line)
    

    image

    二、画矩形

    要绘制矩形,需要矩形的左上角和右下角。这次,我们将在图像的右上角绘制一个绿色矩形。

    rectangle = cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)
    cv_show('rectangle', rectangle)
    

    image

    三、画圆圈

    要绘制一个圆,需要其中心坐标和半径。我们将在上面绘制的矩形内绘制一个圆。

    circle = cv2.circle(img, (447, 63), 63, (0, 0, 255), -1)
    cv_show('circle', circle)
    

    image

    四、画椭圆

    要绘制椭圆,我们需要传递几个参数。一个参数是中心位置(x,y)。第二个参数是轴长度(长轴长度,短轴长度)。angle是椭圆沿逆时针方向旋转的角度。startAngle和endAngle表示从主轴沿顺时针方向测量的椭圆弧的开始和结束。如整圆就传 0 和 360。

    elipse = cv2.ellipse(img, (256, 256), (100, 50), 0, 0, 180, (15, 255, 212), -1)
    cv_show('elipse', elipse)
    

    image

    五、画多边形

    要绘制多边形,首先需要顶点的坐标。将这些点组成形状为 ROWSx1x2 的数组,其中 ROWS 是顶点数,并且其类型应为int32。在这里,我们绘制了一个带有四个顶点的黄色小多边形。

    pts = np.array([
        [10, 5],
        [20, 30],
        [70, 20],
        [50, 10]
    ], np.int32)
    pts = pts.reshape((4, 1, 2))
    polylines = cv2.polylines(img, [pts], True, (0, 255, 255))
    cv_show('polylines', polylines)
    

    如果第三个参数为False,您将获得一条连接所有点的折线,而不是闭合形状。cv.polylines()可用于绘制多条线。只需创建要绘制的所有线条的列表,然后将其传递给函数即可。所有线条将单独绘制。与为每条线调用cv.line相比,绘制一组线是一种更好,更快的方法。

    六、向图像添加文本

    在图像上加文字,你需要指定以下内容。

    • 你想写的文字数据。
    • 你想写的位置坐标 (如 左下角开始)。
    • 字体类型。
    • 常规的如颜色,粗细,线型等。为了更好看,线型使用 lintType = cv.LINE_AA。

    我们将在图像上写一个白色的 ”OpenCV“。

    font = cv2.FONT_HERSHEY_SIMPLEX
    text = cv2.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv2.LINE_AA)
    cv_show('text', text)
    

    image

    import cv2 
    import numpy as np
    
    def cv_show(name, img):
        cv2.imshow(name, img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
        
    #创建黑色背景
    background = np.zeros((512, 512, 3), np.uint8)
    
    #画红圆
    red_circle = cv2.circle(background, (256, 122), 50, (0, 0, 255), 40)
    cv_show('red_circle', red_circle)
    
    #画绿圆
    green_circle = cv2.circle(background, (172, 282), 50, (0, 255, 0), 40)
    cv_show('green_circle', green_circle)
    
    #画蓝圆
    blue_circle = cv2.circle(background, (342, 282), 50, (255, 0, 0), 40)
    cv_show('blue_circle', blue_circle)
    
    #画线(三角形)
    pts1 = np.array([
        [256, 122],
        [202, 202],
        [312, 202]
    ], np.int32)
    pts1.reshape((3, 1, 2))
    pts2 = np.array([
        [162, 282],
        [196, 202],
        [270, 278]
    ], np.int32)
    pts2.reshape((3, 1, 2))
    pts3 = np.array([
        [352, 282],
        [292, 202],
        [402, 202]
    ], np.int32)
    pts3.reshape((3, 1, 2))
    fillline = cv2.fillPoly(background, [pts1, pts2, pts3], (0, 0, 0))
    cv_show('fillline', fillline)
    

    image

  • 相关阅读:
    工作总结(二):Web Design
    工作总结(一):Linux C
    三十分钟学会AWK
    MySQL并发复制系列二:多线程复制 2016
    修改MySQL 5.7.9版本的root密码方法以及一些新变化整理
    sync_binlog innodb_flush_log_at_trx_commit 浅析
    MariaDB的"response time"插件
    Python学习九:列表生成式
    python中的深拷贝和浅拷贝理解
    Mycat 配置
  • 原文地址:https://www.cnblogs.com/mogebw/p/15650587.html
Copyright © 2011-2022 走看看