图形的绘制

发布时间:2023年12月20日

画线,画矩形,画圆,画椭圆,画多边形,绘制字体

绘制直线

绘制直线相关知识

画线的API: line(img,开始点,结束点,颜色……)

img:在哪张图像上画线

开始点,结束点:指定线的开始与结束位置

颜色,线宽(-1线宽是填充),线型

shift:坐标比例缩放(使用默认值就可以)

绘制直线实战代码

import cv2
import numpy as np

#先创建一个全黑的背景
img = np.zeros((480, 640, 3), np.uint8)

# 画线,坐标电为(x,y)   图像,起始点,终止点,颜色,线宽,线的种类
cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4)
cv2.line(img, (80, 100), (300, 480), (255, 0, 0), 5, 16)

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

?cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4) 我们画线时这几个参数要了解,5代表的是我们画出图形的线宽,而4是我们画出图像的线型(4带有锯齿,可以与12对比)

绘制矩形

绘制矩形相关知识

绘制矩形API :rectang(img,起始点,终止点,颜色,线宽)

img:在哪张图像上画线

起始点,终止点:就是矩形对角的点位置

绘制矩形实战代码

import cv2
import numpy as np

# 先创建一个全黑的背景
img = np.zeros((480, 640, 3), np.uint8)

# 画矩形
cv2.rectangle(img, (10, 10), (100, 100), (0, 0, 255), -1)

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

绘制圆形?

绘制圆形相关知识

绘制圆形API:circle(img,中心点,半径,颜色,……)

img:在哪张图像上画线

中心点:绘制的圆的中点

半径:绘制的圆的半径

绘制圆形实战代码

import cv2
import numpy as np

# 先创建一个全黑的背景
img = np.zeros((480, 640, 3), np.uint8)

# 画圆
cv2.circle(img, (320, 240), 100, (0, 0, 255))
cv2.circle(img, (320, 240), 5, (0, 0, 255), -1)  # -1是填充

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

绘制椭圆

绘制椭圆相关知识

绘制椭圆API

ellipse(img,中心点,长度的一半,角度,从哪个角度开始,到哪个角度结束……)

img:在哪张图像上画线

中心点:和圆类似,也有一个中心点

长度的一半:其实指的是椭圆外接矩阵长和宽的一半,也就是设置下图中的x和y

?角度:角度值的也是外接矩形的角度

绘制椭圆实战代码

在进行实战之前我们思考,如果想画一个椭圆(在长为200,宽为100的矩形中)如何设定参数?

import cv2
import numpy as np

#先创建一个全黑的背景
img = np.zeros((480, 640, 3), np.uint8)

#画椭圆
#图像名称 中心点 椭圆长宽的一半(外界长方形的长宽的一半) 外接矩形的起始位置 椭圆的起始点沿顺时针旋转的角度 椭圆旋转的角度 颜色 线形
cv2.ellipse(img,(320,240),(100,50),0,0,360,(0,0,255),1)



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

此时我们观察到椭圆画出来了,但是我们需要思考代码中的? 0,0,360 代表什么含义

cv2.ellipse(img,(320,240),(100,50),0,0,360,(0,0,255),1)

我们可以对其进行修改,先对0,0,360后面两个值进行修改。修改成0,0,180

cv2.ellipse(img,(320,240),(100,50),0,0,180,(0,0,255),1)

发现只画出了半个椭圆,所以可以明白,后面的两个数据就是在API中提到的(从哪个角度开始,到哪个角度结束)。

接下来先对0,0,360前一个值进行修改。修改成90,0,360

cv2.ellipse(img,(320,240),(100,50),90,0,360,(0,0,255),1)

发现整个椭圆顺时针旋转了90度,也就是在API部分提到的矩形先旋转90度,再在旋转后的矩形中画椭圆。

绘制多边形

绘制多边形相关知识

绘制多边形API:polylines(img,点集,是否闭环,颜色,……)

img:在哪张图像上画线?

点集:就是多边形上面一个个的点(32位)

是否闭环,True(闭)? 或? False

如果想要填充多边形,不可以将线宽设置为-1,需要使用fillpoly

fillpoly(img,点集,颜色)?

绘制多边形实战代码

import cv2
import numpy as np

# 先创建一个全黑的背景
img = np.zeros((480, 640, 3), np.uint8)

# 多边形的绘制
pts = np.array([(300, 10), (150, 100), (450, 100)], np.int32)  # 必须要写int32
cv2.polylines(img, [pts], True, (0, 0, 255))
# 多边形的填充
cv2.fillPoly(img, [pts], (255, 255, 0))

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

?代码中最需要注意的就是一定是32位的,并且只可以使用int32。

绘制文本

绘制文本相关知识

绘制文本API:putText(img,字符串,起始点,字体,字号,……)

绘制文本实战代码

import cv2
import numpy as np

# 先创建一个全黑的背景
img = np.zeros((480, 640, 3), np.uint8)

# 绘制文本  1所在位置表示字体 3所在位置表示字号
cv2.putText(img, 'hello world', (10, 300), 1, 3, (0, 255, 0))

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

?

综合实战(使用鼠标进行基本图像的绘制)

希望实现的基本功能,按住鼠标滑动可以画出我们想要的图案,按键盘不同键绘制出不同的图形。

思考需要的API,首先如果要绘制图形的话,就一定用到上面提到的绘制各种图形的API,并且由于需要鼠标控制,就需要设置鼠标回调函数的知识(在窗口中鼠标控制相关内容-CSDN博客? 可以参考这篇文章关于鼠标回调函数的内容)。

# 基本功能,通过鼠标进行基本图形的绘制
# 1 可以画线 :用户按下l键,即选择了画线。此时滑动鼠标即可画线
# 2 可以画矩形 :当用户按下r,即选择了画矩形。此时滑动鼠标即可画矩形
# 3 可以画圆形 :当用户按下c,即选择了画圆形。此时滑动鼠标即可画圆形
import cv2
import numpy as np

# 设置curshape=0时画线,设置curshape=1时矩形,设置curshape=2时画圆
curshape = 0
startpos = (0, 0)

# 创建窗口
cv2.namedWindow('drawshape', cv2.WINDOW_NORMAL)

# 显示窗口和背景q
img = np.zeros((480, 640, 3), np.uint8)  # (高,宽,3)


# 鼠标回调函数
def mouse_callback(event, x, y, flags, userdata):
    # print(event,x,y,flags,userdata)

    # UnboundLocalError: cannot access local variable 'startpos' where it is not associated with a value
    # 解决上述local的问题,把这个两个变为全局变量,如下
    global curshape, startpos

    # 左键按下,获得起始点  左键抬起,获得结束点  点就是这样  矩形是对角点  圆是中心点到半径
    if (event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN):
        startpos = (x, y)
    elif (event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP):
        if (curshape == 0):  # drawline
            cv2.line(img, startpos, (x, y), (0, 0, 255))
        elif (curshape == 1):  # drawrectangle
            cv2.rectangle(img, startpos, (x, y), (0, 0, 255))
        elif (curshape == 2):  # drawcircle
            a = (x - startpos[0])
            b = (y - startpos[1])
            r = int((a ** 2 + b ** 2) ** 0.5)
            cv2.circle(img, startpos, r, (0, 0, 255))
        else:
            print('error:no shape')


# 设置鼠标回调
cv2.setMouseCallback('drawshape', mouse_callback)

while True:
    cv2.imshow('drawshape', img)
    key = cv2.waitKey(30)
    if (key & 0xFF == ord('q')):
        break
    elif (key & 0xFF == ord('l')):
        curshape = 0
    elif (key & 0xFF == ord('r')):
        curshape = 1
    elif (key & 0xFF == ord('c')):
        curshape = 2

cv2.destroyAllWindows()

?运行结果就是按下不同的键盘按键,会绘制出不同的图片,大家可以自己进行实操。

?

?

?

?

文章来源:https://blog.csdn.net/xiongmaowangd/article/details/135046487
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。