当前位置:网站首页>opencv图像处理及视频处理基本操作
opencv图像处理及视频处理基本操作
2022-08-09 14:57:00 【[email protected]】
计算机眼中的图像由一个个像素组成, 每个像素点的值在0-255之间,代表像素点的亮度(0为最暗,255为最亮)。通常彩色图为三通道,灰度图(黑白图)为单通道。彩色图像包括三个颜色通道——B,G,R,分别表示蓝、绿、红。
目录
10.视频读取和写入
1.图像的表示
图像的高和宽代表图像在竖直和水平方向分别有多少个像素点。也等价于每个颜色通道矩阵的维度。每张图片都是像素值构成的多维数组,彩色图像为三维数组,灰度图为二维数组。

opencv库是开源图像处理和计算机视觉算法库,不同于其他库的是,其终端下载命令为pip install opencv-python,导入库的代码是import cv2
2.图像的读取
cv2.imread(filepath, flag)
• filepath : 文件路径,不能包含中文
• flag:读取的模式(可选)
flag参数值 缩写参数值 含义 cv.IMREAD_UNCHANGED -1 按原样返回加载的图像(如果有透明
通道则保留)cv.IMREAD_GRAYSCALE 0 始终将图像转换为单通道灰度图像 cv.IMREAD_COLOR (默认) 1 始终将图像转换为3通道BGR彩色图
像。
#读取图片(路径不能包含中文)
img=cv2.imread("C:\\Users\\Administrator\\desk\\images\\lena02.png")
print(img) #打印像素
print(img.shape) #(高,宽,通道)3.显示图片
cv2.imshow(windowname, img)
• windowname : 显示的窗口名,字符串形式
• img:要显示的图片
#显示结果
cv2.imshow("img",img)
cv2.waitKey() #等待键盘输入,输入任意键返回
cv2.destroAllyWindow() #关闭窗口4.色彩空间
dst = cv2.cvtColor(src, code)
• src: 输入图像
• code:转换模式,例如cv2.COLOR_BGR2GRAY,
cv2.COLOR_BGR2HSV,数字2的前后分别是转换前和转换后
的色彩空间
#转换为灰度图
gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) #数字2的前后分别是转换前和转换后的色彩空间
print(gray.shape)
#转换为三通道图
img=cv2.cvtColor(gray,cv2.COLOR_RGB2BGR)
print(gray.shape)5.图像的逐点操作(像素级操作)
访问图片中某一特定像素的像素值
• 彩色图像:[行编号,列编号,通道编号]
• 灰度图像:[行编号,列编号]访问图像某个局部区域:图像裁剪(通过切片实现)
• 通过切片的方式得到图片的某一部分局部区域有时也称为ROI(Region Of Interest)
#获取局部区域(roi)
roi=img[384:513,350:550]
#保存roi到roi1.jpg
cv2.imwrite("roi1.jpg", roi)6.图像二值化
二值图像:
• 图像上像素点的灰度值只有两种(一般是0和255)
• 更好地分析物体的形状和轮廓
• 也常作为掩码图像(mask)
图像二值化:
• 将图像变为二值图像的操作
retval, dst = cv2.threshold(src, thresh, maxval, thresholdType)• dst:结果图像
• src:原图像,要求必须是灰度图像
• thresh:阈值,取值范围0~255
• maxVal:像素灰度最大值(最大阈值)
• thresholdType:阈值类型,如下图THRESH_BINARY类型,修改后原图像像素小于127的值会会变成0,大于127的值会变成255
- retval: 返回输入的thresh
- dst: 返回二值化后的图片
img=cv2.imread("D:\\desk\\images\\lena02.png",0) #0:自动将图像转为灰度图
ret,thresh1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
运行结果如下:

7.几何变换-缩放
res = cv2.resize(src, size, fx, fy, interpolation)
•src: 原图
•size:目标的宽和高,格式为(w,h),w和h均为整数
•fx, fy(可选):沿x轴,y轴的缩放系数,当指定这两个数值时,size需输入None
Interpolation(可选):缩放的方式,具体含义见下表
cv2.INTER_NEAREST 最近邻插值 cv2.INTER_LINEAR 双线性插值(默认设置) cv2.INTER_AREA 使用像素区域关系进行重采样 cv2.INTER_CUBIC 4x4像素邻域的双三次插值 cv2.INTER_LANCZOS4 8x8像素邻域的Lanczos插值
img=cv2.imread("C:\\Users\\Administrator\\desk\\images\\lena02.png")
print(img.shape)
#计算宽和高
#方法1
w=int(0.5*img.shape[1])
h=int(0.6*img.shape[0])
img_small=cv2.resize(img,(w,h))
#方法2
img_small=cv2.resize(img,None,fx=0.5,fy=0.6) #res = cv2.resize(src, size, fx, fy, interpolation(可选))
print(img.shape)8.几何变换-平移
dst = cv2.warpAffine(src, M, dsize[,flags,borderMode,borderValue])
•src:输入图像
•M:2*3变换矩阵,float32
tx:水平方向的平移距离 ty:垂直方向的平移距离
•dsize:输出图像的大小,格式为(w,h)
•Flags(可选):插值方法,默认为cv2.INTER_LINEAR(即线性插值)
•borderMode(可选):边的类型
•borderValue(可选):边界值,默认为0
#定义变换矩阵
tx=50 #水平方向的平移距离
ty=50 #垂直方向的平移距离
M=np.float32([[1,0,tx],[0,1,ty]])
#移动图像
lena_shift=cv2.warpAffine(img,M,(img.shape[1],img.shape[0]),borderValue=(255,255,255))
#borderValue定义颜色 dsize:(img.shape[1],img.shape[0])为输出图像的大小,格式为(w,h)9.几何变换-旋转
cv2.warpAffine()除了平移外,还可以实现旋转效果
输入图片和输出大小预先设定,已知
只需要确定M矩阵:cv2.getRotationMatrix2D(center, angle, scale)
•center:输入图像的旋转中心,格式为(x,y),即横坐标在前,纵坐标在后
•angle:旋转角(以度为单位),注意:逆时针旋转角为正,顺时针旋转角为负
•scale:原始图像的缩放系数
h,w,_=img.shape
#定义旋转中心
center_x=int(w/2)
center_y=int(h/2)
#得到变换矩阵,逆时针旋转30,缩放到原图0.6倍
M=cv2.getRotationMatrix2D((center_x,center_y),30,0.6) #旋转中心,旋转角,缩放系数
#调用warpAffine进行旋转
res=cv2.warpAffine(img,M,(w,h))
10.视频读取和写入
OpenCV中的视频读取步骤:
•1.cam = cv2.VideoCapture() 创建视频捕获器
•2.cam.read() 读取视频帧,每次调用都返回读取是否成功和当前帧(失败的话为None)
有两种读取失败的可能:视频损坏、已读到最后一帧
•3.cam.release() 释放视频捕获器
OpenCV中的视频写入步骤:
•1.定义新视频的宽、高、帧率
•2.创建新视频的编码器cv2.VideoWriter_fourcc
•3. 创建新视频的写入对象cv2.VideoWriter
•4.逐帧写入新视频: .write(frame)•5.释放VideoWriter对象: .release()
OpenCV中的获取视频属性: VideoCapture对象的.get()方法
get参数 含义 cv2.CAP_PROP_FRAME_WIDTH 视频帧的宽 cv2.CAP_PROP_FRAME_HEIGHT 视频帧的高 cv2.CAP_PROP_FPS 视频帧的帧率
编码器初始化fourcc= cv2.VideoWriter_fourcc(fourcc_name)
•fourcc: 编码器对象
•fourcc_name:编码器名称,格式为*'编码器', 例如*'mp4v',*'DIVX'.
视频写入对象的初始化vw= cv2.VideoWriter(path, fourcc, fps, frame_size)
•path:保存路径
•fourcc:编码器对象
•fps:帧率
•frame_size:视频帧宽和高,格式为(w,h)
"""将一段视频读取进来,并且将读入的视频帧写到新视频,如果用户有按键输入,则停止写入"""
import cv2
# 第一步:读取视频
# 创建视频捕获器
cam = cv2.VideoCapture("D:\\desk\\chp3.mp4")
# 确定视频高 宽 帧率 视频总帧数
height = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH))
fps = round(cam.get(cv2.CAP_PROP_FPS))
frameCount=cam.get(cv2.CAP_PROP_FRAME_COUNT)
# 创建视频编码器
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 对应的编码器为MP4v
cam_write = cv2.VideoWriter("C:\\Users\\Administrator\\desk\\output.mp4", fourcc, fps, (width, height))
# 第二步:循环得到视频帧,并写入新视频
success, frame = cam.read()
frame_count=0 #当前写入
# 读取视频帧
while success:
# 将视频帧写入新视频
cam_write.write(frame)
cv2.imshow("frame", frame)
# 判断用户是否有按键输入,如果有则跳出循环
# cv2.waitKey如果有用户输入,返回输入的字符,否则返回-1
char = cv2.waitKey(5)
if char != -1:
break
# 读取新视频
success, frame = cam.read()
# 释放视频读取对象
cam.release()
# 释放视频写入对象
cam_write.release()版权声明
本文为[[email protected]]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_59405106/article/details/124290788
边栏推荐
猜你喜欢
随机推荐
scala 内部类使用小细节
YOLOV2详解
Retrofit2 初印象?
浏览器指纹识别是什么意思?
WebGL:BabylonJS入门——初探:我的世界
模型训练的auc和loss比较问题
【深度学习】全面理解支持向量机SVM(七)
将从后台获取到的数据 转换成 树形结构数据
【研究生工作周报】(第五周)
GoogLeNet
抱抱脸(hugging face)教程-中文翻译-任务总结
【Postgraduate Work Weekly】(Week 8)
人脸识别示例代码解析(一)——程序参数解析
The recycle bin has been showed no problem to empty the icon
How to ensure that the data cannot be recovered after the computer hard drive is formatted?
分类任务系列学习——总述
【Postgraduate Work Weekly】(Week 7)
【研究生工作周报】(第十二周)
抱抱脸(hugging face)教程-中文翻译-使用 AutoClass 加载预训练的实例
[Deep learning] attention mechanism











