2.opencv——图像用户界面操作

窗口操作

1.创建窗口

\qquad cv2.imshow()函数在显示图像时,指定的窗口如果不存在,则会按默认设置创建一个窗口,窗口大小由图像大小决定,且不能更改。cv2.namedWindow()函数用于创建窗口,其基本格式如下。

cv2.namedWindow(winname[,flags])

其中,winname 为窗口名称,flags 为表示窗口属性的常量。如果已存在指定名称的窗口,函数将无效。常用的窗口属性常量如下:

属性 解释
cv2.WINDOW_NORMAL 用户可以调整窗口大小,无限制
cv2.WINDOW_AUTOSIZE 默认值,用户无法调整窗口大小,窗口大小由显示的图像决定
cv2.WINDOW_FULLSCREEN 窗口将全屏显示
cv2.WINDOW_GUI_EXPANDED 窗口中可显示状态栏和工具栏
cv2.WINDOW _FREERATIO 窗口将尽可能多地显示图片(无比例限制)
cv2.WINDOW_KEEPRATIO 窗口由图像的比例决定
import numpy
import cv2


img = numpy.zeros((240, 320), dtype=numpy.uint8)    # 创建黑色图像
img[70:170, 110:210] = 255                          # 设置白色区域
cv2.namedWindow('test3-1', cv2.WINDOW_NORMAL)       # 创建普通窗口
cv2.imshow('test3-1', img)                          # 在窗口中显示图像
cv2.waitKey(0)

在这里插入图片描述

2.关闭和调整窗口

\qquad OpenCV 提供了以下两个用于关闭窗口的函数。分别是cv2.destroyAllWindows(),cv2.destroyWindow (winname)。其中cv2.destroyAllWindows()是关闭所有窗口,而cv2.destroyWindow (winname)是关闭指定名称的窗口。
cv2在调整窗口大小上提供了cv2.resizeWindow()函数来更改窗口大小,其基本格式如下。

cv2.resizeWindow(winname,size)

其中,winname 为窗口名称,size 为表示窗口大小的二元组。

import cv2


img = cv2.imread('lena.jpg')  	 # 读取图像
s = img.shape
cv2.imshow('lena', img)          # 显示图像
key = cv2.waitKey(500)
cv2.resizeWindow('lena', (s[0]//2, s[1]//2))
cv2.waitKey(0)

在这里插入图片描述

绘图

\qquad OpenCV提供的绘图函数可用于绘制直线,矩形,圆,椭圆,多边形以及文本等。

1.绘制直线

cv2提供了cv2.line()函数用于绘制直线,其语法格式如下:

cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

其参数说明如下:

参数 解释
img 为用于绘制图像的图像
pt1 为直线段的起点坐标
pt2 为直线段的终点坐标
color 为直线段的颜色。通常使用 BGR 模型表示颜色,如(255,0,0)表示蓝色
thickness 表示线条粗细。默认值为 1,设置为-1时表示绘制填充图形
lineType 表示线条类型,默认值为 cv2.Line_8。线条类型可设置为以下常量:cv2.FILLED:填充;cv2.LINE_4:4 条连接线;cv2.LINE_8:8条连接线;cv2.LINE_AA:抗锯齿线,线条更平滑。
shift 表示坐标的数值精度,一般情况下不需要设置
import numpy as np
import cv2


img = np.zeros((200, 320, 3), np.uint8)                   # 创建一幅黑色图像
cv2.line(img, (0, 0), (320, 200), (0, 0, 255), 10)        # 画对角线1,红色
cv2.line(img, (320, 0), (0, 200), (0, 255, 0), 5)         # 画对角线2,绿色
cv2.imshow('draw', img)                                   # 显示图像
cv2.waitKey(0)

在这里插入图片描述

2.绘制矩形

cv2.rectangle()函数用于绘制矩形,其语法格式如下:

cv2.rectangle(img,ptl,pt2,color[,thickness[,linetype[,shift]]])

其参数说明如下:

参数 解释
ing,color, thickness,lineType 和 shift等参数 与 cv2.ine()函数中的含义一致
pt1 为矩形的一个顶点
pt2 为矩形中与 pt1相对的另一个顶点
import numpy as np
import cv2


img = np.zeros((200, 320, 3), np.uint8)                       # 创建一幅黑色图像
cv2.rectangle(img, (20, 20), (300, 180), (255, 0, 0), 10)     # 画矩形,蓝色边框
cv2.rectangle(img, (70, 70), (250, 130), (0, 255, 0), 2)      # 画矩形,绿色填充
cv2.imshow('draw', img)                                       # 显示图像
cv2.waitKey(0)

在这里插入图片描述

3. 绘制圆

cv2.circle()函数用于绘制圆,其语法格式如下:

cv2.circle(img,center,radius,color[,thickness[,linetype[,shift]]])

其参数说明如下:

参数 解释
ing,color, thickness,lineType 和 shift等参数 与 cv2.ine()函数中的含义一致
center 为圆心坐标
radius 为圆的半径
import numpy as np
import cv2


img = np.zeros((200, 320, 3), np.uint8)                # 创建一幅黑色图像
cv2.circle(img, (160, 100), 80, (255, 0, 0), 5)        # 画圆,蓝色边框
cv2.circle(img, (160, 100), 40, (0, 255, 0), -1)       # 画圆,绿色填充
cv2.imshow('draw', img)                                # 显示图像
cv2.waitKey(0)

在这里插入图片描述

4.绘制椭圆

cv2.ellipse()函数用于绘制椭圆,其语法格式如下:

cv2.ellipse(img,center,axes,angle,startAngle,endAngle,color[,thickness[,lineType[, shift]]])

其参数说明如下:

参数 解释
img、color、thickness、lineType 和 shift等参数 与 cv2.line()函数中的含义一致
center 为椭圆圆心坐标
axes 为椭圆的轴。例如,(100,50)表示长轴的一半为 100,短轴的一半为 50
angle 为椭圆长轴的旋转角度,即长轴与 x轴的夹角
startAngle 为圆弧的开始角度
endAngle 为圆弧的结束角度。开始角度为 0°,结束角度为 360°时,可绘制完整椭圆,否则为椭圆弧
import numpy as np
import cv2


img = np.zeros((200, 320, 3), np.uint8)+255                            # 创建一幅白色图像
cv2.ellipse(img, (160, 100), (120, 50), 0, 0, 360, (255, 0, 0), 5)     # 画椭圆,蓝色边框
cv2.ellipse(img, (160, 100), (60, 15), 0, 0, 360, (0, 255, 0), 51)     # 画椭圆,绿色填充
cv2.imshow('draw', img)                                                # 显示图像
cv2.waitKey(0)

在这里插入图片描述

5.绘制多边形

cv2.polylines()函数用于绘制多边形,其语法格式如下:

cv2.polylines(img, pts, isClosed, color[,thickness[,lineType[, shift]]])

其参数说明如下:

参数 解释
ing,color, thickness,lineType 和 shift等参数 与 cv2.ine()函数中的含义一致
pts 为多边形各顶点坐标
isClosed 为True时,绘制封闭多边形;否则依次连接各顶点,绘制一条曲线
import numpy as np
import cv2


img = np.zeros((200, 320, 3), np.uint8)+255                                 # 创建一幅白色图像
pts = np.array([[160, 20], [20, 100], [160, 180], [300, 100]], np.int32)    # 创建顶点
cv2.polylines(img, [pts], True, (255, 0, 0), 5)                             # 画多边形,蓝色边框
pts = np.array([[160, 60], [60, 100], [160, 140], [260,  100]], np.int32)   # 创建顶点
cv2.polylines(img, [pts], False, (0, 255, 0), 1)                            # 画曲线,绿色边框
cv2.imshow('draw', img)                                                     # 显示图像
cv2.waitKey(0)

在这里插入图片描述

6.绘制文本

cv2.putText()函数用于绘制文本,其语法格式如下:

cv2.putText( img, text, org, fontFace, fontScale, color[, thickness[, lineType[,bottomLeftOrigin]]])

其参数说明如下:

参数 解释
ing,color, thickness,lineType 和 shift等参数 与 cv2.ine()函数中的含义一致
text 为要绘制的文本
org 为文本左下角的位置
fontFace 为字体类型,参数值可设置为如下常量
cv2.FONT_HERSHEY_SIMPLEX 正常大小的 sans-serif 字体
cv2.FONT_HERSHEY_PLAIN 小号的 sans-serif 字体
cv2.FONT_HERSHEY_DUPLEX 较复杂的正常大小的 sans-serif 字体
cv2.FONT_HERSHEY_COMPLEX 正常大小的 serif 字体
cv2.FONT_HERSHEY_TRIPLEX 较复杂的正常大小的 serif 字体
cv2.FONT_HERSHEY_COMPLEX_SMALL 简化版正常大小的 serif 字体
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX 手写风格字体
cv2.FONT_HERSHEY_SCRIPT_COMPLEX 较复杂的手写风格字体
cv2.FONT_ITALIC 斜体
fontScale 为字体大小
bottomLeftOrigin 为文本方向,默认值为False;设置为True时,文本为垂直镜像效果

cv2.putText()函数不能在图像中绘制中文,但可以使用PIL模块在图像中绘制中文。
首先我们需要安装PIL模块,在cmd命令窗口输出:

pip install Pillow

来安装PIL模块,这里可能会有点小疑惑,为什么不是直接pip install PIL而是Pillow,其实因为没有名为PIL的模块,而出于向后兼容的原因,Pillow仍使用PIL作为其模块名称。所以直接pip install PIL会报错。

import numpy as np
import cv2


img = np.zeros((200, 320, 3), np.uint8)+255                                           # 创建一幅白色图像
font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
cv2.putText(img, 'hello', (50, 60), font, 2, (255, 0, 0), 2, cv2.LINE_AA)             # 绘制文字
cv2.putText(img, 'Python', (50, 100), font, 2, (255, 0, 0), 2, cv2.LINE_AA, True)     # 绘制镜像文字
cv2.imshow('draw', img)                                                               # 显示图像
cv2.waitKey(0)

在这里插入图片描述

from PIL import ImageFont, ImageDraw, Image
import numpy as np
import cv2


img = np.zeros((200,320,3), np.uint8)+255                       # 创建一幅白色图像
fontpath = "STSONG.TTF"                                         # 指定字体文件名
font1 = ImageFont.truetype(fontpath, 36)         	            # 载入字体,设置字号
img_pil = Image.fromarray(img)                                  # 转换为PIL支持格式
draw = ImageDraw.Draw(img_pil)                                  # 创建Draw对象
draw.text((50, 60), '你好,世界', font=font1, fill=(0, 0, 0))    # 绘制文字
img = np.array(img_pil)                                         # 转换为图像数组
cv2.imshow('draw', img)                                         # 显示图像
cv2.waitKey(0)

在这里插入图片描述

7.绘制箭头

cv2.arrowedLine()函数用于绘制箭头,其语法格式如下:

cv2.arrowedLine(img, pt1, pt2, color[, thickness[, lineType[,shift[, tipLength]]]])

其参数说明如下:

参数 解释
ing,,pt1,pt2,color, thickness,lineType 和 shift等参数 与 cv2.ine()函数中的含义一致
tipLength 为箭尖相对于箭头的比例,默认为0.1
import numpy as np
import cv2


img = np.zeros((200, 320, 3), np.uint8)+255                # 创建一幅白色图像
cv2.arrowedLine(img, (50, 50), (50, 150), (0, 0, 255), 2)  # 绘制红色垂直箭头
cv2.arrowedLine(img, (50, 50), (300, 50), (0, 0, 255), 2)  # 绘制红色水平箭头
cv2.imshow('draw', img)                                    # 显示图像
cv2.waitKey(0)

在这里插入图片描述

响应鼠标事件

OpenCV 可在用户触发鼠标事件时,调用鼠标回调函数完成事件处理。
鼠标回调函数的基本格式如下。

def mouseCallback(event,X,y,flags,param):...

其参数说明如下:

参数 说明
mouseCallback 为自定义函数名称
event 为调用时传递给函数的鼠标事件对象
x和y 为触发鼠标事件时,鼠标指针在窗口中的坐标(x,y)
flags 为触发鼠标事件时,鼠标拖动或键盘按键操作,参数可设置为下列常量
cv2.EVENT_LBUTTONDBLCLK 双击鼠标左键
cv2.EVENT_LBUTTONDOWN 按下鼠标左键
cv2.EVENT_LBUTTONUP 释放鼠标左键
cv2.EVENT_MBUTTONDBLCLK 双击鼠标中键
cv2.EVENT_MBUTTONDOWN 按下鼠标中键
cv2.EVENT_MOUSEHWHEEL 滚动鼠标中键(正、负值表示向左或向右滚动)
cv2.EVENT_MBUTTONUP 释放鼠标中键
cv2.EVENT_MOUSEWHEEL 滚动鼠标中键(正、负值表示向前或向后滚动)
cv2.EVENT_MOUSEMOVE 鼠标移动
cv2.EVENT_RBUTTONDBLCLK 双击鼠标右键
cv2.EVENT_RBUTTONDOWN 按下鼠标右键
cv2.EVENT_RBUTTONUP 释放鼠标右键
cv2.EVENT_FLAG_ALTKEY 按下【Alt】键
cv2.EVENT_FLAG_CTRLKEY 按下【Ctrl】键
cv2.EVENT_FLAG_LBUTTON 按住鼠标左键拖动
cv2.EVENT_FLAG_MBUTTON 按住鼠标中键拖动
cv2.EVENT_FLAG_RBUTTON 按住鼠标右键拖动
cv2.EVENT_FLAG_SHIFTKEY 按下【Shift】键
param 为传递给回调函数的其他数据

cv2.setMouseCallback()用于为图像窗口绑定鼠标回调函数,其基本格式如下:

cv2.setMousecallback(wname, mouseCallback)

其参数说明如下:

参数 说明
wname 为图像窗口的名称
mouseCallback 为鼠标回调函数名称
import numpy as np
import cv2


img = np.zeros((200, 320, 3), np.uint8)+255                        # 创建一幅白色图像


def draw(event, x, y, flag, param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
       cv2.circle(img, (x, y), 20, (255, 0, 0), -1)                # 双击鼠标左键时画圆
    elif event == cv2.EVENT_RBUTTONDBLCLK:
       cv2.rectangle(img, (x, y), (x+20, y+20), (0, 0, 255), -1)   # 双击鼠标右键时画矩形


cv2.namedWindow('drawing')
cv2.setMouseCallback('drawing', draw)
while(True):
    cv2.imshow('drawing', img)                                     # 显示图像
    k = cv2.waitKey(1)
    if k == 27:                                                    # 按【Esc】键时结束循环
        break
cv2.destroyAllWindows()

在这里插入图片描述

使用跟踪栏

跟踪栏(Trackbar)是 OpenCV 为图像窗口提供的交互工具。用户可以通过跟踪栏中的滑块位置获取特定范围内的值。
cv2.createTrackbar()函数用于创建跟踪栏,其基本格式如下:

cv2,createTrackbar(trackbarname,wname,value,count,onChange,userdata)

其参数说明如下:

参数 说明
trackbarname 为跟踪栏的名称
wname 为图像窗口的名称
value 为跟踪栏中滑块的初始位置
count 为跟踪栏的最大值,最小值为 0.
onChange 为跟踪栏滑块位置变化时调用的回调函数名称
userdata 为传递给回调函数的其他可选数据

cv2.getTrackbarPos()函数用于返回跟踪栏的当前值,其基本格式如下:

retval=cv2.getTrackbarPos(trackbarname, wname)

其参数说明如下:

参数 说明
i trackbarname 为跟踪栏的名称
wname 为图像窗口的名称
import numpy as np
import cv2


img = np.zeros((120, 400, 3), np.uint8)               # 创建一幅黑色图像


def doChange(x):
    b = cv2.getTrackbarPos('B', 'trakbar')
    g = cv2.getTrackbarPos('G', 'trakbar')
    r = cv2.getTrackbarPos('R', 'trakbar')
    img[:] = [b, g, r]                                # 更改图像


cv2.namedWindow('trakbar')
cv2.createTrackbar('B', 'trakbar', 0, 255, doChange)  # 创建跟踪栏
cv2.createTrackbar('G', 'trakbar', 0, 255, doChange)
cv2.createTrackbar('R', 'trakbar', 0, 255, doChange)
while(True):
    cv2.imshow('trakbar', img)                        # 显示图像
    k = cv2.waitKey(1)
    if k == 27:                                       # 按【Esc】键时结束循环
        break
cv2.destroyAllWindows()

在这里插入图片描述

实验:使用鼠标指针取点绘图

绘制一幅图像,在图像中单击鼠标左键时绘制鼠标指针所在的点和坐标,单价鼠标右键时使用前面单击鼠标左键的点绘制多边形。

import numpy as np
import cv2


img = np.zeros((320, 640, 3), np.uint8)+255 	                          # 创建一幅白色图像
font = cv2.FONT_HERSHEY_PLAIN
xys = []


def draw(event, x, y, flag, param):			                              # 定义鼠标回调函数
    global xys    
    if event == cv2.EVENT_LBUTTONUP:                                      # 响应释放鼠标左键事件
        xy = '(%s,%s)' % (x, y)
        cv2.putText(img, xy, (x, y), font, 2, (0, 0, 0), 1, cv2.LINE_AA)  # 绘制左标
        xys.append([x, y])                                                # 记录鼠标位置
        cv2.circle(img, (x, y), 5, (0, 0, 255), -1)                       # 画圆,标注鼠标位置
    elif event == cv2.EVENT_RBUTTONUP:                                    # 响应释放鼠标右键事件
        pts = np.array(xys, np.int32)	                                  # 创建顶点
        cv2.polylines(img, [pts], True, (255, 0, 0), 2)                   # 画多边形,蓝色边框
        xys = []
    cv2.imshow('drawing', img)          		                          # 显示图像


cv2.namedWindow('drawing')			                                      # 命名图像窗口
cv2.setMouseCallback('drawing', draw)		                              # 为窗口绑定回调函数
cv2.imshow('drawing', img)          		                              # 显示图像
cv2.waitKey(0)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_47166032/article/details/120627708
今日推荐