OpenCv-Python基础知识


一、OpenCv是什么?

opencv 是用于快速处理图像、计算机视觉问题的工具,支持多种语言进行开发如c++、python、java等。本教程所有示例基于opencv-python,使用python语言对数字图像进行处理和研究。

二、加载/显示/保存图像

1.imread 读图

img = cv2.imread() 							# 读入的图像会被转化为ndarray,未读取到图像,返回None
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
------
# 我们一般就传入两个参数,一个需要修改大小的图像,一个weight或height,图像的新尺寸和原尺寸长宽比不变 
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表示等待键盘触发的时间,单位是ms,默认为0
- delay > 0 :	等待delay毫秒时仍未接收到键盘输入,图像将自动销毁
- delay <= 0 : 无限等待,接收到任意键盘输入便会进行窗口销毁

当我们使用imshow函数展示图像时,最后需要在程序中对图像展示窗口进行销毁,否则程序将无法正常终止,常用的销毁窗口的函数有下面两个

- cv2.destroyWindow(winname) 			# 销毁单个特定窗口 winname:将要销毁的窗口的名字

- cv2.destroyAllWindows() 				# 销毁全部窗口,无参数

三、简单绘图

公共参数:
· img: 表示需要进行绘制的图像对象ndarray
· color: 表示绘制几何图形的颜色,采用BGR
· thickness: 表示绘制几何图形中线的粗细,默认为1,对于圆、椭圆等封闭图像取-1时是填充图形内部
· lineType : 表示绘制几何图形线的类型,默认8-connected线是光滑的,当取cv2.LINE_AA时线条更平滑

  1. 直线
    cv2.line(img,pt1,pt2,color,thickness=None,lineType=None,shift=None)
    pt1,pt2分别表示线的起点像素坐标、终点像素坐标
  2. 矩形
    cv2.rectangle(img,pt1,pt2,color,thickness=None,lineType=None,shift=None)
    pt1,pt2分别表示矩形的左上角坐标、右下角坐标
  3. 圆形
    cv2.circle(img, center, radius, color, thickness=None,lineType=None,shift=None)
    center、radius分别表示圆心坐标、圆的半径
  4. 添加文字
    cv2.putText(img,text,org,fontFace,fontScale,color,thickness=None,lineType=None)
    text为要绘制的文字内容
    org为绘制字体的位置,文字的左下角为起点
    fontFace字体类型,例cv2.FONT_HERSHEY_SIMPLEX
    fontScale字体大小

  1. 鼠标交互
    创建一个响应函数,将要实现的操作写在该函数内
    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()
  1. 滚动条
    cv2.createTrackbar(trackbarname,winname,value,count,onChange)
    trackbarname滚动条名称
    winname窗口名称
    value初始值,滑块位置
    count滚动条最大值,通常情况最小值是0
    onChange回调函数,将滚动条该表后的操作写在该函数内
    通过函数 retval = cv2.getTrackbarPos(trackbarname,winname)获取滚动条的返回值

四、图像处理基础

  1. 彩色图像在使用OpenCv读入时,会依次读取图像的B、G、R通道像素值,可以使用索引的形式访问图像数组内的值,例如image[0,0,0]访问图像image的第0行第0列第0个通道(B通道)像素点
  2. 通道操作
    通道拆分
    通过索引的方式 b=img[:,:,0] g =img[:,:,1] r=img[:,:,2]
    b,g,r=cv2.split(img)
    通道合并
    cv2.merge([b,g,r])
  3. 获取图像属性
    img.shape 行,列,通道->H,W,C
    img.dtype 数据类型
    img.size 像素总数目

五、色彩空间

  1. GRAY(灰度图像)色彩空间
    通常指8位灰度图,具有256个灰度级,像素值的范围是[0,255]
  • RGB->GRAY
    Gray=0.299R+0.587G+0.114*B
  • GRAY->RGB
    R=Gray, G=Gray, B=Gray
  1. HSV色彩空间
    Hue色调,光的颜色,取值区间[0,360]
    Saturation饱和度,色彩的深浅程度,范围[0,1]
    Value亮度,光的明暗程度,范围[0,1]
  2. 类型转换函数
    dst = cv2.cvtColor(src,code,dst=None,dstCn=None)
    dst 表示输出图像,与输入图像具有同样的数据类型和深度
    src 表示输入图像,uint8,uint16,float32
    code 表示色彩空间转化码
    dstCn是目标图像的通道数

六、几何变换

  1. 缩放
    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)
  1. 翻转
    dst = cv2.flip(src,flipCode)
    dst 代表和原始图像具有同样大小,数据类型的目标图像
    src 原始图像
    flipCode 旋转类型

    flipCode 作用
    0 绕x轴翻转
    正数 绕y轴翻转(最常用)
    负数 绕x,y同时翻转
  2. 仿射
    仿射变换是指图像可以通过一系列的几何变换实现平移、旋转等多种操作
    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)

  • VideoCapture类
  1. 初始化
    捕获对象 = cv2.VideoCapture(“摄像头ID号”)
    摄像头ID号默认为 -1,表示随机选取一个摄像头.如果有多个摄像头,则用数字0,1,2依次表示摄像头ID号
    "捕获对象"为返回值,是VideoCapture类的实例化对象
    当初始化视频文件时,参数为文件名
    捕获对象 = cv2.VideoCapture(“文件名”)
  2. cv2.VideoCapture.isOpend()检查初始化是否成功,成功返回True,失败返回False
  3. 捕获帧
    retval,image = cv2.VideoCapture.read()
    retval表示捕获帧是否成功,True/False
    image表示返回的帧,如果没有帧,返回None
  4. cv2.VideoCapture.release() 关闭摄像头
  5. 属性设置
    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类
    将图片保存成视频文件/修改视频的属性,包括完成视频类型的转换
  1. 初始化
    实例化对象 = cv2.VideoWriter(filename,fourcc,fps,frameSize)
    filename,如果文件名已存在,则会覆盖该文件
    fourcc,常使用cv2.VideoWriter_fourcc(‘X’,‘V’,‘I’,‘D’),表示mp4编码类型,生成的文件扩展名为.avi
    fps,帧速率
    frameSize,每一帧的宽,高
  2. write函数
    None = cv2.VideoWriter.write(image)
    image是要写入的视频帧,彩色图像的格式为BGR
  3. 释放
    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提供了大量能使我们快速便捷地处理数据的函数和方法。

猜你喜欢

转载自blog.csdn.net/goodlmoney/article/details/126830538
今日推荐