cv2-基础图像绘制

cv2绘图功能

基础图像

绘制直线

绘制直线
image=cv2.line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
""" 输入参数
img 		要在上面画线段的图像
pt1 		线段的第 1 个点(x,y)
pt2 		线段的第 2 个点(x,y)
color 		线段的颜色
thickness 	线段的粗细	thickness=-1 表示填充
lineType    线段的类型	产生线的算法,像素级别
shift 		坐标精确到小数点后第几位

返回参数
img  		画完线段的输入图像
"""

c1 = [0,0]
c2 = [255,255]
img=cv2.line(im0, c1, c2, [225, 0, 255], -1, cv2.LINE_AA) 

绘制矩形

绘制矩形
image = cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
"""
img 		要在上面画线段的图像
pt1 		矩形的左上顶点(x,y)
pt2 		矩形的右下顶点(x,y)
color 		线段的颜色
thickness 	线段的粗细	thickness=-1为填充颜色
lineType    线段的类型	产生线的算法
shift 		坐标精确到小数点后第几位
"""
c1=(0,0)
c2=(200,200)
img=cv2.rectangle(im0, c1, c2, [225, 0, 255], 2, cv2.LINE_AA) 

绘制圆形

绘制圆
image = cv2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None)
""" 输入参数
img 		要在上面画线段的图像
center 		圆的圆心坐标(x,y)
radius 		圆的半径
color 		线段的颜色
thickness 	线段的粗细	thickness=-1为填充颜色
lineType    线段的类型	产生线的算法
shift 		坐标精确到小数点后第几位
"""
center=(100,100)
radius= 50

img=cv2.circle(img, center, radius,[255,0,255], 2, cv2.LINE_AA)

绘制椭圆


绘制椭圆
img=cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=None, lineType=None, shift=None)
""" 输入参数
img 		要在上面画线段的图像
center 		椭圆圆的圆心坐标(x,y)
axes 		椭圆的轴长  (长轴长度的一半, 短轴长度的一半)
angle 		椭圆沿水平方向逆时针旋转的角度
startAngle	沿长轴顺时针方向开始显示的角度
endAngle	沿长轴顺时针结束显示的角度
color
thickness 	线段的粗细	cv.FILLED
lineType    线段的类型	产生线的算法
shift 		坐标精确到小数点后第几位

"""
center=(200,200)
axes= (200, 100)
angle = 0 

startAngle = 0
endAngle = 0
cv2.ellipse(img, center, axes, angle, startAngle, endAngle, [255,0,255], 1, cv2.LINE_AA)


绘制多边形

绘制多边形
polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None)
""" 输入参数
img 		要在上面画线段的图像
pts 		矢量的列表   pts.shape=(len,1,2)
isClosed 	true代表形成一个封闭的多边形,false代表只是连接各顶点,而非封闭
color
thickness 	线段的粗细	cv.FILLED
lineType    线段的类型	产生线的算法
shift 		坐标精确到小数点后第几位

"""
案例
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))

cv.polylines(img,[pts],True,(0,255,255)) 

cv2.polylines(im0, [custom], isClosed=True, color=(255, 255, 0), thickness=2)  # 多边形

写入文字

# 写入文字
cv2.putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
"""输入参数
img 		要在上面画线段的图像
text		要出入的文字
org			左下点坐标 注意是左下点
fontFace	字体类型
fontScale	字体大小
color		文字颜色
thickness 	字体的粗细	
lineType    线段的类型	产生线的算法
bottomLeftOrigin 		
"""

org 左下点坐标 注意是左下点

# 计算文本的宽高,baseLine
cv2.putText 一般和cv2.getTextSize  合用
retval, baseLine = cv2.getTextSize(text, fontFace, fontScale, thickness)
"""输入参数
text		需要写入的文本
fontFace	字体类型
fontScale 	字体大小
thickness	字体粗细
返回参数
retval    字体的长、宽
baseLine  基线的高度
"""

# 案例
# 将文字输出到矩形框里面
text='xinao1234'

t_size,_ = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, thickness=3)

x1y1=(0,0)
x2y2=x1y1[0]+t_size[0],x1y1[1]-t_size[1]  

# putText的输入坐标是左下点  故y2=x1y1[1]-t_size[1] 
cv2.rectangle(im0, x1y1, x2y2, [255, 255, 255], -1, cv2.LINE_AA)
cv2.putText(img,text,x1y1,cv2.FONT_HERSHEY_SIMPLEX,1,[0, 0, 0], thickness=3, lineType=cv2.LINE_AA)

鼠标为画笔

def mouse_envent_and_plot(img):

    xylist = []
    xylist2 = []

    def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
        if event == cv2.EVENT_LBUTTONDOWN:
            xy = "%d,%d" % (x, y)
            cv2.circle(img, (x, y), 2, (0, 0, 255), thickness=-1)
            cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN,
                        1.0, (0, 0, 0), thickness=2)
            cv2.imshow("image", img)
            xylist.extend([x / 768, y / 1024])
            xylist2.extend([x, y])

    def on_Mouse():
        return cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN)   # 回调函数绑定时间


    img = cv2.resize(img, (768, 1024))
    cv2.namedWindow("image")
    cv2.resizeWindow('image', 700, 900)  # 自己设定窗口图片的大小
    on_Mouse()

import numpy as np
import cv2


mode = 0

# 创建回调函数
def OnMouseAction(event, x, y, flags, param):
    global x1, y1
    img = img1

    if mode == 0 and event == cv2.EVENT_LBUTTONDOWN:
        print("左键点击")
        cv2.line(img, (0, 0), (x, y), (255, 255, 0), 2)

    if mode == 1 and event == cv2.EVENT_LBUTTONDOWN:
        print("左键点击1")
        x1, y1 = x, y
    elif mode == 1 and event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
        print("左鍵拖曳1")
        cv2.rectangle(img2, (x1, y1), (x, y), (0, 255, 0), -1)


img1 = np.zeros((500, 500, 3), np.uint8)
img2 = np.zeros((500, 500, 3), np.uint8)
cv2.putText(img1, '1', (200, 200), cv2.FONT_HERSHEY_SIMPLEX, 4, (255, 0, 0))
cv2.putText(img2, '2', (200, 200), cv2.FONT_HERSHEY_SIMPLEX, 4, (255, 0, 0))
cv2.namedWindow('image1')
cv2.namedWindow('image2')
cv2.setMouseCallback('image1', OnMouseAction)

while (1):
    cv2.imshow('image1', img1)
    cv2.imshow('image2', img2)
    # cbf()
    k = cv2.waitKey(1)
    if k == ord('l'):
        mode = 0
    elif k == ord('t'):
        mode = 1
    elif k == ord('q'):
        break
cv2.destroyAllWindows()

posted @ 2021-12-02 11:15  贝壳里的星海  阅读(693)  评论(0编辑  收藏  举报