文章目录
- 一、OpenCv是什么?
- 二、加载/显示/保存图像
-
- 1.imread 读图
- 2.imshow 显示
- 3.imwrite 保存
- 4.waitKey() & destroyAllWindows()
- 三、简单绘图
-
- 四、图像处理基础
- 五、色彩空间
- 六、几何变换
- 七、视频处理
- 总结
一、OpenCv是什么?
opencv 是用于快速处理图像、计算机视觉问题的工具,支持多种语言进行开发如c++、python、java等。本教程所有示例基于opencv-python,使用python语言对数字图像进行处理和研究。
二、加载/显示/保存图像
1.imread 读图
img = cv2.imread()
filename:图像路径
flags:标志以什么形式读入图像,可以选择一下方式:
· cv2.IMREAD_COLOR: 默认模式,图像调整为BGR,任何图像的透明度都将被忽略 可以输入数字 1 代替
· cv2.IMREAD_GRAYSCALE:以灰度模式加载图像 可以输入数字 0 代替
· cv2.IMREAD_UNCHANGED:保留读取图片原有的颜色通道 可以输入数字 -1 代替
2.imshow 显示
imshow函数作用是创新窗口,并在窗口中显示图像,窗口自动适合于图像大小
可以通过 imutils 模块调整显示图像的窗口的大小
cv2.imshow(winname,mat)
winname: 窗口名称(字符串)
mat: 图像对象,类型是numpy中的ndarray
------
imutils.resize(image,width=None,height=None)
3.imwrite 保存
cv2.imwrite(filename, image)
filename: 保存的图像名称(字符串)
image: 图像对象,类型是numpy中的ndarray类型
4.waitKey() & destroyAllWindows()
waitkey控制着imshow的持续时间,当imshow之后不跟waitkey时,相当于没有给imshow提供时间展示图像
waitKey函数是一个等待键盘事件的函数,参数值delay<=0时等待时间无限长,delay为正整数n时至少等待n毫秒才结束
waitKey在等待的期间按下任意按键时函数结束,返回按键的键值(ASCII码),等待时间结束仍未按下按键则返回-1
ord()函数可以用来获取字符的ADCII码,判断等待期间是否按下了字母A键,使用waitKey的返回值==ord(“a”)
那我们什么时候销毁窗口,试想有两种方式:
(1) 让窗口停留一段时间然后自动销毁;
(2) 接收指定的命令,如接收指定的键盘输入,然后结束窗口
retval=cv2.waitKey(delay=None)
- delay > 0 : 等待delay毫秒时仍未接收到键盘输入,图像将自动销毁
- delay <= 0 : 无限等待,接收到任意键盘输入便会进行窗口销毁
当我们使用imshow函数展示图像时,最后需要在程序中对图像展示窗口进行销毁,否则程序将无法正常终止,常用的销毁窗口的函数有下面两个
- cv2.destroyWindow(winname)
- cv2.destroyAllWindows()
三、简单绘图
公共参数:
· img: 表示需要进行绘制的图像对象ndarray
· color: 表示绘制几何图形的颜色,采用BGR
· thickness: 表示绘制几何图形中线的粗细,默认为1,对于圆、椭圆等封闭图像取-1时是填充图形内部
· lineType : 表示绘制几何图形线的类型,默认8-connected线是光滑的,当取cv2.LINE_AA时线条更平滑
- 直线
cv2.line(img,pt1,pt2,color,thickness=None,lineType=None,shift=None)
pt1,pt2分别表示线的起点像素坐标、终点像素坐标
- 矩形
cv2.rectangle(img,pt1,pt2,color,thickness=None,lineType=None,shift=None)
pt1,pt2分别表示矩形的左上角坐标、右下角坐标
- 圆形
cv2.circle(img, center, radius, color, thickness=None,lineType=None,shift=None)
center、radius分别表示圆心坐标、圆的半径
- 添加文字
cv2.putText(img,text,org,fontFace,fontScale,color,thickness=None,lineType=None)
text为要绘制的文字内容
org为绘制字体的位置,文字的左下角为起点
fontFace字体类型,例cv2.FONT_HERSHEY_SIMPLEX
fontScale字体大小
- 鼠标交互
创建一个响应函数,将要实现的操作写在该函数内
def OnMouseAction(event,x,y,flags,param)
OnMouseAction为响应函数的名称,可自定义
event表示触发了何种事件,例如cv2.EVENT_LBUTTONDOWN 按下左键
x,y表示触发鼠标事件时,鼠标在窗口中的坐标(x,y)
flags表示鼠标的拖曳事件
param为函数ID
定义响应函数后,将该函数与特定窗口绑定,让该窗口内的鼠标触发事件时能找到响应函数并执行。
使用函数cv2.setMouseCallback(winname,onMouse)绑定窗口与响应函数
winname为窗口名
onMouse为响应函数名
def OnMouseAction(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
print(x, y)
img = cv2.imread("lena.jpg")
cv2.namedWindow("x")
cv2.setMouseCallback("x", OnMouseAction)
cv2.imshow("x", img)
cv2.waitKey()
cv2.destroyAllWindows()
- 滚动条
cv2.createTrackbar(trackbarname,winname,value,count,onChange)
trackbarname滚动条名称
winname窗口名称
value初始值,滑块位置
count滚动条最大值,通常情况最小值是0
onChange回调函数,将滚动条该表后的操作写在该函数内
通过函数 retval = cv2.getTrackbarPos(trackbarname,winname)获取滚动条的返回值
四、图像处理基础
- 彩色图像在使用OpenCv读入时,会依次读取图像的B、G、R通道像素值,可以使用索引的形式访问图像数组内的值,例如image[0,0,0]访问图像image的第0行第0列第0个通道(B通道)像素点
- 通道操作
通道拆分
通过索引的方式 b=img[:,:,0] g =img[:,:,1] r=img[:,:,2]
b,g,r=cv2.split(img)
通道合并
cv2.merge([b,g,r])
- 获取图像属性
img.shape 行,列,通道->H,W,C
img.dtype 数据类型
img.size 像素总数目
五、色彩空间
- GRAY(灰度图像)色彩空间
通常指8位灰度图,具有256个灰度级,像素值的范围是[0,255]
- RGB->GRAY
Gray=0.299R+0.587G+0.114*B
- GRAY->RGB
R=Gray, G=Gray, B=Gray
- HSV色彩空间
Hue色调,光的颜色,取值区间[0,360]
Saturation饱和度,色彩的深浅程度,范围[0,1]
Value亮度,光的明暗程度,范围[0,1]
- 类型转换函数
dst = cv2.cvtColor(src,code,dst=None,dstCn=None)
dst 表示输出图像,与输入图像具有同样的数据类型和深度
src 表示输入图像,uint8,uint16,float32
code 表示色彩空间转化码
dstCn是目标图像的通道数
六、几何变换
- 缩放
dst = cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)
dst 输出的目标图像,图像大小为dsize(该值非0时)
src 原始图像
dsize 输出图像大小
fx 水平方向的缩放比例
fy 垂直方向的缩放比例
interpolation 插值方式,默认为cv2.INTER_LINEART,双线性插值
目标图像dst的尺寸由dsize或者fx\fy中的一个来指定
- 如果指定dsize的值,无论是否指定fx\fy的值,dst的尺寸都由dsize来决定
dsize(w,h),w和h对应缩放后目标图像的宽,高,w与fx相关,h与fy相关
指定dsize时,x方向的缩放大小 fx=double(dsize.w / src.w)
同理,y方向的缩放大小 fy=double(dsize.h / src.h)
- 通过参数fx和fy指定
如果参数dsize的值是None,此时目标图像的尺寸为
w=round(fxsrc.w), h=round(fysrc.h)
-
翻转
dst = cv2.flip(src,flipCode)
dst 代表和原始图像具有同样大小,数据类型的目标图像
src 原始图像
flipCode 旋转类型
flipCode |
作用 |
0 |
绕x轴翻转 |
正数 |
绕y轴翻转(最常用) |
负数 |
绕x,y同时翻转 |
-
仿射
仿射变换是指图像可以通过一系列的几何变换实现平移、旋转等多种操作
dst = cv2.warpAffine(src,M,dsize,dst=None,flags=None)
dst 目标图像
src 原始图像
M 变换矩阵,2行3列
dsize 输出图像尺寸,顺序为 (w,h),先行后列
dst (x,y) = src (M11x+M12y+M13, M21x+M22y+M23)
- 平移 M=np.float32([[1,0,detx],[0,1,dety]]),detx和dety是x,y方向平移距离
- 旋转通过函数 retval = cv2.getRotationMatrix2D(center,angle,scale)获取转换矩阵M
center为旋转的中心点,(x,y)
angle为旋转角度,正数表示逆时针,负数表示顺时针
scale为变换尺度,缩放大小
七、视频处理
视频是由一系列图像构成的,这一系列图像被称为帧。播放帧的速度称为帧速率,单位为帧/秒,对应英文是FPS(Frames Per Second)
- 初始化
捕获对象 = cv2.VideoCapture(“摄像头ID号”)
摄像头ID号默认为 -1,表示随机选取一个摄像头.如果有多个摄像头,则用数字0,1,2依次表示摄像头ID号
"捕获对象"为返回值,是VideoCapture类的实例化对象
当初始化视频文件时,参数为文件名
捕获对象 = cv2.VideoCapture(“文件名”)
- cv2.VideoCapture.isOpend()检查初始化是否成功,成功返回True,失败返回False
- 捕获帧
retval,image = cv2.VideoCapture.read()
retval表示捕获帧是否成功,True/False
image表示返回的帧,如果没有帧,返回None
- cv2.VideoCapture.release() 关闭摄像头
- 属性设置
retval = cv2.VideoCapture.get(propld) 获取VideoCapture类对象的属性
propld值
cv2.CAP_PROP_FRAME_WIDTH
cv2.CAP_PROP_FRAME_HEIGHT
retval = cv2.VideoCapture.set(propld,value) 更改VideoCapture类对象的属性
- VideoWriter类
将图片保存成视频文件/修改视频的属性,包括完成视频类型的转换
- 初始化
实例化对象 = cv2.VideoWriter(filename,fourcc,fps,frameSize)
filename,如果文件名已存在,则会覆盖该文件
fourcc,常使用cv2.VideoWriter_fourcc(‘X’,‘V’,‘I’,‘D’),表示mp4编码类型,生成的文件扩展名为.avi
fps,帧速率
frameSize,每一帧的宽,高
- write函数
None = cv2.VideoWriter.write(image)
image是要写入的视频帧,彩色图像的格式为BGR
- 释放
cv2.VideoWriter.release()
import cv2
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
forcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("xx.avi", forcc, 25, (640, 480))
while cap.isOpened():
retval, frame = cap.read()
if retval:
out.write(frame)
cv2.imshow("xx", frame)
k = cv2.waitKey(1)
if k == 27:
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。