opencv-python——2(颜色分割(RGB、HSV)、读取摄像头和视频并保存)

前言

关于opencv读取图片等基本操作可以查看opencv-python基础操作汇总——1(读取、画线、平移,旋转缩放、翻转和裁剪等操作)

颜色分割(RGB)

可以通过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()

效果如下:
opencv-python——2(颜色分割(RGB、HSV)、读取摄像头和视频并保存)

HSV

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()

效果如下:
opencv-python——2(颜色分割(RGB、HSV)、读取摄像头和视频并保存)

读取相机

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()

阅读视频

1. 读取视频的宽高和帧率

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)

2. 读取视频并播放

主要使用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()

3. 保存视频

使用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()

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年3月16日 下午2:32
下一篇 2022年3月16日 下午2:46

相关推荐