3.OPenCv绘图与交互

这篇博客详细介绍了如何使用OpenCV进行图像的绘图操作,包括直线、矩形、圆形、多边形以及文字的绘制。同时,展示了如何利用鼠标事件创建画笔功能,实现动态绘图。此外,还讲解了如何设置滚动条,通过它来改变图像的颜色。这些内容对于理解和实践OpenCV的图形交互非常有帮助。

opencv的绘图与交互
1、绘直线
cv2.line(画布,起点坐标,终点坐标,颜色,宽度)
例子:cv2.line(image,(20,60),(300,400),(0,0,255),2)
2、绘矩形
cv2.rectange(画布,起点,终点,颜色,宽度)
若宽度大于0,标识边线宽度;如果小于0,表示画实心矩形
例子:cv2.rectangle(image,(20,60),(300,400),(255,0,0),-1)
3、绘圆形
cv2.circle(画布,圆心坐标,半径,颜色,宽度)
若宽度大于0,标识边线宽度;如果小于0,表示画实心圆行
例子:cv2.circle(image,(300,300),40,(0,255,0),2)
4、绘多边形
cv2.polylines(画布,点坐标列表,封闭,颜色,宽度)
点坐标列表是一个numpy类型的列表,需要导入numpy 包
import numpy
创建点坐标: pts = numpy.array([[20,60],[300,280],[150,200]],numpy.int32)
例子:cv2.rectangle(image,[pts],True,(0,0,255),2)
5、添加文字
cv2.putText(画布,文字,位置,字体,大小,颜色,文字粗细)
例子:cv2.putText(image,‘apple’,(350,200),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2)
相关代码演示:

import cv2
import numpy
events = [i for i in dir(cv2) if 'EVENT' in i]
print(events)
cv2.namedWindow("example.png")  # 创建窗口
img = cv2.imread('example.png')  # 读取图像
cv2.line(img, (50, 50), (300, 300), (255, 0, 0), 2)  # 画直线
cv2.rectangle(img, (500, 20), (580, 100), (0, 255, 0), -1)  # 画矩形
cv2.circle(img, (500, 300), 40, (255, 255, 0), -1)  # 画圆形
pts = numpy.array([[300, 300], [300, 340], [350, 320]], numpy.int32)  # 用numpy形成坐标列表
cv2.polylines(img, [pts], True, (0, 255, 255), 2)  # 画多边形
cv2.putText(img, '测试', (350, 420), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 232, 133), 2)
cv2.imshow('example.png', img)
cv2.waitKey(0)
cv2.destroyWindow("example.png")  # 关闭窗口

6、用鼠标做画笔
cv2.setMouseCallback()创建鼠标事件回调函数,当鼠标事件发生时就会被执行。可以通过鼠标事件获得相对应的图片上的坐标。

#查看所有的鼠标事件

import cv2
events=[i for i in dir(cv2) if 'EVENT' in i] 
print(events)

相关代码:
创建了黑色画布,鼠标摁下时移动即可绘制图形,摁m键绘制矩形,摁q键退出

import cv2
import numpy as np
# 当鼠标按下时变为 True
drawing = False
# 如果 mode 为 true 绘制矩形。按下'm' 变成绘制曲线。 mode=True
ix, iy = -1, -1
# 创建回调函数    #回调函数包含两部分 一部分画矩形 一部分画圆圈
def draw_circle(event, x, y, flags, param):
    global ix, iy, drawing, mode
    # 当按下左键是返回起始位置坐标
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y
    # 当鼠标左键按下并移动是绘制图形。event 可以查看移动,flag 查看是否按下
    elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
        if drawing is True:
            if mode is True:
                cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
            else:
                # 绘制圆圈,小圆点连在一起就成了线,3 代表了笔画的粗细
                cv2.circle(img, (x, y), 3, (0, 0, 255), -1)
                # 下面注释掉的代码是起始点为圆心,起点到终点为半径的
                # r = int(np.sqrt((x - ix) ** 2 + (y - iy) ** 2))
                # cv2.circle(img, (x, y), r, (0, 0, 255), -1)
    elif event == cv2.EVENT_LBUTTONUP:  # 当鼠标松开停止绘画。
        drawing = False
img = np.zeros((512, 512, 3), np.uint8)
mode = False

cv2.namedWindow('image', 0)
cv2.setMouseCallback('image', draw_circle)
while True:
    cv2.imshow('image', img)
    k = cv2.waitKey(1)  # & 0xFF
    if k == ord('m'):
        mode = not mode
    elif k == ord("q"):
        break

7、使用滚动条绑定窗口
学习函数cv2.createTrackbar()

import cv2
import numpy as np
def nothing(x):
    pass
#创建一个黑色窗口
img = np.zeros((300, 512, 3), np.uint8)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)

# 创建改变颜色的滚动轮
cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)

# 创建一个滚动轮开关功能
switch = '0 : OFF \n1 : ON'
cv2.createTrackbar(switch, 'image', 0, 1, nothing)
# 只有当 转换按钮 指向 ON 时 滑动条的滑动才有用,否则窗户 都是黑的。
while True:
 # 获取四个滚动论的位置
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    s = cv2.getTrackbarPos(switch, 'image')  # 另外一个重要应用就是用作转换按钮
    if s == 0:
        img[:] = 0
    else:
        img[:] = [b, g, r]
    cv2.imshow('image', img)
    k = cv2.waitKey(1)  # & 0xFF
    if k == ord("q"):
        break
cv2.destroyAllWindows()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值