【Python第三方库】OpenCV库实用指南

在这里插入图片描述

文章目录

  • 前言
  • 安装OpenCV
  • 读取图像
  • 图像基本操作
    • 获取图像信息
    • 裁剪图像
    • 图像缩放
    • 图像转换为灰度图
    • 图像模糊处理
    • 边缘检测
    • 图像翻转
    • 图像保存
  • 视频相关操作
    • 方法讲解
    • 读取视频
    • 从摄像头读取视频

前言

OpenCV(Open Source Computer Vision Library)作为一个强大的计算机视觉库,提供了丰富的图像处理和计算机视觉功能,尤其在图像识别、对象检测、视频分析等领域有着广泛的应用。本文将带领读者使用Python编程语言,通过简单的代码示例,初步掌握OpenCV的图像处理技术。

安装OpenCV

首先,我们需要在Python环境中安装OpenCV库,可以通过以下命令进行安装:

pip install opencv-python

安装完成后,我们可以导入OpenCV库,并加载一张图像来开始我们的操作。

读取图像

读取图像是图像处理的第一步,OpenCV通过cv2.imread()方法可以轻松完成。代码如下:

import cv2# 读取图像
image = cv2.imread('path_to_image.jpg')# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)  # 按任意键关闭窗口
cv2.destroyAllWindows()

在这段代码中:

  • cv2.imread()方法用于读取图像,参数为图像文件路径。图像文件要确认存在,否则会返回None。
  • cv2.imshow()可以将图像显示在窗口中,参数分别是窗口名称和图像数据。
  • cv2.waitKey()用于等待键盘事件,参数0表示无限等待。会等待用户按下任意键,然后关闭显示窗口。
  • cv2.destroyAllWindows()用于关闭所有窗口。

图像基本操作

接下来,我们可以对读取的图像进行一些基本的操作,如获取图像信息、裁剪、缩放等。

获取图像信息

# 获取图像的高度、宽度及通道数
height, width, channels = image.shape
print(f"Height: {height}, Width: {width}, Channels: {channels}")

裁剪图像

# 裁剪图像
cropped_image = image[50:200, 100:300]  # 裁剪区域为y轴从50到200,x轴从100到300
cv2.imshow('Cropped Image', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像缩放

# 缩放图像
resized_image = cv2.resize(image, (300, 200))  # 将图像缩放至300x200
cv2.imshow('Resized Image', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像转换为灰度图

有时候,我们只需要处理图像的灰度部分,可以通过cv2.cvtColor()函数将彩色图像转换为灰度图:

# 转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下是 cv2.COLOR_* 常见的颜色空间转换类型及其解释:

  1. cv2.COLOR_BGR2GRAY:将彩色图像从 BGR 模式转换为灰度图像。
  2. cv2.COLOR_BGR2RGB:将图像从 BGR 模式转换为 RGB 模式。(OpenCV 默认使用 BGR 排列,而许多其他库(如 Matplotlib)使用 RGB 排列,因此需要将 BGR 转为 RGB。)
  3. cv2.COLOR_BGR2HSV:将图像从 BGR 模式转换为 HSV 模式。(HSV 模式分别表示色调(Hue)、饱和度(Saturation)、亮度(Value),该模式更接近人类对颜色的感知,常用于色彩过滤和图像分割。)
  4. cv2.COLOR_BGR2LAB:将图像从 BGR 模式转换为 LAB 模式。(LAB 颜色空间分为亮度(L)、绿色到红色(A)、蓝色到黄色(B)。该模式常用于增强图像对比度。)

更多不在说明,可查询官方文档

图像模糊处理

模糊处理常用于图像预处理,OpenCV提供了多种模糊算法,如高斯模糊、中值模糊等。以下是使用高斯模糊的代码示例:

# 高斯模糊处理
blurred_image = cv2.GaussianBlur(image, (15, 15), 0)  # 核大小为15x15
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

边缘检测

Canny 边缘检测是一种常见的图像处理技术,用于找出图像中的“边缘”,也就是物体之间的轮廓或变化最明显的部分。它被广泛应用于图像识别、对象检测等领域。代码如下:

# 边缘检测
edges = cv2.Canny(image, 100, 200)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这段代码中,cv2.Canny()的两个参数分别为低阈值和高阈值,控制边缘检测的敏感度。

cv2.Canny(image, 100, 200):使用Canny边缘检测。这里的 100 是低阈值,200 是高阈值,决定了检测的灵敏度。

图像翻转

图像翻转是将图像沿水平或垂直方向进行翻转,常见的有水平翻转和垂直翻转两种。在 OpenCV 中,可以使用 cv2.flip() 函数来实现图像的翻转。

dst = cv2.flip(src, flipCode)

第一个参数表示要进行翻转的输入图像。第二个参数表示翻转类型,可以取以下值:

  • flipCode > 0:水平翻转(沿y轴翻转)
  • flipCode = 0:垂直翻转(沿x轴翻转)
  • flipCode < 0:同时沿水平和垂直方向翻转

图像保存

处理完图像后,我们可以通过cv2.imwrite()将图像保存到磁盘上。以下是保存图像的代码:

# 保存图像
cv2.imwrite('output_image.jpg', gray_image)

视频相关操作

OpenCV不仅可以处理静态图像,还能够处理视频数据。无论是从摄像头实时获取视频,还是读取视频文件,都可以通过OpenCV轻松完成。

方法讲解

  1. cv2.VideoCapture():VideoCapture() 是 OpenCV 用于捕获视频流的类,无论是从文件、摄像头,还是网络摄像头,都会使用它。它接受视频源作为参数,参数可以是摄像头的索引(如本地摄像头索引为 0)、视频文件的路径、或者网络摄像头的 URL 地址。
  2. video_capture.isOpened():用于检查视频源是否成功打开。它返回一个布尔值,True 表示视频源成功打开,False 则表示打开失败。
  3. video_capture.read():从视频流中读取一帧图像。返回值有两个,分别是ret表示是否成功读取到帧,成功时为 True,失败时为 False。frame读取到的当前帧,通常是一个 numpy 数组,表示图像的数据。这个方法是视频处理中核心的循环部分,每次调用都会返回下一帧视频图像。如果 ret 为 False,通常表示视频流已经结束或读取出错。
  4. cv2.imshow():用于在窗口中显示图像或视频帧。有两个参数,分别是窗口名和要显示的图像或视频帧,它是一个包含图像数据的 numpy 数组。

读取视频

首先,我们要知道如何读取视频文件。OpenCV提供了cv2.VideoCapture()方法用于打开视频文件或摄像头。

import cv2# 打开视频文件
video_capture = cv2.VideoCapture('path_to_video.mp4')# 检查视频是否成功打开
if not video_capture.isOpened():print("无法打开视频文件")exit()# 循环读取视频帧
while True:ret, frame = video_capture.read()# 如果读取成功if ret:# 显示当前帧cv2.imshow('Video', frame)# 等待键盘输入,如果按下'q'键,退出循环if cv2.waitKey(25) & 0xFF == ord('q'):breakelse:break# 释放视频资源
video_capture.release()
cv2.destroyAllWindows()

从摄像头读取视频

除了读取视频文件,OpenCV 也可以直接从电脑的摄像头获取视频流。cv2.VideoCapture(0) 表示打开默认摄像头。

import cv2# 打开摄像头
video_capture = cv2.VideoCapture(0)# 检查摄像头是否成功打开
if not video_capture.isOpened():print("无法打开摄像头")exit()# 循环读取视频帧
while True:ret, frame = video_capture.read()# 如果读取成功if ret:# 显示当前帧cv2.imshow('Webcam Video', frame)# 按下'q'键退出if cv2.waitKey(1) & 0xFF == ord('q'):breakelse:break# 释放摄像头资源
video_capture.release()
cv2.destroyAllWindows()

注意:也可以通过网络摄像头的访问地址,通常是 HTTP 或 RTSP 协议。可以通过 IP 地址和端口访问视频流。有时需要摄像头的认证(用户名和密码),可以将其嵌入到URL中。 例如:

rtsp://username:password@your_camera_ip:port/stream

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

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

相关文章

20 递归算法精髓解析:基准、性质、案例(阶乘、斐波拉契、猴子吃桃、汉诺塔等)、与循环的对比

目录 1 概述 2 递归的基本组成部分 2.1 基准情况 2.2 递归步骤 2.3 案例&#xff1a;循环实现阶乘的计算 2.4 案例&#xff1a;递归函数实现阶乘的计算 3 递归的性质 3.1 自我调用 3.2 栈的使用 3.3 问题分解 3.4 性能考虑 3.5 案例&#xff1a;递归的回溯 4 综合…

学习结构体的使用

对于结构体的创建&#xff0c;首先要创建一个结构体类型&#xff0c;像下面这样&#xff1a; 结构体对成员的访问&#xff0c;就是变量名.成员就可以了 当然对于结构体的声明还有一些特殊的声明 结构体的自引用 结构体的重命名

RK3562/3588系列之5—其他实用工具

RK3562/3588系列之5—其他实用工具 1. vmware 虚拟机与主机之间共享文件夹2.RK3588开发板与电脑进行adb连接参考文献1. vmware 虚拟机与主机之间共享文件夹 使用此功能前需要提前安装好vmware tools。 启动虚拟机,依次进行如下操作,在主机创建共享文件夹。 然后就可以在如下…

Java | Leetcode Java题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; class Solution {public int sumOfLeftLeaves(TreeNode root) {if (root null) {return 0;}Queue<TreeNode> queue new LinkedList<TreeNode>();queue.offer(root);int ans 0;while (!queue.isEmpty()) {TreeNode node que…

记录一下,Vcenter清理/storage/archive空间

一、根因 vpostgres&#xff1a;这个目录可能包含与 vCenter Server 使用的 PostgreSQL 数据库相关的归档文件过多&#xff0c;导致空间被占用。 二、处理过程 1、SSH登陆到Vcenter. 2、df -Th **图中可以看到 /storage/archive 使用占比很高。 /storage/archive 目录通常用…

三明儿童自闭症寄宿制学校:关爱、教育、成长一站式服务

三明儿童自闭症寄宿制学校的启示&#xff1a;广州星贝育园——自闭症儿童的一站式成长乐园 在探讨自闭症儿童教育的道路上&#xff0c;寄宿制学校以其独特的优势&#xff0c;为孩子们提供了集关爱、教育、成长于一体的全方位服务。虽然文章开头提及了“三明儿童自闭症寄宿制学…

Leetcode面试经典150题-79.搜索单词

题目比较简单&#xff0c;回溯最基础的题&#xff0c;记得除非覆盖&#xff0c;否则一定要恢复现场就行 解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public boolean exist(char[][] board, String word) {int m board.length; int n board[0].length;i…

C++速通LeetCode简单第15题-有效的括号(全网最易懂代码注释)

解法分析&#xff1a; 越远的左括号匹配越远的右括号&#xff0c;越近的左括号匹配越近的右括号&#xff0c;正符合堆栈先进后出性质 。 因此利用堆栈保存左括号&#xff0c;通过循环逐个括号判断&#xff1a; class Solution { public:bool isValid(string s) {stack<…

Ubuntu20+Noetic+cartographer_ros编译部署

1 准备工作 &#xff08;1&#xff09;准备Ubuntu20系统。 &#xff08;2&#xff09;安装ROS系统,参考 https://blog.csdn.net/weixin_46123033/article/details/139527141&#xff08;3&#xff09;Cartographer相关软件包和源码下载&#xff1a; https://gitee.com/mrwan…

彻底理解浅拷贝和深拷贝

目录 浅拷贝实现 深拷贝实现自己手写 浅拷贝 浅拷贝是指创建一个新对象&#xff0c;这个对象具有原对象属性的精确副本 基本数据类型&#xff08;如字符串、数字等&#xff09;&#xff0c;在浅拷贝过程中它们是通过值传递的&#xff0c;而不是引用传递&#xff0c;修改值并不…

Java抽象类和接口的学习了解

目录 1. 抽象类 1.1 抽象类概念 1.2例子 1.3 抽象类语法 1.被 abstract 修饰的类--抽象类 2.抽象类中被 abstract 修饰的方法--抽象方法&#xff0c;该方法不用给出具体的实现体 3.当一个类中含有抽象方法时&#xff0c;该类必须要abstract修饰 4.抽象类也是类&#xff…

删除有序数组中的重复项(同向指针(快慢指针))

题目&#xff1a; 算法分析&#xff1a; 快慢指针从0出发若快慢指针不相同&#xff0c;快指针替换慢指针&#xff08;即慢指针后一位&#xff09;快指针每次都会增加题目求不重复的元素个数&#xff08;slow 为对应元素索引&#xff0c;故个数为slow1&#xff09; 算法图解…

算法练习题27——疫情下的电影院(模拟)

其实思路还好 就是输入有点难搞 Java import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String input scanner.nextLine();// 去掉输入字符串的方括号if (input.…

html+css+js网页设计 旅游 大理旅游7个页面

htmlcssjs网页设计 旅游 大理旅游7个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…

爬虫逆向学习(六):补环境过某数四代

声明&#xff1a;本篇文章内容是整理并分享在学习网上各位大佬的优秀知识后的实战与踩坑记录 引用博客&#xff1a; https://blog.csdn.net/shayuchaor/article/details/103629294 https://blog.csdn.net/qq_36291294/article/details/128600583 https://blog.csdn.net/weixin_…

浅谈Spring Cloud:认识微服务

SpringCloud就是分布式微服务架构的一站式解决方案&#xff0c;是微服务架构落地的多种技术的集合。 目录 微服务远程调用 Eureka注册中心 搭建Eureka Server 注册组件 服务拉取 当各种各样的服务越来越多&#xff0c;拆分的也越来越细&#xff0c;此时就会出现一个服务集…

【Vue】2

1 Vue 生命周期 Vue生命周期&#xff1a;一个 Vue 实例从 创建 到 销毁 的整个过程 创建(create)阶段&#xff1a;组件实例化时&#xff0c;初始化数据、事件、计算属性等挂载(mount)阶段&#xff1a;将模板渲染并挂载到 DOM 上更新(update)阶段&#xff1a;当数据发生变化时…

Python基础语法(3)上

函数 函数是什么 编程中的函数和数学中的函数有一定的相似之处. 数学上的函数&#xff0c;比如 y sin x&#xff0c;x 取不同的值&#xff0c;y 就会得到不同的结果 编程中的函数是一段可以被重复使用的代码片段 代码示例&#xff1a;求数列的和&#xff0c;不使用函数 …

【计算机网络 - 基础问题】每日 3 题(六)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

C++:STL详解(一)string类的基本介绍与使用方式

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;实践是检验真理的唯一标准&#xff01;&#xff01;&#xff01;敲代码需要勤快点&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff0…