当前位置: 首页 > news >正文

计算机视觉第一课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的更多操作。

http://www.lryc.cn/news/613023.html

相关文章:

  • 水下管道巡检机器人cad【10张】三维图+设计说明书
  • 主流小程序 SaaS 平台测评,2025年小程序开发避坑指南
  • 本地组策略编辑器无法打开(gpedit.msc命令异常)
  • Spring Boot整合PyTorch Pruning工具链,模型瘦身手术
  • 29-数据仓库与Apache Hive-创建库、创建表
  • 2025世界机器人大会开幕在即,英伟达/微美全息前瞻聚焦深化场景实践布局!
  • 实时3D可视化软件加速设计审核流程
  • 通过减少回表和增加冗余字段,优化SQL查询效率
  • 从Web2.0到Web3.0——用户体验如何演进
  • 基于Matlab融合深度学习的视频电梯乘客人数检测平台研究
  • Web3.0引领互联网未来,助力安全防护升级
  • 【RabbitMQ面试精讲 Day 13】HAProxy与负载均衡配置
  • OpenCV入门:图像处理基础教程
  • 在开发板上画出一个2048棋盘的矩阵
  • Docker Buildx最佳实践:多架构镜像构建指南
  • P8250 交友问题
  • 如何理解“信号集是位掩码,每个bit代表一个信号”这句话?
  • QtC++ 中使用 qtwebsocket 开源库实现基于websocket的本地服务开发详解
  • UE5多人MOBA+GAS 39、制作角色上半身UI
  • Redis中间件(四):主从同步与对象模型
  • HarmonyOS系统 读取系统相册图片并预览
  • 基于django的非物质文化遗产可视化网站设计与实现
  • Jenkins全链路教程——Jenkins项目创建与基础构建
  • 2025年机械工程与自动化技术国际会议(ICMEAT 2025)
  • 单链表专题---暴力算法美学(1)(有视频演示)
  • Numpy科学计算与数据分析:Numpy数组索引与切片入门
  • 【论坛系统自动化功能测试报告】
  • 动手学深度学习(pytorch版):第一节——引言
  • 具身智能机器人 - Reachy Mini
  • MyCAT实战环节