计算机视觉第一课opencv(一)保姆级教学
目录
简介
一、opencv的安装
1.安装opencv
2.pycharm补全问题
二、图像RGB
三、opencv基本操作
1.图像读取与显示
2.读取灰度图
3.ROI(感兴趣区域)
4.读取视频文件
5.颜色通道处理
6.通道合并
7.图片修改操作
7.1图片打码
7.2图片组合
7.3图片缩放
总结
简介
想踏入计算机视觉的大门,却被复杂的概念和工具吓退?OpenCV 作为视觉处理的 “瑞士军刀”,其实没那么难上手!本博客作为 “计算机视觉 OpenCV 第一课”,专为零基础新手打造保姆级教程:从 OpenCV 的安装(Windows/Linux/Mac 全平台覆盖),到第一个程序的编写与运行;从如何读取、显示、保存图片,到像素的基本操作(如修改颜色、裁剪图像),每一步都附带完整代码和清晰注释。无需高深的数学知识,也不用提前了解图像处理原理,跟着教程敲代码,你会发现:原来用几行代码就能让计算机 “看见” 并处理图像!我们还会用实例拆解常见报错的解决办法,帮你避开入门时的各种 “坑”。读完这个系列,你将掌握 OpenCV 的基础操作,为后续学习图像滤波、边缘检测、目标识别等进阶内容打下扎实基础,轻松迈出计算机视觉的第一步。
一、opencv的安装
1.安装opencv
打开cmd或者pycharm都可以进行下载
pip install opencv-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple
使用清华镜像园下载更快,这里建议不要安装最新的版本,还是使用相对中间的版本,这样后面不会跟其他的库产生冲突,后期因为库的报错问题比较少。
安装完opencv-Python我们接着安装opencv-contrib-python,它是安装 OpenCV 的 contrib 扩展模块(包含更多功能)
pip install opencv-contrib-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple
两个版本要相同,都出现成功安装的提示就是安装完成
2.pycharm补全问题
当我们安装完成准备去pycharm上使用发现导入opencv后没有补全功能,这是因为我们的版本不是最新的版本,需要我们去移动一个文件。
导入opencv
import cv2
我们要找到我们Python的安装目录比如我的
C:\Users\DELL\AppData\Local\Programs\Python\Python39
找到Lib目录下的第三方包
找到cv2找到里面的cv2.pyd文件复制到上一级目录里面也就是sit-packages下
这样我们就发现我们的补全正常了
二、图像RGB
我们要简单了解一下图像的一些基础知识
对于一个彩色的图像:
都是由RGB 三通道是数字图像表示颜色的基础方式,它通过红(Red)、绿(Green)、蓝(Blue)三种基本颜色的组合来呈现出丰富的色彩效果。
三通道的基本概念
对于一张彩色的图片读取可以发现是一个三维的数组,为:高度*宽度*通道
- 通道本质:每个通道都是一个二维矩阵,矩阵中的每个值代表该位置像素的亮度(0-255,0 为最暗,255 为最亮)
- 组合原理:每个像素的颜色由三个通道的对应位置值共同决定
- 存储形式:在 OpenCV 中,RGB 图像存储为形状为
(高度, 宽度, 3)
的 NumPy 数组,第三维对应三个通道
各通道的作用
- 红色通道(R):控制像素中红色分量的强度
- 值越高,红色越鲜艳;值为 0 时无红色成分
- 绿色通道(G):控制像素中绿色分量的强度
- 值越高,绿色越鲜艳;值为 0 时无绿色成分
- 蓝色通道(B):控制像素中蓝色分量的强度
- 值越高,蓝色越鲜艳;值为 0 时无蓝色成分
三、opencv基本操作
现在有张彩色图片:
1.图像读取与显示
import cv2 # 读取的格式是BGR numpy
a = cv2.imread('dama.jpg') # 读取图片,返回NumPy数组(BGR格式)
cv2.imshow('tu', a) # 显示图片,参数为窗口名称和图像数据
b = cv2.waitKey(0) # 等待用户按键,0表示无限等待
cv2.destroyAllWindows() # 关闭所有窗口# 图像属性查看
print("图像形状(shape):", a.shape) # (高度, 宽度, 通道数)
print("图像数据类型(dtype):", a.dtype) # 通常是uint8(0-255)
print("图像大小(size):", a.size) # 总像素数=高度×宽度×通道数
- cv2.imread()默认读取彩色图像,格式为 BGR 而非 RGB
- waitKey(0)会等待用户按下任意键,返回按键的 ASCII 码
- 对于简单程序,窗口会在程序结束时自动关闭
2.读取灰度图
import cv2
b = cv2.imread(r'dama.jpg', cv2.IMREAD_GRAYSCALE) # 读取为灰度图
cv2.imshow('xx', b)
a = cv2.waitKey(0)
cv2.destroyAllWindows()# 灰度图属性
print("图像形状(shape):", b.shape) # 灰度图只有高度和宽度,无通道数
print("图像数据类型(dtype):", b.dtype)
print("图像大小(size):", b.size)# 保存图片
cv2.imwrite('timg98_GRAY.jpg', b) # 保存处理后的图像
cv2.IMREAD_GRAYSCALE
等价于参数0
,将图像转为单通道灰度图cv2.imwrite()
可以保存处理后的图像到指定文件
图片从彩色图片转化为灰度图就相当于三维数组转换为二维数组,也就是三通道转换为单通道。转换为灰度图像像素值会变小计算速度更快。
3.ROI(感兴趣区域)
我们也可以选取图像中的一部分
import cv2
a = cv2.imread(r'dama.jpg')
b = a[30:230, 100:300] # 通过NumPy切片获取ROI,[行范围, 列范围]
cv2.imshow('yuantu', a)
cv2.imshow('qiepian', b)
cv2.waitKey(0)
cv2.destroyAllWindows()
- ROI 是图像中需要重点处理的区域
- 切片语法为
[y1:y2, x1:x2]
,对应图像的高度范围和宽度范围
4.读取视频文件
视频文件可以看作有很多张照片一帧一帧组成,所以对于读取视频也就相当于读取每一帧的照片。
import cv2
video_capture = cv2.VideoCapture('hzw.mp4') # 打开视频文件,参数为0时打开摄像头if not video_capture.isOpened():print("无法打开视频文件")exit()while True:ret, frame = video_capture.read() # 读取一帧,ret表示是否成功if not ret:break # 读取完毕或出错时退出# 转为灰度图处理frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow('Video', frame)if cv2.waitKey(100) == 27: # 按下ESC键(ASCII码27)退出breakvideo_capture.release() # 释放视频资源
cv2.destroyAllWindows()
- 视频处理本质是逐帧处理图像
waitKey(100)
表示等待 1 毫秒,控制视频播放速度- 必须调用
release()
释放视频捕获资源
5.颜色通道处理
import cv2
# 读取图像
a = cv2.imread(r'dama.jpg')# 提取颜色通道
a1 = a[:, :, 0] # 蓝色通道(B)
a2 = a[:, :, 1] # 绿色通道(G)
a3 = a[:, :, 2] # 红色通道(R)# 或者使用split函数
b, g, r = cv2.split(a) # 分离为三个单通道# 显示各通道(单通道显示为灰度图)
cv2.imshow('b', b)
cv2.imshow('g', g)
cv2.imshow('r', r)
cv2.waitKey(100000)
cv2.destroyAllWindows()# 只保留蓝色通道(显示为彩色)
a_new = a.copy()
a_new[:, :, 1] = 0 # 绿色通道设为0
a_new[:, :, 2] = 0 # 红色通道设为0
cv2.imshow('result2', a_new)
cv2.waitKey(100000)
cv2.destroyAllWindows()
- OpenCV 默认使用 BGR 格式而非 RGB
- 单通道图像显示为灰度,值越大越亮
- 要显示单颜色通道的彩色效果,需将其他通道置
6.通道合并
import cv2
a = cv2.imread(r'dama.jpg')
b, g, r = cv2.split(a) # 分离通道
img = cv2.merge((b, g, r)) # 合并通道,注意顺序必须是BGR
cv2.imshow('result3', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.merge()
用于将分离的通道重新组合为彩色图像- 合并顺序必须与 OpenCV 的 BGR 格式一致
7.图片修改操作
7.1图片打码
这里使用到了numpy的随机生成数、将指定范围重新生成0-255的图像,选取的大小要和生成的图像大小相同
import cv2
a = cv2.imread(r'dama.jpg')
# 在指定区域添加随机颜色的马赛克
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))
cv2.imshow('masaike', a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()
- 通过 NumPy 数组赋值修改图像像素
- 赋值区域的大小必须与原始区域完全匹配
7.2图片组合
把一张图片的一部分组合到另外一张图片上
import cv2
a = cv2.imread('dama.jpg')
b = cv2.imread('Log_Big_Mom.png')
# 将a的部分区域复制到b的指定位置
b[200:350, 200:350] = a[50:200, 100:250] # 两个区域大小必须相同
cv2.imshow('b', b)
cv2.imshow('a', a)
cv2.waitKey(100000)
cv2.destroyAllWindows()
- 实现图像拼接或覆盖效果
- 注意两个区域的尺寸必须完全一致
7.3图片缩放
import cv2
a = cv2.imread('dama.jpg')
# 方法1:指定目标大小(宽, 高)
a_new = cv2.resize(a, dsize=(200, 600))# 方法2:指定缩放比例
# a_new = cv2.resize(a, dsize=None, fx=1.5, fy=0.5) # fx:x轴缩放, fy:y轴缩放cv2.imshow('a', a)
cv2.imshow('a_new', a_new)
cv2.waitKey(100000)
cv2.destroyAllWindows()
cv2.resize()
提供两种缩放方式:指定目标尺寸或缩放比例- 注意
dsize
参数是 (宽度,高度),而图像 shape 是 (高度,宽度
总结
这些示例涵盖了 OpenCV 的基础操作,包括图像读写、显示、通道处理、区域操作、视频处理等核心功能,是学习计算机视觉的良好起点。后面还会继续介绍opencv的更多操作。