赞
踩
目录
在Python中,OpenCV使用NumPy数组存储图像,Numpy是使用Python进行数组计算的软件包,提供强大的N维数组对象,支持复杂的广播功能(数组运算),集成了C/C++和Fortran代码工具,支持线性代数、傅里叶变换和随机数等特性,还可作为通用数据的高效多维容器,如在OpenCV中显示图像。
Numpy的知识点见数据处理专栏,主要包括数据类型、创建数组、数组形状、索引切片和迭代、数组运算等。
imread将文件夹的图像读入内存,支持BMP、PNG、JPEG、TIFF等静态图像格式,该函数返回的是一个numpy.ndarray对象(即NumPy数组),元素为图像像素,数组的shape(形状)、dtype(数据类型)、size(元素个数)等属性表示图像的相关属性。
常见基本读取格式有cv2.IMREAD_UNCHANGE(按原样加载)、cv2.IMREAD_GRAYSCALE(将图像转换为单通道灰度图像)、cv2.IMREAD_COLOR(将图像转换为3通道BGR彩图)等。
imwrite将Numpy数组中保存的图像写入文件,函数返回的是一个布尔值,写入成功返回true反之false。
- import cv2
- import numpy as np
- img1=cv2.imread('autumn.jpg')#可加读取格式参数
- cv2.imshow('autumn',img)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
-
- #也可打包成一个函数
- def cv_show(name,img):
- cv2.imshow(name,img)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
-
- cv_show('autumn',img1)
-
- #写入一个50x50的黑色正方形图像
- img2=numpy.zeros((50,50),dtype=numpy.uint8)
- cv2.imwrite("rectangle.png",img2)

视频处理基本步骤:将视频文件或者摄像头作为数据源来创建VideoCapture对象;调用VideoCapture对象的read()方法获取视频中的帧,每一帧都是一幅图像;调用VideoWriter对象的write()方法将帧写入视频文件,或者调用cv2.imshow()函数直接在窗口显示帧。
- #播放文件已有的视频
- import cv2
- cap=cv2.VideoCapture("test.mp4")#创建对象
- #fps=cap.get(cv2.CAP_PROP_FPS)#读取帧速率
- #size=(cap.get(cv2.CAP_PROP_FRAME_HEIGHT),cap.get(cv2.CAP_PROP_FRAME_WIDTH))#读取视频大小
- #print('帧速率:',fps)
- #print('大小:',size)
- ret, frame = cap.read()#从视频中读取一帧数据,frame存储了此一帧数据
- while True:
- cv2.imshow('img',frame)
- ret, frame = cap.read()#从视频中读取一帧数据,frame存储了此一帧数据
- key = cv2.waitKey(1000//24)#延时时间:1000ms显示24张图片,最多等待1000//24毫秒
- if key == ord('q'):#按q退出
- break
- cap.release()#关闭视频
- #将已有的视频写入文件
- import cv2
- cap=cv2.VideoCapture("test.mp4")#创建对象,test.mp4是已存在的视频
- fps=cap.get(cv2.CAP_PROP_FPS)#读取帧速率
- size=(int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)),int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))#读取视频大小,int强制转换
- wrt=cv2.VideoWriter('test2.avi',cv2.VideoWriter_fourcc('X','V','I','D'),fps,size)#保存文件名,视频解码器格式,帧速率,大小
- ret, frame = cap.read()#读取一帧数据,frame存储了此一帧数据,ret是返回的布尔值
- while ret:
- wrt.write(frame)
- ret, frame = cap.read()
- cap.release()#关闭视频
- #捕获摄像头视频,保存并播放
- import cv2
- cap=cv2.VideoCapture(0)#创建对象,0代表视频源是摄像头
- fps=30 #预设帧速率
- size=(int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)),int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))#读取视频大小
- wrt=cv2.VideoWriter('test2.avi',cv2.VideoWriter_fourcc('X','V','I','D'),fps,size)#保存文件名,视频解码器格式,帧速率,大小
- ret, frame = cap.read()#从视频中读取一帧数据,frame存储了此一帧数据
- while ret:
- wrt.write(frame)#将帧写入文件
- cv2.imshow('img',frame)
- ret, frame = cap.read()#从视频中读取一帧数据,frame存储了此一帧数据
- key = cv2.waitKey(1000//24)#延时时间:1000ms显示24张图片,最多等待1000//24毫秒
- if key == ord('q'):#按q退出
- break
- cap.release()#关闭视频(释放摄像头)
灰度图为256级(0-255),0代表黑色,255为白色,一个字节存储一个像素值,用单通道的二维数组表示图像。像素点值不会大于255,若大于会按256取模。
- #代码示例:首先闯将240x320的黑色图像,并输出当前灰度值。每过1秒,灰度值增加20,直到按下esc退出
- img=numpy.zeros((240,320),dtype=numpy.uint8)
- n=0
- while true:
- cv2.imshow('Grayimg',img)
- n+=20
- img[:,:]=n#将所有像素点值修改为n
- print(img[1,1])
- key=cv2.waitKey(1000)
- if key==27:
- break
彩图RGB三个通道,每个通道的取值范围都是0-255,三个通道像素组合表示彩色图像,但opencv中默认图像格式是BGR,用三维数组表示彩色图像。
- #代码示例:三条颜色动态变化效果
- img=numpy.zeros((240,320,3),dtype=numpy.uint8)#240是宽,320是长
- r0=0
- r1=1
- r2=2
- while true:
- img[:80,:,r0]=255 #通道r0,将上部1/3颜色值设置为255
- img[80:160,:,r1]=255 #通道r1,将中部部1/3颜色值设置为255
- img[160:,:,r2]=255 #通道r2,将下部1/3颜色值设置为255
- cv2.imshow('Colorimg',img)
- key=cv2.waitKey(1000)
- img[:,:,:]=0 #清零变为黑色图像
- t=r0 #轮换通道
- r0=r1
- r1=r2
- r2=t
- if key==27:
- break

通道操作即对色彩通道进行拆分和合并,opencv中BGR格式的图像是三维数组,可用数组索引操作拆分通道。spilt分离、merge合并。
- b,g,r = cv2.split(img3)#分离cv2的BGR颜色通道索引为0,1,2,matplotlib为RBG
- #print(b,g,r)#一串矩阵
- #print(r.shape)
- img4=cv2.merge((b,g,r))#合并B、G、R单通道为三通道彩色图像
- #print(img4.shape)
- cur_img1=img3.copy()
- cur_img1[:,:,1]=0
- cur_img1[:,:,2]=0
- cv_show('B',cur_img1)#只保留B通道
- cur_img2=img3.copy()
- cur_img2[:,:,0]=0
- cur_img2[:,:,2]=0
- cv_show('G',cur_img2)#只保留G通道
- cur_img3=img3.copy()
- cur_img3[:,:,0] = 0
- cur_img3[:,:,1] = 0
- cv_show('R',cur_img3)#只保留R通道

运算分加法运算、加权加法运算、位运算。加法运算有“+”和cv2.add()函数两种,“+”执行后如果结果大于256则会按256取模;cv2.add()执行后若结果大于256则会取255。加权加法用函数cv2.addWeighted(图1,权重1,图2,权重2,附加值)。位运算有按位与cv2.bitwise_and(图一,图二,mask)、按位或bitwise_or、按位取反bitwise_not、按位异或bitwise_xor四种。按位与常用于创建掩模图像。
作为初学者,里面可能有总结不全,后续深入学习后会改善文章!下次学习图形用户界面!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。