文章目录
1. 读取图像
img = cv2.imread( filepath , flags )
参数:
-
filepath:要读入图片的完整路径
-
flags:读入图片的标志
cv2.IMREAD_COLOR
:默认参数,读入一副彩色图片,忽略alpha通道
cv2.IMREAD_GRAYSCALE
:读入灰度图片
cv2.IMREAD_UNCHANGED
:顾名思义,读入完整图片,包括alpha通道
import cv2
img = cv2.imread('../image/lena.jpg')
2. 读取视频
cv2.VideoCapture( )
- cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。
- 如果是视频文件,直接指定好路径即可。
读取视频
import cv2
vc = cv2.VideoCapture('../test.mp4')
# 检查是否打开正确
if vc.isOpened():
ret, frame = vc.read()
else:
open = False
while open:
ret, frame = vc.read()
if frame is None:
break
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('result', gray)
if cv2.waitKey(10) & 0xFF == 27:
break
vc.release()
cv2.destroyAllWindows()
-
cap = cv2.VideoCapture(0)
参数0表示默认为笔记本的内置第一个摄像头,如果需要读取已有的视频则参数改为视频所在路径路径,例如:cap=cv2.VideoCapture(‘video.mp4’) -
cap.isOpened()
判断视频对象是否成功读取,成功读取视频对象返回True。 -
ret,frame = cap.read()
说按帧读取视频,返回值ret是布尔型,正确读取则返回True,读取失败或读取视频结尾则会返回False。frame为每一帧的图像,这里图像是三维矩阵,即frame.shape = (640,480,3),读取的图像为BGR格式。 -
key = cv2.waitKey(1)
等待键盘输入,参数1表示延时1ms切换到下一帧,参数为0表示显示当前帧,相当于暂停。
读取摄像头并保存视频
import cv2
def videocapture():
cap=cv2.VideoCapture(0) #生成读取摄像头对象
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) #获取视频的宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) #获取视频的高度
fps = cap.get(cv2.CAP_PROP_FPS) #获取视频的帧率
fourcc = int(cap.get(cv2.CAP_PROP_FOURCC)) #视频的编码
#定义视频对象输出
writer = cv2.VideoWriter("video_result.mp4", fourcc, fps, (width, height))
while cap.isOpened():
ret, frame = cap.read() #读取摄像头画面
cv2.imshow('teswell', frame) #显示画面
key = cv2.waitKey(24)
writer.write(frame) #视频保存
# 按Q退出
if key == ord('q'):
break
cap.release() #释放摄像头
cv2.destroyAllWindows() #释放所有显示图像窗口
videocapture()
3. 显示图像
cv2.imshow( fname , img)
参数:
- fname:显示图像的窗口的名字
- img:要显示的图像(imread读入的图像),窗口大小自动调整为图片大小
import cv2
img = cv2.imread('../image/lena.jpg')
#显示图片
def cv_show(name , img):
cv2.imshow(name,img)
cv2.waitKey(0) #等待时间,单位毫秒,0为任意键终止
cv2.destroyAllWindows() #销毁所有窗口
cv_show('image' , img)
cv2.waitkey(time):time为等待时间,单位毫秒,等待时间内有键盘输入则返回按键ASCII码,超时返回-1;time=0为任意键终止。
cv2.destroyAllWindows() 销毁所有窗口
cv2.destroyWindow(wname) 销毁指定窗口
4. 保存图像
cv2.imwrite( file,img,num )
参数:
-
file:要保存的文件名
-
img:要保存的图像。
-
num:可选的第三个参数,针对特定的格式:对于JPEG,其表示的是图像的质量,用0 – 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别,默认为3。
cv2.IMWRITE_JPEG_QUALITY类型为 long ,必须转换成 int
cv2.imwrite('lena.png' , img , [int( cv2.IMWRITE_JPEG_QUALITY), 95])
cv2.IMWRITE_PNG_COMPRESSION, 从0到9 压缩级别越高图像越小
cv2.imwrite( "lena.png" , img , [int(cv2.IMWRITE_PNG_COMPRESSION),9] )
5. 翻转图像
cv2.flip( img , flipcode )
- img:要翻转的图像
-
flipcode:控制翻转效果。
flipcode = 0:沿x轴翻转
flipcode > 0:沿y轴翻转
flipcode < 0:x,y轴同时翻转
imgflip = cv2.flip(img,1)
6. 复制图像
imgcopy = img.copy()
7. 颜色空间转换
彩色图像转为灰度图像
img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
灰度图像转为彩色图像
img = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)
8. 截取部分图像
img[y0:y1, x0:x1]
img=cv2.imread('cat.jpg')
cat=img[0:50,0:200]
9. 颜色通道提取
-
颜色通道提取
b,g,r=cv2.split(img)分离出来的RGB三通道是灰度图
-
合并通道
img=cv2.merge((b,g,r))
-
只保留R
cur_img = img.copy() cur_img[:,:,0] = 0 cur_img[:,:,1] = 0 cv_show('R',cur_img)
-
只保留G
cur_img = img.copy() cur_img[:,:,0] = 0 cur_img[:,:,2] = 0 cv_show('G',cur_img)
-
只保留B
cur_img = img.copy() cur_img[:,:,1] = 0 cur_img[:,:,2] = 0 cv_show('B',cur_img)
10. 边界填充
cv2.copyMakeBorder( img , top , bottom , left , right , borderType)
参数:
-
src : 输入的图片
-
top, bottom, left, right :相应方向上的边框宽度
-
borderType:定义要添加边框的类型,它可以是以下的一种:
- BORDER_REPLICATE:复制法,也就是复制最边缘像素。
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
- BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
- BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
- BORDER_CONSTANT:常量法,常数值填充。
import cv2
import matplotlib.pyplot as plt
img=cv2.imread('../image/cat.jpg')
top_size,bottom_size,left_size,right_size = (50,50,50,50)
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')
plt.show()
11. 图像缩放
dst = cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)
参数:
- src:输入图像
-
dsize:输出图像的大小。如果该参数为 0,表示缩放之后的大小需要通过公式计算,
dsize = Size(round(fx*src.cols),round(fy*src.rows))
。其中
fx
与
fy
是图像 Width 方向和 Height 方向的缩放比例。 -
fx:Width 方向的缩放比例,如果是 0,按照
dsize * width/src.cols
计算 -
fy:Height 方向的缩放比例,如果是 0,按照
dsize * height/src.rows
计算 - interpolation:插值算法类型,或者叫做插值方式,默认为双线性插值
方法返回结果 dst 表示输出图像。
import cv2
import matplotlib.pyplot as plt
cat = cv2.imread('../image/cat.jpg')
ltcat = cv2.resize(cat, (0, 0), fx=0.5, fy=0.5)
plt.subplot(121), plt.imshow(cat, 'gray'), plt.title('cat')
plt.subplot(122), plt.imshow(ltcat, 'gray'), plt.title('ltcat')
plt.show()
12. 图像融合
cv2.addWeighted(img1, alpha, img2, beta, gamma[, dst[, dtype]])
alpha * img1 + beta * img2 + gamma
参数:
- img1,img2:为读取的图像
- alpha:为img1的透明度
- beta:img2的透明度
import cv2
import matplotlib.pyplot as plt
cat=cv2.imread('../image/cat.jpg')
dog=cv2.imread('../image/dog.jpg')
#图像融合
dog = cv2.resize(dog, (500, 414))
cat = cv2.resize(cat, (500, 414))
img = cv2.addWeighted(cat, 0.4, dog, 0.6, 0)
img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5) #调整大小
plt.subplot(141), plt.imshow(cat, 'gray'), plt.title('cat')
plt.subplot(142), plt.imshow(dog, 'gray'), plt.title('dog')
plt.subplot(143), plt.imshow(cat+dog, 'gray'), plt.title('cat+dog')
plt.subplot(144), plt.imshow(img, 'gray'), plt.title('addWeighted')
plt.show()