opencv-python读取图像、视频图像ROI和保存图片

1. 图像

  1. 图像由像素点组成,像素点的值在0~255之间浮动,是uint8的数据类型;
  2. 彩色图由RGB三个通道组成,opencv一般为BGR
  3. 一幅RGB图像一般表示为【h,w,c】,h为高度,w为宽度,c为通道数,黑白图像为【h,w】

读取图像

# 导入依赖
import cv2 # openCV的python包
import matplotlib.pyplot as plt # 绘图工具包
import numpy as np # opencv的数据一般存放在numpy中
%matplotlib inline

其中%matplotlib inline 为jupyter的魔法指令,与im.show()作用相关。

2. opencv读取图像

imread函数:参数1:读取的图像路径;参数2:图像类型
图像类型:

cv2.IMREAD_GRAYSCALE表示灰度,

cv2.IMREAD_COLOR表示彩色,默认为彩色图像

img = cv2.imread(r"material\a.png")

输入图像地址从而读取图像到img变量,加r是转义字符,因为\u在python中有其它意义。

# print(img.shape,'\n',img)
# img.size

img是一个380*704,拥有3个通道的array型数据,图像的像素点个数为267520,在python中有其它意义。

3. opencv显示图像

使用cv2.imshow函数显示图像: 

def cv_show(name, img):
    cv2.imshow(name, img) # name为显示窗口名字,img为要显示的图像
    cv2.waitKey(0) # 按照毫秒进行计数的键盘等待时间,0表示按下键盘任意键继续执行下面语句
    cv2.destroyAllWindows() # 关闭图像窗口
cv_show('img',img)
cv2.CAP_GSTREAMER

也可使用np的hstack、vstack将多个图像拼接后再显示

# read img1 and img2
img1 = cv2.imread(r'material\1.png')
img2 = cv2.imread(r'material\7.png')
img3 = cv2.imread(r'material\8.png')
#print(img1.shape,img2.shape,) 
img1 = cv2.resize(img1,(207,174))
img2 = cv2.resize(img2,(207,174))
img3 = cv2.resize(img3,(207,174))
img_av = np.vstack((img1,img2,img3)) # 竖着拼接,要求x方向像素相同
img_ah = np.hstack((img1,img2,img3))  # 横着拼接,要求y方向像素相同
cv_show('vstack',img_av)
cv_show("hstack",img_ah)

也可使用matplotlib.pyplot库来显示图像

plt.subplot(1,3,1),plt.imshow(img1),plt.title('1')
plt.subplot(1,3,2),plt.imshow(img2),plt.title('2')
plt.subplot(1,3,3),plt.imshow(img3),plt.title('3')
plt.show()

4. opencv保存图像

cv2.imwrite(r"material\aa.png",img)

5. opencv读取视频

VideoCapture函数:参数1:读取的视频路径

视频路径:可以直接输入本地视频文件的地址,也可以输入相机设备来调用相机

vc = cv2.VideoCapture(r"material\a.mp4")
def vc_down():
    if vc.isOpened(): # 返回布尔类型,表示是否成功打开视频,成功打开返回True,未成功打开返回False
        open, frame = vc.read() # 返回两个值,open为布尔类型,读取到视频帧就为True,视频结束没有视频帧返回False,frame为视频帧(img)
    else:
        open = False
    return open, frame
open, frame = vc_down() # 先判断是否能打开再进行循环读取
while open:
    ret, frame = vc.read() # 读取视频帧
    if frame is None: # 视频结束,不再能读取视频帧,退出
        break
    if ret ==True: # 读取到视频帧
        cv2.imshow('rgb',frame) # 一帧帧显示视频
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将视频帧转为灰度
        # cv2.imshow("result", gray)
        if cv2.waitKey(10) & 0xFF == 27: # 设置视频退出以及每一帧播放速度
            break
print(vc)
vc.release() # 退出视频
print(vc)
cv2.destroyAllWindows()
print(vc)

cv2.waitKey()函数详讲:等待并读取键盘操作时间,以毫秒计数。读取到键盘上操作后,用 与运算取其低八位ASCII码,从而判断操作

 6. 截取部分图像数据(ROI)

截取部分图像,实际上是对img数组的切片操作

cv_show('img',img) # 原图
img_ROI = img[0:180,0:250]  # 切片
cv_show('img_ROI',img_ROI)
print(img_ROI,'\n',img_ROI.shape)

cv2.split(img)函数:可以按照通道对图像进行分割,bgr彩色图像被分割为3个shape一致的矩阵.

b,g,r = cv2.split(img)

即:b = img[:,:,0], g =img[:,:,1], r =img[:,:,2]

print(b.shape,g.shape,r.shape,'\n',b==img[:,:,0])
cv_show('img',img)
cv_show('b',b)
cv_show('g',g)
cv_show('r',r)

split函数分割出来各个通道的单层值,进行show时是黑白图形,要只显示各个通道的值,可利用切片只保留该通道的值,令其它通道为0

# 仅仅有blue通道
channel_blue = img.copy()
channel_blue[:,:,[1,2]]=0
cv_show('blue',channel_blue)
# 仅仅有green通道:
channel_green = img.copy()
channel_green[:,:,[0,2]]=0
cv_show('green',channel_green)
# 仅仅有red通道:
channel_red = img.copy()
channel_red[:,:,[0,1]]=0
cv_show('red',channel_red)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值