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

news2024/9/21 17:51:11

在这里插入图片描述

文章目录

  • 前言
  • 安装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'):
            break
    else:
        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'):
            break
    else:
        break

# 释放摄像头资源
video_capture.release()
cv2.destroyAllWindows()

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用docker配置wordpress

docker的安装 配置docker yum源 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo下载最新版本docker sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-…

基于spring拦截器实现博客项目的强制登录功能(四)

6. 强制登录 当⽤⼾访问 博客列表和博客详情⻚ 时, 如果⽤⼾当前尚未登陆, 就⾃动跳转到登陆⻚⾯. 我们可以采⽤拦截器来完成, token通常由前端放在header中, 我们从header中获取token, 并校验 token是否合法 6.1 添加拦截器 package com.example.spring_blog_24_9_8.config;…

k8s dashboard token 生成/获取

创建示例用户 在本指南中&#xff0c;我们将了解如何使用 Kubernetes 的服务帐户机制创建新用户、授予该用户管理员权限并使用与该用户绑定的承载令牌登录仪表板。 对于以下每个和的代码片段ServiceAccount&#xff0c;ClusterRoleBinding您都应该将它们复制到新的清单文件(如)…

Blazor开发框架Known-V2.0.10

Known今天迎来了2.0的第11个版本&#xff0c;同时网站网址和板块也进行了一次升级改造&#xff0c;虽不完美&#xff0c;但一直在努力改变&#xff0c;之前一直在完善框架功能&#xff0c;忽略了文档的重要性&#xff0c;所以这次更新了文档和API。交流互动板块也在进行当中&am…

PPT幻灯片的添加与编辑:全面技术指南

目录 一、PPT幻灯片的添加 1.1 启动PowerPoint与新建演示文稿 1.2 选择模板 1.3 添加新幻灯片 1.3.1 使用“开始”选项卡 1.3.2 使用快捷键 1.3.3 复制现有幻灯片 1.4 调整幻灯片顺序 二、PPT幻灯片的编辑 2.1 输入与编辑文本 2.1.1 使用文本框添加文本 2.1.2 使用占…

GitHub Star 数量前 13 的自托管项目清单

一个多月前&#xff0c;我们撰写并发布了这篇文章《终极自托管解决方案指南》。在那篇文章里我们深入探讨了云端服务与自托管方案的对比、自托管的潜在挑战、如何选择适合自托管解决方案&#xff0c;并深入介绍了五款涵盖不同场景的优秀自托管产品。 关于自托管的优势&#xf…

职业技能大赛背景下的移动互联网应用软件开发(Android)实训室建设方案

一、建设背景 随着科技的持续进步&#xff0c;移动设备已成为人们日常生活中不可或缺的一部分。据相关数据&#xff0c;移动互联网的使用率在近年来显著上升。在这样的背景下&#xff0c;移动互联技术不仅推动了科技的发展&#xff0c;也渗透到了智能家居、车联网、工业自动化…

大数据-129 - Flink CEP 详解 Complex Event Processing - 复杂事件处理

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

改进版field-sensitive指针分析算法

DEA 1.Introduction2.Approach2.1.Stride-based Field Representation2.1.1.示例12.1.2.示例2 2.2.完整算法 3.Evaluation3.1.Implementation3.2.结果 参考文献 1.Introduction 这篇paper是SVF团队对PKH field-sensitive指针分析算法 [ 2 ] ^{[2]} [2] 的优化&#xff0c;在使…

Pycharm中python文件导入torch模块时报错:No module named ‘torch‘

问题描述 导入torch时报错 上网查找后&#xff0c;发现原因可能是没有安装pytorch&#xff0c;但检查后发现自己已经安装了&#xff0c;遂考虑到可能是没有使用正确的环境 解决方法 因为是PyCharm 没有使用我所安装了 PyTorch 的 Conda 环境&#xff0c;所以报错了&#xf…

计算2的100次方

#include <stdio.h>int main() {int a[100] {0};a[0] 1;for(int i 0;i < 100;i)//乘100次2{for(int j 0; j < 100;j)//乘以每一位{a[j] * 2;//每一位都*2}for(int k 0;k < 99;k){if(a[k] > 10)//判断进位{a[k 1];a[k] - 10;}}}//找到第一个不为0的数&a…

vue part 9

动画与过渡 Test.vue <template><div><button click"isShow !isShow">显示/隐藏</button><transition name"hello" appear><h1 v-show"isShow">你好啊!</h1></transition><transition …

51单片机快速入门之点灯 STC 51单片机

第一步创建工程 第二步加载头文件 第三步编写代码 点灯完成 解释:主函数为main() 内部P1控制的是p1.0-p1.7 引脚 0为低电平

银河麒麟国产化系统(或者是Linux)一键安装docker和docker-compose

在国产化化机器上离线安装docker和docker-compose 第一步&#xff0c;查询国产化系统的cpu架构 使用如下命令都可以查询出来&#xff1a; # 查询全部 uname -a # 只查询部分 uname -p # 查了cpu 列表 lscpu 查询示例如下&#xff1a; 为麒麟桌面版 为麒麟服务版 第二步&a…

人工智能领域各方向顶级会议和期刊

会议 人工智能基础与综合&#xff1a;AAAI、CICAI (!)、UAI、IJCAI 机器学习&#xff1a;COLT、ICLR、ICML、NeurIPS 模式识别与计算机视觉&#xff1a;ECCV、CVPR、ICCV 语言与语音处理&#xff1a;ACL、EMNLP 知识工程与数据挖掘&#xff1a;SIGKDD、SIGMOD、ICDE、SIGIR、V…

golang-基础知识(array, slice, map)

1. array array就是数组&#xff0c;我们可以通过如下方式定义一个数组并对数组中的元素进行赋值 var arr [n]type // 定义一个大小为n&#xff0c;类型为type的数组 arr[0] xx // 对数组中的元素进行赋值 其中[n]type中&#xff0c;n表示数组的长度&#xff0c;type表示数…

【数字】xilinx的AXI VIP如何使用的guide

AXI 验证 IP (VIP)AXI Stream VIP 可用于为支持定制 RTL 设计流程的 AXI 主设备及 AXI 从设备验证连接和基本功能性。此外&#xff0c;它还支持贯通模式&#xff0c;该模式明显有助于用户监控事务处理信息&#xff0f;吞吐量或驱动有源激励。AXI VIP 提供的实例测试台和测试可演…

SolidWorks 质量属性和截面属性

系列文章目录 前言 SOLIDWORKS 应用程序根据模型几何体和材料属性计算质量、密度、体积等属性。 您可覆盖某些属性的计算值。 您可查看以下质量属性&#xff1a; 零件多实体零件中的实体装配体装配体中的零部件 在零件或装配体中&#xff0c;您可查看面和草图的区域属性。 您可…

【HarmonyOS NEXT】实现网络图片保存到手机相册

【问题描述】 给定一个网络图片的地址&#xff0c;实现将图片保存到手机相册 【API】 phAccessHelper.showAssetsCreationDialog【官方文档】 https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-photoaccesshelper-V5#showassetscreationdialog…

【FastAPI】离线使用Swagger UI 或 国内网络如何快速加载Swagger UI

在FastAPI中&#xff0c;默认情况下&#xff0c;当应用启动时&#xff0c;Swagger UI 会通过在线加载 Swagger UI 的静态资源。这意味着如果应用运行在没有互联网连接的环境中&#xff0c;默认的 Swagger 文档页面将无法加载。 为了在离线环境中使用 Swagger UI&#xff0c;你…