图像绘制及窗口交互
本文将介绍在窗口内创建图像和在窗口创建一些交互操作
绘制图像和生成文字
1.绘制圆
img = cv.circle(img,center,radius,color,thickness=None,lineType=None)
img: 需要被绘制的图像
center: 圆心
radius: 半径
color:颜色
thickness: 轮廓宽度 为负数时绘制的是实心圆,默认为1
2.绘制线段
img = cv.line(img,p1,p2,color,thickness=None,lineType=None)
p1:点1
p2:点2
3.绘制椭圆
img = cv.ellipse(img,center,axes,angle,startAngle,endAngle,color,thickness=None,lineType=None)
center: 椭圆中心
axes: 椭圆长短半轴长度元组类型
angle: 椭圆旋转角度
startAngle: 椭圆弧起始角度
endAngle: 椭圆弧终止角度
img = cv.ellipse(img, (200, 200),(100,50),0,0,360, (0, 255, 0))
4.绘制多边形
img = cv.rectangle(img,p1,p2,color,thickness=None,lineType=None)
img = cv.rectangle(img,rec,color,thickness=None,lineType=None)
p1: 矩形的一个顶点
p2: 相对的顶点 连点在对角线上
rec: 矩形左上角顶点及长宽
img = cv.fillPoly(img,pts,color,thickness=None,lineType=None)
pst: 多边形顶点数组
5.生成文字
img = cv.putText(img,text,org,fontFace,fontScale,color,thickness,lineType,bottomLeftOrigin)
text: 文本 目前仅支持中文
org: 字符串左下角像素坐标
fontFace: 字体类型选择 0普通字体 1小尺寸字体
fontScale: 字体大小
color: 颜色
thickness: 字体粗细
lineType: 线条类型
bottomLeftOrigin: 图像数据原点位置,默认左上角
import cv2 as cv
import numpy as np
import sys
if __name__ == '__main__':
img = cv.imread('preview.jpg')
if img is None:
print('读取失败')
sys.exit()
img = cv.circle(img, (200, 200), 100, (255, 0, 0), 5)
img = cv.line(img, (200, 100), (200, 200), (0, 0, 255))
img = cv.ellipse(img, (300, 300), (100, 50), 0, 0, 360, (0, 255, 0), 6)
img = cv.rectangle(img, (400, 400, 100, 100), (0, 0, 255), 5)
pst1 = np.array([[500, 500], [400, 600], [600, 600]], dtype='int32')
img = cv.fillPoly(img, [pst1], (255, 0, 0))
img = cv.putText(img, 'welcome to Opencv4', (100, 100), 1, 2, (255, 0, 0))
cv.imshow('cir', img)
cv.waitKey(0)
cv.destroyAllWindows()
区域划定
有时候我们仅仅对一张图像中的部分区域感兴趣,而原图像比较大,如果处理全部的图像会占用较大的内存,所以,我们需要截取
部分图像,这部分图像称为感兴趣区域。
所以可以直接的
ROI = img[y1:y2,x1:x2]
ROI : 感兴趣区域
图像金字塔
图像金字塔是通过多个分辨率表示图像的一种有效且简单的方式,一个图像金字塔是一系列以金字塔形状排列的分辨率逐步降低的
图像,金字塔底部是待处理图像的高分辨率,而顶部是低分辨率
高斯金字塔:
构建高斯金字塔是解决尺寸不确定性的一种方法。通过下采样不断地缩短图像的大小,运行一次变为默认一半
dst = cv.pyrDown(src)
cv.pyrDown() 和 cv.resize() 效果函数一样 但是内部的算法不一样
拉普拉斯金字塔:
和高斯金字塔相反,通过上层的小尺寸图像构建下层大尺寸图像,其内部是和高斯金字塔联合实现的
dst = cv.pyrUP(src)
交互式窗口
一般有滑动条和鼠标点击响应
窗口滑动条:
一般可以用作调节参数
cv.createTrackbar(tarckbarname,winname,value,count,onChange,userdata)
trackbarname: 滑动条名称
winname: 指向整数变量的指针
value: 初值
count: 滑动条最大值
onChange: 每次滑动条改变位置需要调用的函数指针
userdata: 传递给回调函数的可选参数
该函数能够在窗口上方创建一个范围从0开始的滑动条,并将创建后的结果通过值返回
value = cv.getTrackbarPos(滑块名, winname)
获得滑块值
当值改变时 值会自动的传入回调函数
import cv2 as cv
import numpy as np
import sys
def call_back_big(x):
global img, hei, img1
hei = cv.getTrackbarPos('y', 'change_img')
img1 = img[:hei]
if __name__ == '__main__':
img = cv.imread('preview.jpg')
if img is None:
print('读取失败')
sys.exit()
cv.namedWindow('change_img')
hei = 500
img1 = img[:500]
cv.createTrackbar('y', 'change_img', hei, 1024, call_back_big)
while True:
cv.imshow('change_img', img1)
if cv.waitKey(1) == ord('q'):
break
cv.destroyAllWindows()
鼠标相应:
None = cv.setMouseCallback(winname,onMouse)
winname: 窗口名称
onMouse: 回调函数
回调函数中的响应事件标志
cv.EVENT_MOUSEMOVE 0 鼠标在窗口移动
cv.EVENT_LBUTTONDOWN 1 按下左键
cv.EVENT_RBUTTONDOWN 2 按下右键
cv.EVENT_LBUTTONUP 4 释放左键
cv.EVENT_RBUTTONUP 5 释放右键
响应标志
cv.EVENT_FLAG_LBUTTON 1 按下左键拖拽
cv.EVENT_FLAG_RBUTTON 2 按下右键拖拽
import cv2 as cv
import numpy as np
import sys
def draw(event, x, y, flags, param):
global img, pre_pts
if event == cv.EVENT_RBUTTONDOWN:
print('请检测按下按键')
if event == cv.EVENT_LBUTTONDOWN:
pre_pts = (x, y)
print('起始坐标为{}'.format(pre_pts))
if event == cv.EVENT_MOUSEMOVE and flags == cv.EVENT_FLAG_LBUTTON:
pts = (x, y)
img = cv.line(img, pre_pts, pts, (0, 0, 255), 2, 5, 0)
pre_pts = pts
cv.imshow('img', img)
if __name__ == '__main__':
img = cv.imread('preview.jpg')
img1 = img.copy()
if img is None:
print('读取失败')
sys.exit()
pre_pts = (0, 0)
cv.imshow('img', img)
cv.setMouseCallback('img', draw)
cv.waitKey(0)
cv.destroyAllWindows()