文章目录

  • 前言
  • 一、opencv基础知识
    • 1.opencv相关概念
      • 1.1背景
      • 1.2特点
      • 1.3主要功能与应用
      • 1.4.opencv-python
    • 2.计算机中的图像概念
      • 2.1图像表示
      • 2.2图像存储
      • 彩色图像
  • 二、opencv基础操作
    • 1.图像的读取
    • 2.图像的显示
    • 3.保存图像
    • 4.创建黑白图及随机像素彩图
    • 5. 图像切片(图片剪裁)
    • 6.图像大小调整
    • 7.图形绘制
      • 7.1绘制直线
      • 7.2绘制矩形
      • 7.3绘制圆形
      • 7.4综合示例
    • 8.视频读取
  • 总结


前言

今天我们将要进入opencv的学习,Python中的opencv利用了numpy的一些框架,所以我们学习opencv之前还要具备numpy的相关知识。


一、opencv基础知识

1.opencv相关概念

1.1背景

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和图像处理库,由 Intel 发起开发,现由 OpenCV.org 维护。它支持多种编程语言,包括 C++、Python 和 Java,并且能在多个平台(Windows、Linux、macOS、Android 等)运行。

在 Python 中,我们使用 opencv-python 模块进行开发,拥有强大的图像处理与视觉识别能力。

1.2特点

功能强大:
算法覆盖全面,从基础图像处理到高级机器学习。
性能优越:
使用 C++ 编写并具 GPU 加速,适合实时处理
社区活跃:
由基金会维护,文档齐全,社区支持强,样例丰富。

1.3主要功能与应用

图像处理:
滤波、边缘检测、形态转换、角点特征提取(如 Harris、SIFT、ORB)
物体识别与检测:
面部检测(Haar 级联、DNN)、行人检测、目标跟踪
机器学习集成:
图像分类、聚类、对象识别与行为分析等。
摄像头与视频处理:
实时视频流的处理、运动检测、3D 重建、拼接图像、立体视觉等
深度学习支持:
支持加载 ONNX、TensorFlow、Caffe 等格式的网络进行目标检测、分类等

1.4.opencv-python

OpenCV-Python是原始OpenCV C++实现的Python包装器。它结合了OpenCV C++ API的高性能与 Python 语言的易用性和简洁性。通过 OpenCV-Python,开发者可以轻松地进行图像处理、计算机视觉任务以及机器学习应用。

C / C++等语言相比,Python速度较慢。Python可以使用C / C++扩展,这使我们可以在C / C++中编写计算密集型代码,并创建可用作Python模块的Python包装器。

两个好处: 首先,代码与原始C / C++代码一样快(因为它是在后台工作的实际C++代码),其次,在Python中编写代码比使用C / C++更容易。

OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库。所有OpenCV数组结构都转换为Numpy数组。这也使得其与使用Numpy的其他库(如SciPyMatplotlib)集成更容易。

安装opencv-python
在终端里面,可以用pip命令安装opencv-python

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

2.计算机中的图像概念

2.1图像表示

像素是图像的基本单元,每个像素存储着图像的颜色亮度其他特征。一系列像素组合到一起就形成了完整的图像,在计算机中,图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不同,每个像素可以用不同的二进制数表示。

计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息,我们平常接触的图像都是8位数图像。opencv中常用的是8位图像,大多数彩色和灰度图像使用8位表示每个通道的像素值,范围从0到255,其中0代表最黑,255表示最白

日常生活中常见的图像是RGB三原色图。RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜色按照一定比例混合而成的,几乎所有颜色都可以通过这三种颜色按照不同比例调配而成。在计算机中,RGB三种颜色被称为RGB三通道,每个通道的取值都是0-255,根据这三个通道存储的像素值,来对应不同的颜色。

2.2图像存储

在OpenCV中,无论是读取还是创建图像,结果都是一个NumPy数组。

  • 彩色图像:三维数组

  • 灰度图像:二维数组

图像本质上是像素值的二维或三维矩阵(对于彩色图像)。

  • 形状(Shape):
    • 图像的尺寸由其高(height)、宽(width)和通道数(channels)决定。可以通过img.shape属性获取这些信息。
    • 对于彩色图像(如RGB),返回的是一个包含三个值的元组 (height, width, channels)
    • 对于灰度图像,返回的是一个包含两个值的元组 (height, width),因为灰度图像只有一个通道。
  • 数据类型(dtype):
    • 图像中的每个像素值的数据类型决定了可以存储的最大值。例如,8位无符号整数(np.uint8)允许的范围是从0到255。
  • 像素表示
    • 单通道图像(灰度图像):每个像素由一个数值表示,代表该点的亮度。值越低(接近0),颜色越暗;值越高(接近255),颜色越亮。
    • 多通道图像(彩色图像):
      在OpenCV中,默认情况下,彩色图像是以BGR(蓝-绿-红)顺序存储

彩色图像

每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放彩色图像。

示例
生成一个512*512大小的彩色图片 每一个像素点随机颜色

import cv2 as cv
import numpy as np
if __name__ == '__main__':# 生成随机彩色图dst = np.random.randint(0,256,(512, 512, 3), dtype=np.uint8)cv.imshow('dst', dst)# 显示cv.waitKey(0)cv.destroyAllWindows()

二、opencv基础操作

1.图像的读取

基本格式:

cv2.imread(path  [,读取方式])

参数说明:

  • filename:图像路径

    • ./ 表示当前目录。

    • ../ 表示当前目录的上一级目录(即父目录)。当你需要引用或访问当前目录所在位置的上一层目录中的文件或文件夹时使用 ../

  • 读取方式:彩色·默认、灰色等

示例

import cv2 as cv
if __name__ == '__main__':# 读取图像 cv.imread(path, cv.IMREAD_COLOR) 默认读为BGR彩色图像cat = cv.imread('../images/1.jpg')print(cat.dtype) # np.uint8 无符号8位整数print(cat.shape) # (h, w, c)

2.图像的显示

基本格式:

cv2.show('winname',img)

参数说明:

  • winname:显示图像的窗口名,以字符串类型表示

  • img:要显示的图像

  • cv.waitKey(0):表示无限期地等待任何键盘按键。这种用法常见于图像显示窗口中,确保图像在窗口中显示直到用户决定关闭它。

  • cv.waitKey(n):n>0,意味着程序将等待n毫秒。这种方式常用于视频播放或实时摄像头捕获场景,以便控制每一帧停留的时间,同时允许用户通过按键来中断循环或发出命令。

  • 释放内存

    • cv2.destroyAllWindows([winname])  # 释放内存
      
    • cv2.destroyAllWindows():会在当前程序执行到该语句时立即销毁打开的窗口,并释放与这些窗口相关的资源。
    • winname:窗口名,关闭指定名称的窗口。可省略,销毁所有已打开的窗口。

    注意: 在调用显示图像的API后,要调用cv2.waitKey(0)给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。

示例

import cv2 as cv
if __name__ == '__main__':cat = cv.imread('../images/1.jpg')# 显示图像 cv.imshow(window, img)cv.imshow('myimg', cat) # 无窗体就会自动创建窗口'myimg'cv.waitKey(0) # 给图像留下绘制时间,等待n毫秒:n毫秒后关闭窗口,0表示一直等待# 释放资源cv.destroyAllWindows()

3.保存图像

基本格式:

cv2.imread(path, img)

参数说明:

  • path:图片保存的路径及图片名
    • 注意加上图片文件类型后缀(.png / .jpg等)
  • img:要保存的图像
import cv2 as cv
if __name__ == '__main__':cat = cv.imread('../images/1.jpg')cv.write('./cat.jpg',cat)

4.创建黑白图及随机像素彩图

使用numpy中的np.zeros()创建黑色图像
使用numpy中的np.full()创建白色图像
使用numpy中的np.random.randint()创建随机彩图

示例

import numpy as np
import cv2 as cvif __name__ == '__main__':# 创建黑色图像height = 360width = 540c = 3black = np.zeros((height, width, c))cv.imshow('black', black)# 使用np.full()创建白色图像white = np.full((height, width, c), fill_value=255, dtype=np.uint8)cv.imshow('white', white)'''或者black[:] = 255; 或者black[:,:] = 255;或者black[:,:,:] = 255后两种运用了numpy中的广播机制'''# 生成随机彩色图dst = np.random.randint(0,256,(height, width, c), dtype=np.uint8)cv.imshow('dst', dst)# 显示cv.waitKey(0)cv.destroyAllWindows()

5. 图像切片(图片剪裁)

  • Opencv中,图像切片用于从图像中提取一个子区域(矩形区域)。

  • 假设你有一个图像img,它的类型是numpy.ndarrayimg[y:y+h,x:x+w]的含义如下:

    • x:子区域左上角的x坐标
    • y:子区域左上角的y坐标
    • w:子区域的宽度
    • h:子区域的高度
  • 切片操作

    • img[y:y+h,x:x+w]提取的是从(x,y)开始,高度为h,宽度为w的矩形区域
  • 注意:

    • **边界检查:**确保(y,x)(y+h,x+w)都在图像的边界内,否则会出现索引越界错误。
    • 数据类型:img通常是numpy.ndarray类型,切片操作返回的也是numpy.ndarray类型。

示例

import cv2 as cvif __name__ == '__main__':# 读取图像cat = cv.imread('../images/1.jpg')print(cat.shape)# 切片w,h(289,231)(368,297) 数组中是 h,weye = cat[231:298, 289:369]eye = cv.resize(eye, (500, 500))cv.imshow('eye', eye)cv.waitKey(0)cv.destroyAllWindows()

6.图像大小调整

cv2.resize是Opencv库中用于调整图像大小的函数,在图像处理中很常用,特别是在要对图像进行缩放以适应不同需求时。

基本格式:

cv2.resize(img,dsize)

参数说明:

  • img:输入图像,通常是二维或三位NumPy数组。
  • dsize:输出图像的尺寸,是一个二元组(w,h)

示例

import cv2 as cvif __name__ == '__main__':# 读取图像pig = cv.imread('../images/pig.png')print(pig.shape) # (650, 1080, 3)# 调整图像大小pig2 = cv.resize(pig, (500, 500))cv.imshow('pig2', pig2)cv.waitKey(0)cv.destroyAllWindows()

7.图形绘制

7.1绘制直线

基本格式:

cv2.line(img,sart,end,color,thickness)

参数说明:

  • img:要绘制直线的图像
  • start、end:直线的起点和终点
  • color:直线的颜色(对于彩色图像,使用 BGR 格式指定颜色)
  • thickness:线条宽度

7.2绘制矩形

基本格式:

cv2.rectangle(img,leftupper,rightdown,color,thickness)

参数说明:

  • img:要绘制矩形的图像
  • leftupper、rightdown:矩形的左上角和右下角坐标
  • color:线条的颜色
  • thickness:线条的宽度,-1时生成闭合图案并填充颜色

7.3绘制圆形

基本格式:

cv2.circle(img,centerpoint,r,color,thickness)

参数说明:

  • img:要绘制圆形的图片
  • centerpoint、r:圆心和半径
  • color:线条颜色
  • tnickness:线条宽度,为-1时生成闭合图案并填充颜色
  • lineType=cv2.LINE_AA:使用反走样技术绘制边框(默认cv2.LINE_8)

7.4综合示例

import cv2 as cvif __name__ == '__main__':cat = cv.imread('../images/1.jpg')# 绘制直线cv2.line(img,起始坐标,终止坐标,color,thickness,lineType'平滑度-抗锯齿')cv.line(cat, (50,40), (300, 40),color=(0,255,255),thickness=3)# 绘制矩形cv2.rectangle(img,左上坐标,右下坐标,color,thickness,lineType'平滑度-抗锯齿')cv.rectangle(cat,(78,106),(280, 306),color = (100,100,100), thickness=2)# 绘制圆形cv2.circle(img,圆心坐标,半径,color,thickness,lineType'平滑度-抗锯齿')cv.circle(cat,(325,269),30,color = (200,100,100), thickness=3,lineType=cv.LINE_AA)# 图形显示cv.imshow('cat', cat)cv.waitKey(0)cv.destroyAllWindows()

8.视频读取

基本格式:

cap = cv2.VideoCapture(path)
ret,frame = cap.read()

参数说明:

  • path:视频流资源路径,如果设置为0,代表从默认摄像头捕获视频流
  • 返回值cap调用read()方法得到一个布尔值和一帧图像,布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败,如果为True,frame则是当前帧的图像数据。

示例

import cv2 as cvif __name__ == '__main__':# 创建一个VideoCapture对象cap = cv.VideoCapture(0)# 循环读取每一帧while True:# 调用read()方法读取每一帧ret, img = cap.read()# 判断是否读取成功if not ret:print('播放完成')breakcv.imshow('dst', img)# 捕获按键,判断是否中断if cv.waitKey(40)&0xFF == ord('q'):# 获取返回值的低8位print("按键退出")break# 释放cap.release()cv.destroyAllWindows()

总结

今天算是opencv的入门,相较于之前的python基础来说要轻松一点,就是要注意的细节比较多,稍微要了解的就是视频读取时’捕获按键,判断是否中断’这里的原理,了解清楚之后就没什么太难的东西了。
让我们下期再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90568.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90568.shtml
英文地址,请注明出处:http://en.pswp.cn/web/90568.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何撤销Git提交误操作

要撤销在主分支上的 git add . 和 git commit 操作,可以按照以下步骤安全回退: 完整回退步骤: # 1. 查看提交历史,确认要回退的commit git log --oneline# 示例输出: # d3f4g7h (HEAD -> main) 误操作提交 # a1b2c3…

React+Three.js实现3D场景压力/温度/密度分布可视化

本文介绍了一个基于React和Three.js的3D压力可视化解决方案,该方案能够: 加载并渲染3D压力模型数据 提供动态颜色映射功能,支持多种颜色方案:彩虹-rainbow,冷暖-cooltowarm,黑体-blackbody,灰度-grayscale 实现固定位置的颜色图…

Go 官方 Elasticsearch 客户端 v9 快速上手与进阶实践*

1、为什么选择 go-elasticsearch? 版本同步:与 Elasticsearch 主版本保持一一映射,当前稳定分支为 v9,对应 ES 9.x 系列。(GitHub)完全覆盖 REST API:所有 HTTP 端点都有等价方法,避免手写 JSON/HTTP。可插…

`/etc/samba/smb.conf`笔记250720

/etc/samba/smb.conf笔记250720 /etc/samba/smb.conf 是 Samba 服务的核心配置文件,用于实现 Linux/Unix 与 Windows 系统间的文件和打印机共享。以下详解其结构和常用参数: 配置文件结构 1. 全局设置段 [global] 控制 Samba 服务器的整体行为。 …

Java从入门到精通!第十六天,重点!(多线程和线程池)

一、多线程1.基本概念(1)程序(Program):为了完成特定的任务,用某种计算机语言编写的一组指令的集合,即指一段静态的代码(源代码经编译之后形成的二进制格式的文件&#x…

轨道交通为什么要有信号系统?

轨道交通为什么要有信号系统?轨道交通信号系统与公路信号系统有什么不同? 在轨道交通中信号系统是必不可少的,其根本原因在于:在轨道交通中已经没有办法纯靠人力去保证行车安全。 在公路交通中,信号其实是起辅助作用的…

docker 挂载卷

以下是针对您遇到的问题分步解答和解决方案:一、核心结论 ✅ 可以采用目录方式:您的命令中的 -v /root/nginx05-vol/:/usr/share/nginx/html/ 是正确的目录挂载语法。 ❌ 看不到新文件的可能原因主要集中在 权限问题、缓存机制 或 操作顺序错误 上。二、…

uniapp 报错 Not found ... at view.umd.min.js:1的问题

问题描述: uniapp的app中,当页面中使用多个v-if后会出现这个报错解决方案: 1、在v-if的地方加上key属性(key属性要保证唯一) 2、用v-show替换v-if(不建议,可能会影响业务)

水电站自动化升级:Modbus TCP与DeviceNet的跨协议协同应用

水电站的自动化系统就像一个精密的“神经中枢”,既要应对水流变化带来的动态负载,又得保证闸门启闭、水轮机调节等关键动作的精准性。我们去年参与的某水电站改造项目里,就遇到了一个典型问题:中控室的施耐德PLC采用Modbus TCP协议…

基于Matlab图像处理的火灾检测系统设计与实现

随着计算机视觉技术的快速发展,基于图像处理的火灾检测系统在安全监控领域的应用得到了广泛关注。本文提出了一种基于图像处理的火灾检测系统,该系统通过对图像进行预处理、颜色空间转换、阈值化处理和形态学分析,自动检测火灾疑似区域。首先…

信息学奥赛一本通 1593:【例 2】牧场的安排 | 洛谷 P1879 [USACO06NOV] Corn Fields G

【题目链接】 ybt 1593:【例 2】牧场的安排 洛谷 P1879 [USACO06NOV] Corn Fields G 【题目考点】 1. 状压动规 【解题思路】 集合状态:n个元素中,选择x个元素构成的集合,可以由一个n位二进制数表示。第i位为1表示选择第i个元…

SpringBoot创建项目的方式

一、Idea Spring initializr创建(Spring 官网下载) Spring官网只支持SpringBoot3.0以上,JDK17以上 二、idea Spring inst创建(阿里云下载) 阿里云可以支持JDK8的版本 Spring版本选择2.7.6,选择合适的依赖添…

云原生 —— K8s 容器编排系统

一、 简介Kubernetes,也称为K8s,是一个开源的容器编排系统,用于自动部署、扩展和管理容器化应用程序,帮助开发者更高效地跨集群管理应用。本文总结了 k8s 的基础概念和技术架构。二、基础概念1. 云原生(Cloud Native…

SQLite中SQL的解析执行:Lemon与VDBE的作用解析

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 在 SQLite 的内部实现中,SQL 语句的解析与执行是一个精妙的过程,涉及词法分析、语法分析、中间代码生成与执行等多个环节。其中,Lemon 工具和 VDBE(Virtual Database Engine…

C++学习笔记(十:类与对象基础)

往篇内容: C学习笔记(一) 一、C编译阶段※ 二、入门案例解析 三、命名空间详解 四、C程序结构 C学习笔记(二) 五、函数基础 六、标识符 七、数据类型 补充:二进制相关的概念 sizeof 运算符简介 补…

图片查重从设计到实现(4)图片向量化存储-Milvus 单机版部署

Milvus 单机版部署 在 Docker 环境下安装、应用和配置 Milvus 向量数据库可以按照以下步骤进行,涵盖从安装到基础应用的完整流程: 1. 部署前准备 服务器:建议测试环境配置 2 核 CPU、8GB 内存;处理 100 万组向量数据,…

前端版本更新检测机制

📌 一、为什么需要前端版本更新检测机制?在现代 Web 项目中,我们通常会通过 CDN 或缓存策略来加快页面加载速度,但这也带来了一个问题:用户可能访问的是旧版本的页面或资源,而不会自动更新到最新版本。这在…

Python(09)正则表达式

特殊字符 1. 基本元字符 .:匹配除换行符以外的任意单个字符。 *:匹配前面的元素零次或多次。 :匹配前面的元素一次或多次。 ?:匹配前面的元素零次或一次。 2. 定量符 {n}:匹配前面的元素恰好 n 次。 {n,}:…

k8s容器放开锁内存限制

参考:https://access.redhat.com/solutions/1257953 问题 nccl-test容器docker.io/library/nccl-tests:24.12中跑mpirun,buff设置为NCCL_BUFFSIZE503316480 提示out of memory: pod-1:78:91 [0] include/alloc.h:114 NCCL WARN Cuda failure …

基于Zigee的温度数据采集系统

大家好,本文带来的是单片机课设-基于Zigee的温度数据采集系统。 一、设计内容和要求 基于Zigbee的数据采集系统 1.1设计内容 (1)分析对比Bluetooth、Zigbee、Lora方式组网的基本原理和性能差异,撰写分析报告; &#xf…