OpenCV入门-基于Python

图像入门

  • 1. 创建窗口
    • namedWindow()
    • resizeWindow()
    • destroyAllWindow()
  • 2.显示图像
    • imread()
    • imshow()
    • imwrite()
    • waitKey()
    • flip()
    • 代码演示
  • 3.显示视频
    • VideoCapure()对象
      • cap.get()
      • cap.isOpened()
      • cap.read()
      • cap.release()
      • 部分功能代码演示
    • VideoWriter()对象
      • VideoWriter_fourcc()
      • write()
      • release()
      • 部分代码展示:
  • 4.鼠标控制
    • setMouseCallBack()
    • callback()
    • 部分代码展示:
  • 5. trackBar组件
    • createTrackbar()
    • getTrackbarPos()
    • 部分代码示例
  • 7.Numpy基础(为了方便调用,用np表示)
    • Numpy库创建矩阵
      • array()
      • zeros()/ones
      • full()
      • identity()/eye()
      • 代码演示
    • Numpy检索与赋值
      • 代码演示
    • Mat
      • 代码演示
    • 深浅拷贝
      • 代码演示:
    • 通道分离与合并
      • split()
      • merge()
      • 代码展示
  • 8. 图像的基本操作
    • cvtColor()
    • 部分代码展示:

OpenCV入门-基于Python_第1张图片

1. 创建窗口

进行图像操作时,我们要用窗口来显示对图像所进行的操作。用窗口来观察操作前后的效果。

namedWindow()

创建一个新窗口
cv2.namedWindow(winname,图像格式)
winname:创建的窗口名字
图像格式:WINDOW_NORMAL :可以改变窗口大小。WINDOW_AUTOSIZE:自动适应窗口大小,不能自己改变窗口大小。

resizeWindow()

修改窗口大小
cv2.resizeWindow(winname,width,height)
winname:修改的窗口名字
width:宽
height:高

destroyAllWindow()

销毁所有窗口无参数。
cv2.destroyAllWindow()
销毁指定窗口,参数为窗口名。
cv2.destroyWindow(winname)

2.显示图像

在窗口创建好之后,我们就可以通过窗口,把图像显示出来。

imread()

读取指定路径的图像
cv2.imread(path,flag=cv2.IMREAD_COLOR)
path:读取文件的路径
flag:读取图像的方式。cv2.IMREAD_COLOR(加载彩色图像,默认标志 ) 、cv2.IMREAD_GRAYSCALE(灰度模式加载图像)、cv2.IMREAD_UNCHANGED:加载图像,包括alpha通道。
这三种标志可分别用1、0、-1代替。
返回值为mat

imshow()

在窗口中显示图像
cv2.imshow(winname,mat)
指定winname窗口,显示mat对象。

imwrite()

将图像保存起来
cv2.imwrie(path,mat)
path:保存图像的路径
mat:将要保存图像的信息。

waitKey()

窗口显示时间(让窗口等一下,我要输入数据)
cv2.waitKey(time)
time:窗口等待的时间,单位ms,time=0,那么一直等待输入数据。
返回值 用户从键盘输入的ASCII码值。

flip()

将图像进行垂直,水平翻折
cv2.flip(mat,-1/0/1)
mat:就是进行翻折的图片帧
-1:x+y轴翻折、0:x轴翻折、1:y轴翻折
返回值 是翻折之后的图片

代码演示

import cv2
'''
前面代码统一演示示例:
'''
#创建窗口
cv2.namedWindow('flower',cv2.WINDOW_NORMAL)
#修改窗口大小
cv2.resizeWindow('flower', 640, 480)
# 彩色方式读取图片文件,用img来接收
img = cv2.imread('./image/girl.png',1)
# 显示图像
cv2.imshow('flower',img)

# 保存图像
cv2.imwrite('./image/flower1.png', img)

# 一直显示,等待用户输入数据
cv2.waitKey(0)
# 销毁窗口
cv2.destroyWindow('flower')

3.显示视频

需要用到视频操作的相关接口,OpenCV提供了VideoCapure()对象,用来进行相关操作。

VideoCapure()对象

视频捕获的对象
cap = cv2.VIdeoCapure(path/数字01)
创建好后,cap就是一个视频操作的对象(以后都用cap来表示)
path:读取视频文件需要放视频文件的完整路径
数字0/1:0是默认电脑摄像头。

cap.get()

获得视频帧中的属性
cap.get(propld)
propld:3表示宽度,4表示高度,5表示帧率
返回值由输入的数据决定

cap.isOpened()

用来检查创建的对象,是否已经成功打开
cap.isOpened()
返回值是一个boll值,True表示成功打开,否则打开失败

cap.read()

从捕获的摄像头或者视频帧中读取视频帧。
cap.read()
两个返回值,第一个boll值,代表该帧是否正确读取到,第二个返回值是该帧的数据(mat)

cap.release()

释放cap对象捕获的设备
cap.release()

部分功能代码演示

import cv2

# 创建一个窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)

# 创建一个视频对象
cap = cv2.VideoCapture(0)
# 检查是否打开
if not cap.isOpened():
    print('Video opened failed')
    exit(-1)

# 获取视频帧的宽和高
print(cap.get(3))
print(cap.get(4))

while True:
    # 读取视频帧
    ret, frame = cap.read()
    if not ret:
        print('视频帧读取有误!')
        break
    # 显示视频帧
    cv2.imshow('video', frame)
    key = cv2.waitKey(10)
    # 按q退出,按s保存
    if (key & 0xff) == ord('q'):
        print('退出成功')
        break
# 释放资源
cv2.destroyAllWindows()
cap.release()

VideoWriter()对象

创建一个保存视频的对象,定义好path、编码格式、帧数、视频帧大小,是否是彩色格式(默认为彩色)
out = cv2.VideoWriter(filename,fourcc,fps,frameSize,[IsColor])
filename:视频的路径和文件名
fourcc:压缩帧的4字符编/解码器的选项
fps:视频的帧数
frameSize:视频帧的大小(width,height)

VideoWriter_fourcc()

用来设置编/解码器。
fourcc = cv2.VideoWriter_fourcc(*‘字符串’)
参数:适合编码的各种缩写,-1为自动匹配合适的编/解码器。

write()

先将视频帧编码,之后再将视频帧写入要保存的路径中
out.write(mat)
mat:保存的视频帧

release()

释放类,并且把缓冲区的数据强制编码,再输出成文件。
out.release()

部分代码展示:

读取视频仅仅需要将创建视频的对象,修改成读取的文件路径即可

import cv2

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# 创建一个窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
# 创建一个输出对象
out = cv2.VideoWriter('./video/out.mp4', fourcc, 20, (640, 480))
# 创建一个视频对象
cap = cv2.VideoCapture(0)
# 检查是否打开
if not cap.isOpened():
    print('Video opened failed')
    exit(-1)

# 获取视频帧的宽和高
print(cap.get(3))
print(cap.get(4))

while True:
    # 读取视频帧
    ret, frame = cap.read()
    if not ret:
        print('视频帧读取有误!')
        break
    # 将视频帧反转保存并显示视频帧
    frame = cv2.flip(frame, 1)
    out.write(frame)
    cv2.imshow('video', frame)
    key = cv2.waitKey(1000//20)
    # 按q退出
    if (key & 0xff) == ord('q'):
        print('退出成功')
        break
# 释放资源
cv2.destroyAllWindows()
out.release()
cap.release()

4.鼠标控制

可以在图像中控制鼠标来进行一些操作。

setMouseCallBack()

设置鼠标回调函数
cv2.setMouseCallBack(winname,callback,uerdata)
winname:在哪个窗口调用这个函数
callback:回调函数,需要用户自己设置,用来完成一些事件。
uerdata:用户自己额外传送的数据。

callback()

自己定义的一个函数
def callback(event,x,y,flags,uerdata)
event:鼠标进行的动作
flags:键盘进行的动作
(x,y):鼠标的横纵坐标
uerdata:调用这个函数的数据。

event:
OpenCV入门-基于Python_第2张图片
flags:
OpenCV入门-基于Python_第3张图片

部分代码展示:

import cv2
import numpy as np


def mouse_back(event, x, y, flags, uerdata):
    print(event, x, y, flags, uerdata)


# 创建窗口,并且调整大小
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 480)

# 设置鼠标回调
cv2.setMouseCallback('mouse',mouse_back,'1111')


#创建一个纯黑的图像,行数,列数,几个通道,图片格式
img = np.zeros((480, 640, 3), np.uint8)
while True:
    cv2.imshow('mouse',img)
    key = cv2.waitKey(10)
    if key & 0xFF == ord('q'):
        print('退出成功')
        break

# 销毁资源
cv2.destroyAllWindows()

5. trackBar组件

createTrackbar()

用于创建一个tarckbar,目的是进行调节量
cv2.createTrackbar(trackbarname,winname,value,count,callback,userdata)
trackbarname:轨道名称
winname:将该组件和winname绑定。
value:组件的当前值。
count:组件的最大值,从0开始算。
callback:回调函数
userdata:用户自己传的数据

getTrackbarPos()

用于获取trackbar的位置
cv2.getTrackbarPos(trackbarname,winname)
taackbainame:trackbar的控件名称
winname:控件绑定的窗口
返回值 trackbar的位置

部分代码示例

import cv2
import numpy as np

def track_callback():
    pass


# 创建一个窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar', 640, 480)
# 创建一个全黑图像
img = np.zeros((480, 640, 3), np.uint8)
# 创建三个trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, track_callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, track_callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, track_callback)

while True:
    # 首先展示图片
    cv2.imshow('trackbar', img)
    # 获取三个trackbar的值
    r = cv2.getTrackbarPos('R', 'trackbar')
    g = cv2.getTrackbarPos('G', 'trackbar')
    b = cv2.getTrackbarPos('B', 'trackbar')
    key = cv2.waitKey(10)
    if key & 0xff == ord('q'):
        print("退出成功")
        break
    img[:] = [b, g, r]


# 释放资源
cv2.destroyAllWindows()

7.Numpy基础(为了方便调用,用np表示)

在OpenCV中用到的矩阵都要转换成Numpy数组,Numpy是一个高度优化的数值库,速度很快。

Numpy库创建矩阵

array()

直接创建数组
np.array(mat)
mat:一维数组[1,2,3],二维数组:[[1,2,3],[4,5,6],[7,8,9]]…
返回值是一个数组

zeros()/ones

创建全0/1的数组
np.zeros((row,col,通道数/层数),数据类型)
参数: 第一个三元组,是矩阵的行数、列数、通道数;第二个是数据类型
返回值是一个数组

full()

创建全值数组(矩阵全部为一个数值)
np.full((row,col,通道数/层数),val,数据类型)
参数: 第一个三元组,是矩阵的行数、列数、通道数;第二个是矩阵的数值;第三个是数据类型
返回值是一个数组

identity()/eye()

创建单元数组
np.identy(n)/np.eye(n)
参数:n:创建n*n的单位矩阵
返回值是一个数组
np.eye(row,col ,k)
参数:row行col列数组,从第1行第k个数字,开始写1,可以不是正方形
返回值是一个数组

代码演示

import cv2
import numpy as np

# 创建一维,二维数组
a = np.array([1, 2, 3])
b = np.array([[1,2, 3],[4,5,6],[7,8,9]])
print(a)
print(b)

# 创建全0/1数组
# 这样写会显示8*8的矩阵,如果换成(8,8,3)
# 由于print解释不同,会打印成8个8*3的矩阵
c = np.zeros((8, 8),np.uint8)
d = np.ones((8, 8),np.uint8)
print(c)
print(d)

# 创建全值矩阵,每个值都为10
e = np.full((5, 5), 10, np.uint8)
print(e)

# 创建单位矩阵
f = np.identity(5)
g = np.eye(2)
print(f)
print(g)
# 不是正方形的单位矩阵
# 从第一行k开始为1
h = np.eye(2, 3, 1)
print(h)

Numpy检索与赋值

key:用python访问和修改数组

[y,x] 坐标是反过来的
[y,x,channel] 访问指定通道的值
==[y1:y2,x1:x2]==访问该区间的值
[:,:]与[:]相等访问范围内的所有坐标
[:,10] 访问横坐标是10的所有坐标

代码演示

import cv2
import numpy as np

# 创建一个全0的数组
a = np.zeros((480, 640, 3), np.uint8)
# 直接展示图像
cv2.imshow('a', a)
# 将一个范围修改为绿色
# a[100:200, 100:200] = [0, 255, 0] 和下面的方法相等,都是修改绿色通道
# a[100:200, 100:200, 1] = [255]

# 修改横坐标为20的所有坐标
# a[:,20] = [0, 0, 255]

# 访问全体
a[:] = [255,255,255]
cv2.imshow('a2', a)
cv2.waitKey(0)

Mat

mat在python中代表的是数组对象,这个对象主要包含mat属性以及数据。在python中,每个数组都有这些属性。

img.shape :显示高度,长度和通道数
img.size:图像占用多大空间
img.dtype:每个元素的位深

OpenCV入门-基于Python_第4张图片

代码演示

# 创建一个全0的数组
a = np.zeros((480, 640, 3), np.uint8)

print(a.shape)
print(a.size)
print(a.dtype)

深浅拷贝

日常直接创建变量的方法是浅拷贝,虽然变量名不同,但是共享同一块数据,改变其中一个变量,另一个变量的数据也跟着改变,这是浅拷贝。如果完全复制一份同样的数据存到另一个变量中,两个变量的改变互不影响,这个就是深拷贝。

img3 = img.copy()

代码演示:

# 深浅拷贝

# 创建一个全0的数组
img1 = np.zeros((480, 640, 3), np.uint8)
# img3为深拷贝,img2为浅拷贝
img3 = img1.copy()
img2 = img1
img2[100:200,100:200] = [255,0,255]
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)

cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV入门-基于Python_第5张图片

通道分离与合并

将BGR三个通道拆分与合并

split()

将图片的BGR通道拆开成B,G,R三个通道。
cv2.split(mat)
mat:需要拆分的图像
返回值有三个,用三个变量接收

merge()

将拆分的通道合成一个图像
cv2.merge((ch1,ch2,ch3))
参数:ch1,ch2,ch3分别代表各个通道,并且用元组表示。
返回值是拼好的图像

代码展示

# 创建一个全黑的图像
img = np.zeros((480, 640, 3),np.uint8)
# BGR通道分割
r, g, b = cv2.split(img)
# 仅仅修改两个通道的颜色
r[100:200, 100:200] = 255
b[100:200, 100:200] = 255
# 再次合并成新图形
img2 = cv2.merge((b, g, r))

cv2.imshow('img', img)
cv2.imshow('img2', img2)

OpenCV入门-基于Python_第6张图片

8. 图像的基本操作

cvtColor()

用于将图像从一个颜色空间转换为另一个颜色空间。
dst = cv2.cvtColor(src,flag)
src:需要转换的图像
flag:见下表
返回值dst,转换颜色空间后的图像

(flag)标志 简记 作用
cv2.COLOR_BGR2BGRA 0 为RGB图像添加alpha通道
cv2.COLOR_BGR2RGB 4 由BGR变成RGB顺序
cv2.COLOR_BGR2GRAY 10 将彩色图像变成灰度图像
cv2.COLOR_BGR2YUV 82 从RGB颜色空间转成YUV颜色空间
cv2.COLOR_BGR2HSV 40 从RGB颜色空间转成HSV颜色空间

部分代码展示:

import cv2

def callback(x):
    pass


# 创建窗口
cv2.namedWindow('color',cv2.WINDOW_NORMAL)
cv2.resizeWindow('color', 640, 480)

# 读取一个图像
img = cv2.imread('./image/girl.png')
# 创建一个列表
colorspaces = [cv2.COLOR_BGR2RGB, cv2.COLOR_BGR2BGRA, cv2.COLOR_BGR2GRAY,
               cv2.COLOR_BGR2YUV, cv2.COLOR_BGR2HSV]
# 创建一个trackbar
cv2.createTrackbar('cvt_color', 'color', 0, len(colorspaces)-1, callback)

while True:
    # 获取trackbar位置
    index = cv2.getTrackbarPos('cvt_color', 'color')
    # 转换图像
    cvt_img = cv2.cvtColor(img, colorspaces[index])
    cv2.imshow('color', cvt_img)
    key = cv2.waitKey(10)
    if key & 0xff == ord('q'):
        break
# 销毁资源
cv2.destroyAllWindows()

你可能感兴趣的:(图像处理,Python,opencv,python,计算机视觉)