OpenCv对图片视频的简单操作
目录
一.OpenCv安装与版本说明
二.图片的构成与颜色原理
三.OpenCv自动补齐功能修复
四.OpenCv的一些操作
1.基础操作
2.图片读取与灰度图转换
3.图片保存
4.ROI(感兴趣区域)提取(切片操作)
5.视频加载与读取
①视频处理
②摄像头调用
③资源释放
6.RGB单通道提取方法
7.单通道显示与彩色效果
8.通道合并
9.图片的打码
10.图片的组合
11.图片的缩放(resize()方法)
一.OpenCv安装与版本说明
- 需安装两个库:
opencv-python
和opencv-contrib-python
,版本可以指定为3.4.18.65
。pip install opencv-python==3.4.18.65 -i 镜像源地址
pip install opencv-contrib-python==3.4.18.65 -i 镜像源地址
- 不推荐使用最新版(4.x),因涉及版权问题且函数调用可能不兼容。
二.图片的构成与颜色原理
图片由像素点组成,每个像素点颜色由 RGB 三通道数值(0-255)决定。
三.OpenCv自动补齐功能修复
四.OpenCv的一些操作
1.基础操作
- 问题现象:代码自动补齐失效(黄色框或下划线提示)。
- 原因:OpenCV 版本过低。
- 解决方法:
- 找到 Python 安装路径下的
site-packages
文件夹(如D:\PY\site-packages
)。 - 进入
cv2
文件夹,复制cv2.pyd
文件到上层目录(site-packages
文件夹内)。 - 重启 Python 环境即可恢复自动补齐功能。
- 找到 Python 安装路径下的
- 查询 Python 安装路径的命令:
win + R
输入cmd
,执行where python
。 - 读取图片:使用
cv2.imread()
,参数为图片路径(避免中文路径)。 - 显示图片:使用
cv2.imshow()
和cv2.waitKey()
,后者控制窗口显示时长(单位毫秒,0 表示无限等待)。 - 关闭窗口:
cv2.destroyAllWindows()
释放内存。 - 图片属性:通过调试模式查看图片的
shape
(高、宽、通道数)、dtype
(数据类型,如uint8
)、size
(总像素数)。import cv2im=cv2.imread('img1.png') cv2.imshow('img1',im) asic=cv2.waitKey(10000)#我们可以通过任意键关闭,比如按下空格键就会返回空格键的ascii码值32 print(asic)#32 cv2.destroyAllWindows() print('图片形状(shape):',im.shape) print('图片数据类型(dtype):',im.dtype) print('图片大小(size):',im.size)图片形状(shape): (864, 1536, 3) 图片数据类型(dtype): uint8 图片大小(size): 3981312
注意事项:
- OpenCV 中通道顺序为 BGR(非 RGB),中文路径或窗口名可能导致乱码或报错。
- 按键 ASCII 码可通过
cv2.waitKey()
获取(如 ESC 键为 27)。
2.图片读取与灰度图转换
- 灰度图特点:单通道(无色彩),像素值范围 0(黑)到 255(白),数据量为彩色图的 1/3。
- 转换方法:
- 使用
cv2.imread()方法读取图片
时添加参数cv2.IMREAD_GRAYSCALE
或简写为0
。
- 使用
- 优势:减少计算量且保留特征(如形状、轮廓)。
import cv2
# 读取图片灰度图
im = cv2.imread('img1.png',cv2.IMREAD_GRAYSCALE)
# 或者im = cv2.imread('img1.png',0)
cv2.imshow('image1_gray',im)
cv2.waitKey(0)
cv2.destroyAllWindows()
print('图片形状(shape):',im.shape)
print('图片数据类型(dtype):',im.dtype)
print('图片大小(size):',im.size)
3.图片保存
- 方法:
cv2.imwrite(文件名, 图片数据)
,如cv2.imwrite("tmp98_gray.jpg", gray_image)
。
cv2.imwrite('image1_gray.png',im)
- 注意:需先关闭
cv2.waitKey()
窗口(按任意键)才能执行保存操作。
4.ROI(感兴趣区域)提取(切片操作)
- 作用:从图像中截取特定区域(如人脸识别时仅分析人脸部分)。
- 实现:通过数组切片(如
image[30:230, 100:300]
截取行 30-230、列 100-300 的矩形区域)。 - 限制:仅支持矩形区域,无法按轮廓裁剪。
# 切片图片部分内容
a=im[100:500,200:700]
cv2.imshow('img1',im)
cv2.imshow('a',a)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.视频加载与读取
- 使用 OpenCV 的
cv2.VideoCapture()
方法加载本地视频文件,支持中文字符路径。 - 视频播放通过循环逐帧读取(
video_capture.read()
),每帧画面显示时长由cv2.waitKey()
参数控制(默认60毫秒)。 - 播放速度可通过调整
waitKey
参数修改(如1000毫秒为慢速,1毫秒为快速)。 - 视频窗口可以设置按
ESC
键(ASCII值27)关闭。
import cv2
# video_capture = cv2.VideoCapture(0)
video_capture = cv2.VideoCapture('zqt.mp4')
if not video_capture.isOpened():print('视频打开失败')exit()while True:#逐帧读取视频ret,frame=video_capture.read()# 检查是否成功读取if not ret:break# frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)cv2.imshow('video',frame)if cv2.waitKey(100)==27:break
video_capture.release()
cv2.destroyAllWindows()
①视频处理
- 将视频转换为灰度图:
- 方法1:通过
cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
逐帧转换。 - 方法2:加载时直接使用
cv2.IMREAD_GRAYSCALE
参数(需注意与第一种方法的参数区别)。
- 方法1:通过
- 处理逻辑可插入在读取帧(
frame
)与显示之间,例如人脸检测等。
②摄像头调用
- 将
VideoCapture
参数改为0
可调用本地摄像头,支持多摄像头切换(如0、1、2)。
③资源释放
- 视频处理完成后需调用
video_capture.release()
释放资源,避免内存占用过高。 - 关闭所有窗口使用
cv2.destroyAllWindows()
。
6.RGB单通道提取方法
- 方法一:数组切片
- 使用冒号切片(如
a[:,:,0]
)提取通道,索引0为B通道,1为G通道,2为R通道。 - 提取后的单通道图像为灰度图,无色彩。
import cv2 img=cv2.imread('img1.png') b=img[:,:,0] g=img[:,:,1] r=img[:,:,2]
- 使用冒号切片(如
- 方法二:
split
函数- 直接调用
cv2.split(a)
返回B、G、R三个通道的数组,效果与方法一相同
- 直接调用
b,g,r=cv2.split(img)
7.单通道显示与彩色效果
- 显示单通道时图像为灰度,因仅保留亮度值。
- 若需显示单通道彩色效果(如仅蓝色),需将其他通道数值设为0(如img
[:,:,1:3]=0
保留B通道)。 - 操作时建议使用
copy()
避免修改原图数据
#设置单颜色
new_img=img.copy()
new_img[:,:,1]=0
new_img[:,:,2]=0
cv2.imshow('new_img',new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
8.通道合并
- 使用
cv2.merge([B,G,R])
将分离的通道合并为彩色图像,合并后恢复原图效果。
b,g,r=cv2.split(img)
# 合并颜色通道
res=cv2.merge((b,g,r))#注意参数是元组形式
cv2.imshow('res',res)
9.图片的打码
使用 OpenCV 和 NumPy 实现指定区域马赛克效果
- 步骤:读取图片 → 选定区域(如200-300行、150-250列) → 用随机生成的像素值(0-255)替换原区域 → 显示结果。
- 关键点:区域大小需与随机生成的数组维度一致(如100x100x3对应RGB三通道)。
import numpy as np
import cv2
new_img[200:300,150:250]=np.random.randint(0,256,(100,100,3))
cv2.imshow('new_img_dama',new_img)
cv2.waitKey(10000)
cv2.destroyAllWindows()
10.图片的组合
基于区域选择(ROI)将两张图片的指定区域融合。
- 示例:将图片的100-250行、200-350列区域替换到另一图片的200-350行、300-450列区域。
- 注意:抠图区域大小需严格一致(如150x150)。
#图片的组合
img2=cv2.imread('nailong.png')
img1[100:250,200:350]=img2[200:350,300:450]#注意组合的距离要相同
cv2.imshow('img1_combine',img1)
cv2.waitKey(10000)
cv2.destroyAllWindows()
11.图片的缩放(resize()方法)
- 指定宽高:直接设置目标尺寸(如宽200、高600),图片按比例拉伸。
- 比例系数:通过
fx
(横向比例)和fy
(纵向比例)调整(如0.5倍缩小或1.5倍放大)。
#图片的大小调整
img1=cv2.imread('img1.png')
new_img=cv2.resize(img1,dsize=None,fx=0.5,fy=0.5)
#或者
# new_img=cv2.resize(img,dsize=(200,600))
cv2.imshow('new_img',new_img)
cv2.waitKey(10000)
cv2.destroyAllWindows()