关于opencv读取图片等基本操作可以查看opencv-python基础操作汇总——1(读取、画线、平移,旋转缩放、翻转和裁剪等操作)
可以通过cv2.split来分割RGB通道,再用cv2.merge来融合通道。
import cv2
import matplotlib.pyplot as plt
import numpy as np
plt.figure()
image = cv2.imread('im0.png')
plt.subplot(2,2,1)
plt.imshow(image)
plt.axis('off')
R, G, B = cv2.split(image)
# 创建一个跟图片一样大小的全为0的矩阵
z = np.zeros(image.shape[:2], dtype=np.uint8)
red = cv2.merge([R, z, z]) # 第一个通道为红色,其它通道全为0
green = cv2.merge([z, G, z])
blue = cv2.merge([z, z, B])
plt.subplot(2,2,2)
plt.title('red')
plt.imshow(red)
plt.axis('off')
plt.subplot(2,2,3)
plt.title('green')
plt.imshow(green)
plt.axis('off')
plt.subplot(2,2,4)
plt.title('blue')
plt.imshow(blue)
plt.axis('off')
plt.show()
HSV是一种比较直观的颜色模型,HSV可以用来更好的数字化来处理颜色。其中HSV分别代表色调(H,Hue)、饱和度(S,Saturation)、明度(V,Value)。
色调:
用角度衡量(0~360°),从红色开始逆时针计算,红色是0°,绿色是120°,蓝色是240°。补色为:黄色是60°,青色是180°,品红是300°。
饱和度:
表示颜色接近光谱色的程度。取值范围:0~100%,值越大,颜色越饱和。
明度:
表示明亮的程度。取值范围:0~100%。
可以使用cv2.COLOR_BGR2HSV从BGR转为HSV
import cv2
import matplotlib.pyplot as plt
import numpy as np
plt.figure()
plt.subplot(1,2,1)
image = cv2.imread('im0.png')
plt.title('RGB')
plt.imshow(image)
plt.subplot(1,2,2)
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
plt.title('HSV')
plt.imshow(image)
plt.show()
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 获取图像数据
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
# frame->获取到的一帧图片
# ret->捕获图片是否成功,成功为True,失败为False
frame = np.uint8(frame)
cv2.imshow('frame', frame)
# 英文输入法的q,才会退出
if cv2.waitKey(1) & 0xff == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
import cv2
import matplotlib.pyplot as plt
import numpy as np
cap = cv2.VideoCapture('1.mp4') # 视频路径
fps = cap.get(cv2.CAP_PROP_FPS) # 读取视频的帧率
frame_w = cap.get(cv2.CAP_PROP_FRAME_WIDTH)# 读取视频的宽
frame_h = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)# 读取视频的高
print(fps, frame_h, frame_w)
主要使用cv2.VideoCapture读取视频,有视频路径则读取视频,若为0则读取摄像头。
import cv2
import matplotlib.pyplot as plt
import numpy as np
cap = cv2.VideoCapture('1.mp4')
fps = cap.get(cv2.CAP_PROP_FPS)
frame_w = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_h = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print(fps, frame_h, frame_w)
while True:
ret, frame = cap.read()
# frame->获取到的一帧图片
# ret->捕获图片是否成功,成功为True,失败为False
if ret == False: # 读到最后的时候跳出循环
break
frame = np.uint8(frame)
cv2.imshow('frame', frame)
# 英文输入法的q,才会退出
# cv2.waitKey(25)可以控制播放视频的速度
if cv2.waitKey(25) & 0xff == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
使用cv2.VideoWriter_fourcc、cv2.VideoWriter和out.write(frame)来指定保存某一帧
import cv2
import matplotlib.pyplot as plt
import numpy as np
cap = cv2.VideoCapture('1.mp4')
fps = cap.get(cv2.CAP_PROP_FPS)
frame_w = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_h = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print(fps, frame_h, frame_w)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('./out.avi', fourcc, (frame_w, frame_h))# 视频路径
while True:
ret, frame = cap.read()
# frame->获取到的一帧图片
# ret->捕获图片是否成功,成功为True,失败为False
if ret == False: # 读到最后的时候跳出循环
break
frame = np.uint8(frame)
out.write(frame)
cv2.imshow('frame', frame)
# 英文输入法的q,才会退出
# cv2.waitKey(25)可以控制播放视频的速度
if cv2.waitKey(25) & 0xff == ord('q'):
break
cap.release()
cv2.destroyAllWindows()