目录
安装OpenCV
读取图像
显示图像
cv2.waitKey()函数
cv2.destroyAllWindows()函数
保存图像
读取视频
开启摄像头
图像处理
像素处理
二值图像及灰度图像
彩色图像及通道处理
调整图像大小
感兴趣区域
掩模
掩模基础及构造
掩模作为函数参数
色彩处理
色彩空间基础
GRAY色彩空间
HSV色彩空间
色调H
饱和度S
明度V
色彩空间转换
获取皮肤范围
安装OpenCV
WIN+R输入cmd打开命令运行窗口,输入以下指令:
pip install opencv-python
pip install opencv-contrib-python
安装成功后会显示以下界面
读取图像
OpenCV提供了函数cv2.imread()来读取图像,语法格式如下:
image = cv2.imread( filename[, flags] )
其中:
- retval 是返回值,其值是读取到的图像。若未读取到图像,则返回“None”。
- filename 表示要读取的图像的完整文件名。
- flags 是读取标记。该标记用来控制读取文件的类型,其主要值如下表 所示。表 中 的第 1 列值与第 3 列数值是等价的,在设置参数时,既可以使用第 1 列的值,也可以使 用第 3 列的数值。
import cv2
lena=cv2.imread("lena.bmp")
print(lena)
显示图像
函数cv2.imshow()用来显示图像,语法格式为
cv2.imshow( winname, mat )
其中:
- winname 是窗口名称。
- mat 是要显示的图像。
这里介绍一下访问路径的方式:
- 绝对路径:使用完整的路径名访问文件,如“E:\lesson\lena.jpg”
- 相对路径:从当前路径开始的路径。假如当前路径为E:\lesson,使用“lena=cv2.imread("lena.jpg")”语句读取文件lena.jpg时,实际上读取的是“E:\lesson\lena.jpg”。
cv2.waitKey()函数
cv2.waitKey( [delay] )
delay表示延时时长,当改值为负数或0时,表示无限等待。默认为0
cv2.destroyAllWindows()函数
cv2.destroyAllWindows( )
import cv2
lena=cv2.imread("lena.bmp")
cv2.imshow("demo1", lena )
cv2.imshow("demo2", lena )
cv2.waitKey()
cv2.destroyAllWindows()
保存图像
image = cv2.imwrite( filename, img[, params] )
其中:
- retval 是返回值。若保存成功,则返回逻辑值真(True);否则,返回逻辑值假(False)。
- filename 是要保存的目标文件的完整路径名,包含文件扩展名。
- img 是被保存图像的名称。
import cv2
lena=cv2.imread("lena.bmp")
r=cv2.imwrite("result.bmp",lena)
读取视频
函数cv2.VideoCapture()可读取视频,其语法格式为
cap = cv2.VideoCapture(视频源)
这里的视频源可以是:
- 一个表示设备索引的整数(例如,0 表示第一个摄像头)。
- 一个表示视频文件的文件路径字符串。
如果你想打开第一个摄像头,你可以这样写:
cap = cv2.VideoCapture(0)
如果你想打开一个视频文件,可以这样写:
cap = cv2.VideoCapture('path_to_your_video.mp4')
使用cv2.VideoCappture捕获视频时,通常的流程是:
- 创建cv2.VideoCappture对象。
- 使用循环读取视频的每一帧。
- 对每一帧进行处理。
- 显示帧(如果需要)。
- 释放 cv2.VideoCappture对象并关闭窗口。
import cv2
cap = cv2.VideoCapture("test.mp4")
while True:success, img = cap.read()cv2.imshow("Result", img)if cv2.waitKey(1) & 0xFF == ord('q'):break
开启摄像头
import cv2
frameWidth = 640
frameHeight = 480
cap = cv2.VideoCapture(0)
cap.set(3, frameWidth) #设置宽度
cap.set(4, frameHeight) #设置高度
cap.set(10,150) #设置亮度
while True:success, img = cap.read()cv2.imshow("Result", img)if cv2.waitKey(1) & 0xFF == ord('q'):break
cap.release()
cv2.destroyAllWindows()
图像处理
像素处理
图像是由多个像素点堆叠而成,像素处理是对图像处理的基本操作,可以通过索引对图像内的元素进行访问和处理。OpenCV中像素数据类型为无符号的8位二进制数,范围在[0, 255],0表示黑色,255表示白色(这里可以理解为亮度,数值越大就越亮).
二值图像及灰度图像
二值图像表示只有黑白(0和255),而灰度图像表示由多种不同数值的像素堆叠([0,255])。可以将二值图像理解为特殊的灰度图,因此后面主要对灰度图进行说明。
import cv2img = cv2.imread(r"D:\Anaconda3\Pytorch\opencvbegin\mycat.png")
cv2.imshow("before", img)
print("img[50,90]原始值:", img[50, 90])
img[10:100, 80:100] = 255
print("img[50,90]修改值:", img[50, 90])
cv2.imshow("after", img)
cv2.waitKey()
cv2.destroyAllWindows()
彩色图像及通道处理
彩色图像是由红色(R)、绿色(G)、蓝色(B)等三种颜色组成,而这也就是三基色。
b = img[ : , : , 0 ]
g = img[ : , : , 1 ]
r = img[ : , : , 2 ]
b,g,r=cv2.split(img)
上述语句与如下语句是等价的:
b=cv2.split(img)[0]
g=cv2.split(img)[1]
r=cv2.split(img)[2]
import cv2image = cv2.imread(r"D:\Anaconda3\Pytorch\opencvbegin\dog.jpg")
red_channel = image[:, :, 2]
green_channel = image[:, :, 1]
blue_channel = image[:, :, 0]
cv2.imshow('original', image)
cv2.imshow('Red Channel', red_channel)
cv2.imshow('Green Channel', green_channel)
cv2.imshow('blue Channel', blue_channel)
cv2.waitKey()
cv2.destroyAllWindows()
对彩色图像既然可以拆分那就当然也可以合并了。函数 cv2.merge()可以实现通道合并。例如,使用函数 cv2.merge()将 B 通道图像 b、G 通道图像 g 和 R 通道图像 r 这三幅通道图像合并为一幅 BGR 的三通道彩色图像,实现的语句为
bgr=cv2.merge([b,g,r])
调整图像大小
dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]] )
其中:
- dst 代表输出的目标图像。
- src 代表需要缩放的原始图像。
- dsize 代表输出图像大小。
- fx 代表水平方向的缩放比例。
- fy 代表垂直方向的缩放比例。
- interpolation 代表插值方式。
dsize=Size(round(fx*src.cols),round(fy*src.rows))
插值这里不做过多说明,后面会出文章进行讲解。敬请期待吧!
import cv2img = cv2.imread(r"D:\Anaconda3\Pytorch\opencvbegin\dog.jpg")
rows, cols = img.shape[:2]
size = (int(cols * 0.9), int(rows * 0.5))
rst = cv2.resize(img, size)
cv2.imshow("original", img)
cv2.imshow("after", rst)
print("img.shape=", img.shape)
print("rst.shape=", rst.shape)
cv2.waitKey()
cv2.destroyAllWindows()
感兴趣区域
a=img[200:400,200:400]
img[200:400,600:800]=a
import cv2
a=cv2.imread("dog.jpg")
face=a[220:370,250:350]
cv2.imshow("original",a)
cv2.imshow("face",face)
cv2.waitKey()
cv2.destroyAllWindows()
掩模
掩模基础及构造
import cv2
import numpy as np
o=cv2.imread("dog.jpg",1)
h,w,c=o.shape
m=np.zeros((h,w,c),dtype=np.uint8)
m[100:400,200:400]=1
m[100:500,100:200]=1
result=m*o
cv2.imshow("o",o)
cv2.imshow("mask",m*255) # m*255,确保能显示
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()
掩模作为函数参数
计算结果=cv2.add(参数 1,参数 2,掩模)
import cv2
import numpy as npo = cv2.imread("dog.jpg")
t = cv2.imread("lucky.jpg")
h, w, c = o.shape
t = cv2.resize(t, (w, h))
m = np.zeros((h, w), dtype=np.uint8)
m[100:400, 200:400] = 255
m[100:450, 100:200] = 255
r = cv2.add(o, t, mask=m)
cv2.imshow("Original", o)
cv2.imshow("Text", t)
cv2.imshow("Mask", m)
cv2.imshow("Result", r)
cv2.waitKey(0)
cv2.destroyAllWindows()
色彩处理
色彩空间基础
这个部分我们主要介绍GRAY和HSV色彩空间。
GRAY色彩空间
R = GRAY
G = GRAY
B = GRAY
注意:GRAY转换时也代表着通道数目的转换,灰度图一般是单通道图像([0,255]),而RGB是3通道图像。
HSV色彩空间
HSV主要包含色调、饱和度、明度三要素。
色调H
色调指光的颜色。在HSV 色彩空间中,色调 H 的取值范围是[0,360],色调值为 0 表示红色,色调值为 300 表示品红色。8 位位图内每个像素点能表示的值有 28 =256 个,所以在 8 位位图内表示 HSV 图像时要把色调在[0,360]范围内的值映射到[0,255]范围内。OpenCV 直接把色调的值除以 2,得到介于[0,180]的值,以适应 8 位二进制数(256 个灰度级)的存储和表示范围。
饱和度S
明度V
色彩空间转换
dst = cv2.cvtColor( src, code [, dstCn] )
其中:
- dst 表示输出图像,与原始输入图像具有相同的数据类型和深度。
- src 表示原始输入图像。可以是 8 位无符号图像、16 位无符号图像,或者单精度浮点数 图像等。
- code 是色彩空间转换码,表 3-6 展示了部分常见的 code 值。
- dstCn 是目标图像的通道数。如果参数为默认值 0,那么通道数自动通过原始输入图像和
- code 得到。
获取皮肤范围
dst = cv2.inRange( src, lowerb, upperb )
其中:
- dst 表示输出结果,大小和 src 一致。
- src 表示要检查的数组或图像。
- lowerb 表示范围下界。
- upperb 表示范围上界。
- 若 src 值处于该指定区间内,则 dst 中对应位置上的值为 255。
- 若 src 值不处于该指定区间内,则 dst 中对应位置上的值为 0。
- 色调值为[0,33]。
- 饱和度值为[10, 255]。
- 明度值为[80,255]。
import cv2
import numpy as np
img=cv2.imread("77.png")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
min_HSV = np.array([0 ,10,80], dtype = "uint8")
max_HSV = np.array([33, 255, 255], dtype = "uint8")
mask = cv2.inRange(hsv, min_HSV, max_HSV)
reusult = cv2.bitwise_and(img,img, mask= mask)
cv2.imshow("img",img)
cv2.imshow("reusult",reusult)
cv2.waitKey()
cv2.destroyAllWindows()