计算机视觉基础:OpenCV库详解

news2024/11/14 2:56:37
💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

计算机视觉基础:OpenCV库详解

计算机视觉基础:OpenCV库详解

  • 计算机视觉基础:OpenCV库详解
    • 引言
    • OpenCV 概述
      • 什么是 OpenCV
      • OpenCV 的应用场景
    • 安装和配置 OpenCV
      • 安装 OpenCV
      • 验证安装
    • OpenCV 基础
      • 读取和显示图像
      • 图像的基本操作
        • 获取图像属性
        • 图像裁剪和复制
      • 图像处理
        • 灰度化
        • 高斯模糊
        • 边缘检测
      • 视频处理
        • 读取和显示视频
        • 视频录制
    • OpenCV 高级功能
      • 物体检测
        • Haar 级联分类器
      • 特征点检测
        • SIFT 和 SURF
      • 图像分割
        • GrabCut
    • 实战案例分析
      • 人脸识别
      • 物体跟踪
    • 总结
    • 参考资料

引言

计算机视觉是人工智能的一个重要分支,旨在使计算机能够理解和解释图像和视频内容。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉功能。本文将详细介绍 OpenCV 的基本概念、安装配置、核心功能以及实际应用,帮助读者快速上手计算机视觉开发。

OpenCV 概述

什么是 OpenCV

OpenCV 是一个开源的计算机视觉库,支持多种编程语言(如 C++、Python、Java 等),并在多个平台上可用(如 Windows、Linux、macOS)。OpenCV 提供了大量的图像处理和计算机视觉算法,广泛应用于图像识别、物体检测、人脸识别等领域。

OpenCV 的应用场景

  • 图像处理:如图像增强、滤波、边缘检测等。
  • 物体检测:如行人检测、车辆检测等。
  • 人脸识别:如人脸检测、人脸识别等。
  • 视频分析:如运动检测、背景减除等。

安装和配置 OpenCV

安装 OpenCV

OpenCV 可以通过 pip 工具轻松安装。

pip install opencv-python

验证安装

安装完成后,可以通过以下代码验证 OpenCV 是否安装成功:

import cv2
print(cv2.__version__)

OpenCV 基础

读取和显示图像

OpenCV 提供了读取和显示图像的基本功能。

import cv2

# 读取图像
image = cv2.imread('image.jpg')

# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像的基本操作

获取图像属性
  • 形状:获取图像的高度、宽度和通道数。
  • 像素值:获取和设置特定像素的值。
# 获取图像的形状
height, width, channels = image.shape
print(f'Height: {height}, Width: {width}, Channels: {channels}')

# 获取特定像素的值
pixel_value = image[100, 100]
print(f'Pixel Value at (100, 100): {pixel_value}')

# 设置特定像素的值
image[100, 100] = [0, 255, 0]  # 设置为绿色
图像裁剪和复制
  • 裁剪:提取图像的一部分。
  • 复制:创建图像的副本。
# 裁剪图像
cropped_image = image[50:150, 50:150]

# 复制图像
copied_image = image.copy()

图像处理

灰度化

将彩色图像转换为灰度图像。

# 转换为灰度图像
grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 显示灰度图像
cv2.imshow('Grey Image', grey_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
高斯模糊

对图像进行高斯模糊处理。

# 高斯模糊
blurred_image = cv2.GaussianBlur(image, (5, 5), 0)

# 显示模糊图像
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()

视频处理

读取和显示视频

OpenCV 可以读取和显示视频文件。

import cv2

# 读取视频
cap = cv2.VideoCapture('video.mp4')

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 显示帧
    cv2.imshow('Frame', frame)

    # 按 q 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()
视频录制

OpenCV 可以录制视频。

import cv2

# 初始化视频捕获
cap = cv2.VideoCapture(0)

# 定义编码器和输出文件
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 写入帧
    out.write(frame)

    # 显示帧
    cv2.imshow('Frame', frame)

    # 按 q 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()

OpenCV 高级功能

物体检测

Haar 级联分类器

Haar 级联分类器是一种常用的物体检测方法,可以用于检测人脸、眼睛等。

import cv2

# 加载 Haar 级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 读取图像
image = cv2.imread('image.jpg')

# 转换为灰度图像
grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 检测人脸
faces = face_cascade.detectMultiScale(grey_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# 绘制矩形框
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)

# 显示图像
cv2.imshow('Face Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

特征点检测

SIFT 和 SURF

SIFT(Scale-Invariant Feature Transform)和 SURF(Speeded-Up Robust Features)是常用的特征点检测算法。

import cv2

# 读取图像
image = cv2.imread('image.jpg')

# 初始化 SIFT 检测器
sift = cv2.xfeatures2d.SIFT_create()

# 检测特征点
keypoints, descriptors = sift.detectAndCompute(image, None)

# 绘制特征点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None)

# 显示图像
cv2.imshow('SIFT Keypoints', image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像分割

GrabCut

GrabCut 是一种基于图割的图像分割算法,用于从背景中分离前景。

import cv2

# 读取图像
image = cv2.imread('image.jpg')

# 初始化掩码
mask = np.zeros(image.shape[:2], np.uint8)

# 定义前景和背景的初始矩形
rect = (50, 50, 300, 300)

# 初始化前景和背景模型
bgd_model = np.zeros((1, 65), np.float64)
fgd_model = np.zeros((1, 65), np.float64)

# 运行 GrabCut 算法
cv2.grabCut(image, mask, rect, bgd_model, fgd_model, 5, cv2.GC_INIT_WITH_RECT)

# 将掩码转换为二值图像
mask2 = np.where((mask==2)|(mask==0), 0, 1).astype('uint8')

# 应用掩码
segmented_image = image * mask2[:, :, np.newaxis]

# 显示分割后的图像
cv2.imshow('Segmented Image', segmented_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

实战案例分析

人脸识别

假设我们有一个包含人脸的照片,需要进行人脸识别。

import cv2

# 加载 Haar 级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 读取图像
image = cv2.imread('people.jpg')

# 转换为灰度图像
grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 检测人脸
faces = face_cascade.detectMultiScale(grey_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# 绘制矩形框
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)

# 保存结果
cv2.imwrite('detected_faces.jpg', image)

物体跟踪

假设我们有一个视频,需要跟踪视频中的移动物体。

import cv2

# 初始化视频捕获
cap = cv2.VideoCapture('video.mp4')

# 初始化背景减除器
fgbg = cv2.createBackgroundSubtractorMOG2()

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 应用背景减除器
    fgmask = fgbg.apply(frame)

    # 显示帧
    cv2.imshow('Frame', frame)
    cv2.imshow('FG Mask', fgmask)

    # 按 q 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

总结

通过本文,我们深入了解了 OpenCV 的基本概念、安装配置、核心功能以及实际应用。OpenCV 是一个强大的计算机视觉库,提供了丰富的图像处理和计算机视觉功能。希望本文能帮助读者更好地理解和应用 OpenCV,提升计算机视觉开发能力。

参考资料

  • OpenCV 官方文档
  • 计算机视觉入门教程
  • OpenCV 实战案例

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

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

相关文章

Go语言的内置容器

文章目录 一、数组数组的定义数组声明数组特点数组元素修改 二、切片切片声明基于数组创建切片使用make()函数构造切片使用append()为切片动态添加元素\使用copy()复制新的切片数组与切片相互转换 三、Map映射Map定义使用make()函数创建map用切片作为map的值使用delete()函数删…

二叉树的各种操作补充

二叉树的各种操作补充 求二叉树的结点数求二叉树的叶结点数求二叉树的高度求二叉树的第k层结点数查找指定结点层序遍历判断二叉树是否是完全二叉树 我们任然沿用二叉树的基本信息: typedef char BTDataType; typedef struct BinaryTreeNode {BTDataType _data;struc…

Go语言的常用内置函数

文章目录 一、Strings包字符串处理包定义Strings包的基本用法Strconv包中常用函数 二、Time包三、Math包math包概述使用math包 四、随机数包(rand) 一、Strings包 字符串处理包定义 Strings包简介: 一般编程语言包含的字符串处理库功能区别…

Perfetto中如何使用SQL语句

在使用 Perfetto 分析 Android 性能时,可以通过 Perfetto 提供的内置 SQL 查询来提取和分析不同的性能数据。Perfetto 允许你在 UI 界面或命令行中运行 SQL 查询,提取出 Trace 数据中包含的各种性能信息,比如 CPU 使用率、线程状态、内存分配…

QML项目实战:自定义TextField

目录 一.添加模块 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.4 import QtGraphicalEffects 1.15 二.自定义TextField 1.属性设置 2.输入框设置 3.按钮开关 三.效果 1.readonly为false 2.readonly为true 四.代码 一.添加模块 import QtQuick.…

【进阶】Stable Diffusion 插件 Controlnet 安装使用教程(图像精准控制)

Stable Diffusion WebUI 的绘画插件 Controlnet 最近更新了 V1.1 版本,发布了 14 个优化模型,并新增了多个预处理器,让它的功能比之前更加好用了,最近几天又连续更新了 3 个新 Reference 预处理器,可以直接根据图像生产…

DAF-FM DA与NO反应后,生成的产物能够发出强烈的绿色荧光,254109-22-3

一、基本信息 产品名称:DAF-FM DA(一氧化氮NO荧光探针DAF-FM) 英文名称:DAF-FM DA,DAF-FM diacetate CAS号:254109-22-3 分子式:C25H18F2N2O7 供应商:陕西新研博美生物科技 分…

在 Mac 和 Windows 系统中快速部署 OceanBase

OceanBase 是一款分布式数据库,具备出色的性能和高扩展性,可以为企业用户构建稳定可靠、灵活扩展性能的数据库服务。本文以开发者们普遍熟悉的Windows 或 Mac 环境为例,介绍如何快速上手并体验OceanBase。 一、环境准备 1. 硬件准备 OceanB…

使用Ant Design的Layout布局不能撑满整个屏幕问题解决方法

代码示例: import React, { useState } from react import {LaptopOutlined,NotificationOutlined,UserOutlined, } from ant-design/icons import type { MenuProps } from antd import { Layout, Menu, theme } from antd import routes from ./routes/index imp…

【ubuntu18.04】使用U盘制作ubuntu18.04启动盘操作说明

打开show application 打开Startup Disk 选择镜像 双击选择ubuntu的iso镜像 镜像下载地址 Ubuntu 18.04.6 LTS (Bionic Beaver) 制作镜像 注意: 制作镜像会格式化U盘,记得备份资料 点击Make Startup Disk,弹出如下对话框 点击Yes 输入管理员密码&a…

22.04Ubuntu---ROS2创建python节点

创建工作空间 mkdir -p 02_ros_ws/src 然后cd到该目录 创建功能包 在这条命令里,tom就是你的功能包 ros2 pkg create tom --build-type ament_python --dependencies rclpy 可以看到tom功能包已经被创建成功了。 使用tree命令,得到如下文件结构 此时…

《手写Spring渐进式源码实践》实践笔记(第十七章 数据类型转换)

文章目录 第十七章 数据类型转换工厂设计实现背景技术背景Spring数据转换实现方式类型转换器(Converter)接口设计实现 业务背景 目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件转换器工厂Bean测试用例测试结果: 总结 第十七章 数…

使用docker形式部署jumpserver

文章目录 前言一、背景二、使用步骤1.基础环境准备2.拉取镜像3.进行部署4.备份记录启动命令 前言 记录一下使用docker形式部署jumpserver服务的 一、背景 搭建一个jumpserver的堡垒机,但是发现之前是二进制文件部署的,会在物理机上部署污染环境&#x…

(62)使用RLS自适应滤波器进行系统辨识的MATLAB仿真

文章目录 前言一、基本概念二、RLS算法原理三、RLS算法的典型应用场景四、MATLAB仿真代码五、仿真结果1.滤波器的输入信号、参考信号、输出信号、误差信号2.对未知系统进行辨识得到的系数 总结与后续 前言 RLS(递归最小二乘)自适应滤波器是一种用于系统…

算法每日双题精讲——滑动窗口(长度最小的子数组,无重复字符的最长子串)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!💪…

MySQL数据库的备份与还原

目录 mysql 数据库的备份 生成SQL脚本 1 在控制台使用mysqldump命令可以用来生成指定数据库的脚本 ​编辑2 在数据库图形化界面工具:DateGrip 中操作:导出 mysql 数据库的还原 执行SQL脚本 1 在控制台使用 命令,指定将sql脚本导入到指定…

使用 IDEA 创建 Java 项目(二)

IDEA 创建 Java 项目 一般创建 Java 项目可以创建一个空项目,然后在空项目中添加模块,在模块中编写包,包中包含 Java 类。 如果你的 JDK 没有被 IDEA 自动找到的话,可以手动选择 JDK。我们先来学习 Intellij 构建系统下的 Java …

图论算法:最短路径算法详解【c语言版】(无权最短路径、Dijkstra算法)

别忘了请点个赞收藏关注支持一下博主喵!!! 图论算法:最短路径算法详解 在图论中,最短路径问题是寻找图中两点之间具有最小总权重的路径。这个问题在许多实际应用中都有重要的作用,比如网络路由、城市交通规…

vue通过iframe方式嵌套grafana图表

文章目录 前言一、iframe方式实现xxx.xxx.com拒绝连接登录不跳转Cookie 的SameSite问题解决不显示额外区域(kiosk1) 前言 我们的前端是vue实现的,监控图表是在grafana中的,需要在项目web页面直接显示grafana图表 一、iframe方式实现 xxx.xxx.com拒绝连…

苹果系统安装Homebrew时CLT缺失的问题

前言 为了使用brew命令,必须安装Homebrew工具。但是在Howebrew安装的时候,会出现CLT(Command Line Tools)缺失的问题。本博客就是讨论如何来解决这个问题的。 1、问题的出现 2、解决途径 在命令行终端中输入命令:xcod…