当前位置: 首页 > 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.dtcms.com/a/319746.html

相关文章:

  • lane_up channel_up
  • mysql8.0.40服务日志时间和linux系统时间不同步问题!
  • 指针——练习
  • 算法 - 贪心算法
  • 计网学习笔记第3章 数据链路层层(灰灰题库)
  • 冷库设备远程监控物联网+省电节能解决方案
  • linux下实现System V消息队列实现任意结构体传输
  • 具身智能,正在翻越三座大山
  • 计算机毕业设计java疫情开放下的新冠信息共享平台 基于Java的社区疫情防控人员流动管理系统 疫情防控期间社区人员动态管理系统
  • 范数的定义、分类与 MATLAB 应用实践
  • 解决React白板应用中的画布内容丢失问题
  • 3363. 最多可收集的水果数目
  • 关键字 - 第二讲
  • Spring AI + Redis:构建高效AI应用缓存方案
  • 【物联网】基于树莓派的物联网开发【25】——树莓派安装Grafana与Influxdb无缝集成
  • 在 Linux 系统上安装 Docker 的步骤如下(以 Ubuntu/Debian为例)
  • 前缀和
  • 简洁明了的讲明什么是哈希(hash)函数
  • [激光原理与应用-170]:测量仪器 - 能量型 - 光功率计的工作原理与内部功能模块组成
  • 【第7话:相机模型3】自动驾驶IPM图像投影拼接技术详解及代码示例
  • 直连微软,下载速度达18M/S
  • Mysql 单行函数 聚合函数
  • MySQL聚簇索引与非聚簇索引详解
  • 北京企业数据防泄漏指南:5款适合北方市场的安全加密工具评测
  • 【华为机试】332. 重新安排行程
  • MySQL——黑马
  • STM32U5 周期性异常复位问题分析
  • 【MyQSL】库 表—基操
  • 性能优化——GPU的影响
  • [C++20]协程:语义、调度与异步 | Reactor 模式