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

news/2024/11/8 17:38:36
💓 博客主页:瑕疵的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.niftyadmin.cn/n/5744227.html

相关文章

Docker可视化管理面板DPanel的安装

本文软件由网友 rui 推荐; 什么是 DPanel ? DPanel 是一款 Docker 可视化管理面板,旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能,使用户能够更轻松地管理和部署 Docker 环境。 软件特点: 可视化管理&…

第一个纯血鸿蒙应用(Napi开发-ArtTS调用C/C++)

1.行业背景 纯血鸿蒙,即鸿蒙Next版已于2014年1月正式发版,鸿蒙生态设备数量已经突破10亿台,已经有超过15000个应用和元服务上架。鸿蒙生态不只是移动设备这么简单,他打造的是一个18n的全场景战略,真正做到了“万物互联…

k8s 上如何跑 Dolphins 模型

接着上一篇的介绍,这一篇就来跑跑 Dolphins 模型,本篇会记录,跑模型常见的阬点。 1 在 k8s 上创建 pod 将外部数据挂载在 pod 里,并申请 gpu 资源。同时修改代码里对应的引入数据的路径 # dolphins.yaml apiVersion: v1 kind: …

Webpack知识点—publicPath

文章目录 一、publicPath的定义和作用二、publicPath的配置方式三、publicPath的注意事项四、publicPath的常见问题和解决方法五、Vite 如何修改publicPathWebpack的publicPath是一个重要的配置项,它用于指定打包后生成的静态资源文件在浏览器中的访问路径。 一、publicPath的…

【计算机网络】章节 知识点总结

一、计算机网络概述 1. 计算机网络向用户提供的两个最重要的功能:连通性、共享 2. 因特网发展的三个阶段: 第一阶段:从单个网络 ARPANET 向互联网发展的过程。1983 年 TCP/IP 协议成为 ARPANET 上的标准协议。第二阶段:建成三级…

亚信安全新一代WAF:抵御勒索攻击的坚固防线

近年来,勒索攻击已成为黑客的主要攻击手段。新型勒索攻击事件层出不穷,勒索攻击形势愈发严峻,已经对全球制造、金融、能源、医疗、政府组织等关键领域造成严重危害。如今,勒索攻击手段日趋成熟、攻击目标愈发明确,模式…

针对曲率中的局部抖动进行平滑

在计算曲率的过程中,采用平滑函数确实能够有效降低数据的抖动现象。然而,若对整个数据集实施平滑处理,则可能会引发数据失真的问题。 为了最大程度地减少抖动并尽可能确保曲率计算的准确性,我们应当仅针对曲率中的局部抖动进行平…

「C/C++」C/C++ 之 变量作用域详解

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…