当前位置:网站首页>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
边栏推荐
猜你喜欢

Retrofit2 初印象?

微信小程序转盘demo
![[Deep learning] attention mechanism](/img/ef/108e6117546dc7fa4b634cd45c3fad.jpg)
[Deep learning] attention mechanism

WebGL:BabylonJS入门——初探:注入活力

【Postgraduate Work Weekly】(Week 12)

研究生工作周报(第四周)

【深度学习】SVM解决线性不可分情况(八)

【深度学习】模型选择、欠/过拟合和感受野(三)

记一次解决Mysql:Incorrect string value: ‘\xF0\x9F\x8D\x83\xF0\x9F...‘ for column 插入emoji表情报错问题
It is deeply recognized that the compiler can cause differences in the compilation results
随机推荐
hugging face tutorial - Chinese translation - model summary
Sequelize配置中的timezone测试
如何防止浏览器指纹关联
升职加薪之SQL索引
Sort method (Hill, Quick, Heap)
从数组到js基础结束
Dagger2从0基础使用,到单例注入的正确姿势
浏览器指纹识别是什么意思?
路由的懒加载与接口的封装
LNK1123: Failed during transition to COFF: invalid or corrupt file
"Deep learning" evaluation index of target detection
crontab失效怎么解决
【Postgraduate Work Weekly】
MIUI12.1.5安装google App store,无需ROOT,不闪退
spark shuffle
【Postgraduate Work Weekly】(Week 8)
It is deeply recognized that the compiler can cause differences in the compilation results
YOLOV2详解
(12)Cookie和Session
微信小程序tabs


