Python 课程16-OpenCV

news2024/9/21 14:45:55

前言

OpenCV(Open Source Computer Vision Library)是一个广泛使用的开源计算机视觉库,旨在为实时图像处理提供高效的计算工具。它提供了数百种算法和函数,用于处理图像和视频。OpenCV 在工业、学术研究和个人项目中应用广泛,适用于各种任务,如对象检测、图像增强、计算机视觉中的机器学习等。

在本教程中,我们将详细介绍 OpenCV 的常用功能,包括图像处理、视频处理以及如何结合其他机器学习框架(如 TensorFlow 和 PyTorch)进行应用。


目录

  1. OpenCV 基础

    • 安装 OpenCV
    • 读取与显示图像
    • 保存图像与视频
    • 调整图像尺寸与裁剪
  2. 图像处理

    • 图像颜色空间转换
    • 图像平滑与滤波
    • 边缘检测与轮廓检测
    • 图像几何变换
  3. 对象检测与跟踪

    • 使用 Haar 级联分类器进行人脸检测
    • 使用深度学习模型进行对象检测
    • 视频跟踪与运动检测
  4. 高级功能

    • OpenCV 与机器学习(TensorFlow、PyTorch)
    • 使用 OpenCV 进行相机校准与立体视觉
    • 图像分割与图像形态学操作

1. OpenCV 基础

安装 OpenCV

你可以使用 pip 安装 OpenCV:

pip install opencv-python

 安装带有 contrib 模块 的 OpenCV:

pip install opencv-contrib-python

导入 OpenCV:

import cv2
读取与显示图像

OpenCV 提供了简单的函数来读取和显示图像:

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

# 打印图像的形状(高度、宽度、通道)
print(image.shape)
  •  显示图像
# 显示图像
cv2.imshow('Image', image)

# 等待按键输入,然后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
保存图像与视频
  • 保存图像
# 保存图像
cv2.imwrite('output.jpg', image)
  •  保存视频
# 定义视频编解码器并创建 VideoWriter 对象
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

# 写入视频帧
out.write(image)  # 假设 image 是一个视频帧
out.release()  # 释放 VideoWriter
调整图像尺寸与裁剪
  • 调整图像尺寸
# 调整图像大小为 300x300
resized_image = cv2.resize(image, (300, 300))
  •  裁剪图像
# 裁剪图像的区域
cropped_image = image[50:200, 100:300]  # 从 (50, 100) 到 (200, 300) 的区域


2. 图像处理

图像颜色空间转换

OpenCV 支持多种颜色空间,如 BGR、RGB、HSV、灰度等。你可以轻松转换图像的颜色空间:

  • BGR 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  •  BGR 转换为 HSV
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

边缘检测与轮廓检测

OpenCV 提供了 Canny 边缘检测轮廓检测 来识别图像中的对象轮廓。

  • Canny 边缘检测
edges = cv2.Canny(image, 100, 200)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
  •  查找轮廓
# 转换为灰度图像并进行二值化
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)

# 查找轮廓
contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)
cv2.imshow('Contours', image)
cv2.waitKey(0)

图像几何变换

你可以对图像进行几何变换,如旋转、平移、缩放等。

  • 图像旋转
(h, w) = image.shape[:2]
center = (w // 2, h // 2)

# 旋转图像 45 度
matrix = cv2.getRotationMatrix2D(center, 45, 1.0)
rotated_image = cv2.warpAffine(image, matrix, (w, h))
  •  图像平移
# 定义平移矩阵,将图像向右移动 50 像素,向下移动 100 像素
M = np.float32([[1, 0, 50], [0, 1, 100]])
shifted_image = cv2.warpAffine(image, M, (w, h))


3. 对象检测与跟踪

使用 Haar 级联分类器进行人脸检测

OpenCV 提供了 Haar 级联分类器,适用于快速检测人脸或其他对象。

  • 加载预训练的 Haar 分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

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

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

# 绘制检测到的人脸
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)

cv2.imshow('Faces', image)
cv2.waitKey(0)

使用深度学习模型进行对象检测

OpenCV 支持加载深度学习模型进行对象检测,如 YOLOSSD 等。

  • 加载 YOLO 模型
# 加载 YOLO 模型的配置和权重
net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')

# 加载对象类别名称
with open('coco.names', 'r') as f:
    classes = f.read().splitlines()

# 读取输入图像并进行预处理
blob = cv2.dnn.blobFromImage(image, 1/255.0, (416, 416), swapRB=True, crop=False)
net.setInput(blob)

# 获取 YOLO 输出
layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]
detections = net.forward(output_layers)

# 解析并显示检测结果
for detection in detections:
    for obj in detection:
        confidence = obj[4]
        if confidence > 0.5:
            # 显示检测到的对象
            print("Detected object with confidence:", confidence)

视频跟踪与运动检测

OpenCV 提供了多种视频跟踪算法,如 CSRTKCF,并可以检测运动。

  • 使用 CSRT 进行视频跟踪
tracker = cv2.TrackerCSRT_create()

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

# 选择目标
ret, frame = cap.read()
bbox = cv2.selectROI('Tracking', frame, fromCenter=False)
tracker.init(frame, bbox)

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

    # 更新跟踪器
       success, bbox = tracker.update(frame)

    # 如果跟踪成功,绘制边界框
    if success:
        x, y, w, h = map(int, bbox)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        cv2.putText(frame, 'Tracking', (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    else:
        cv2.putText(frame, 'Lost', (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    # 显示视频帧
    cv2.imshow('Tracking', frame)

    # 退出条件:按下 "q" 键
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

  •  运动检测(背景减法)

背景减法 是运动检测中常用的技术。OpenCV 提供了 cv2.createBackgroundSubtractorMOG2()cv2.createBackgroundSubtractorKNN() 两种方法来检测运动区域。 

# 创建背景减法器
bg_subtractor = cv2.createBackgroundSubtractorMOG2()

# 打开视频流
cap = cv2.VideoCapture('video.mp4')

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

    # 应用背景减法
    fg_mask = bg_subtractor.apply(frame)

    # 显示前景掩膜
    cv2.imshow('Foreground Mask', fg_mask)

    # 退出条件:按下 "q" 键
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

通过背景减法器,我们可以检测视频中的运动物体,适合用于安防监控或物体跟踪等任务。


4. 高级功能

OpenCV 与机器学习(TensorFlow、PyTorch)

OpenCV 可以与深度学习框架如 TensorFlowPyTorch 结合使用,实现计算机视觉中的高级任务。你可以使用这些框架来构建深度学习模型,然后使用 OpenCV 进行推理和处理图像。

  • 使用 TensorFlow 进行图像分类

假设我们已经训练了一个图像分类模型,可以通过 TensorFlow 加载该模型,并使用 OpenCV 处理输入图像。

import tensorflow as tf
import cv2

# 加载 TensorFlow 模型
model = tf.keras.models.load_model('my_model.h5')

# 读取并预处理图像
image = cv2.imread('image.jpg')
resized_image = cv2.resize(image, (224, 224))  # 假设模型输入尺寸为 224x224
input_image = resized_image / 255.0  # 归一化处理
input_image = input_image.reshape(1, 224, 224, 3)  # 增加批次维度

# 进行预测
predictions = model.predict(input_image)
print('Predictions:', predictions)
  • 使用 PyTorch 进行对象检测

你也可以使用 PyTorch 构建深度学习模型,并将 OpenCV 作为图像预处理和后处理工具。

import torch
import torchvision.transforms as transforms
from PIL import Image

# 加载 PyTorch 模型
model = torch.load('my_model.pth')
model.eval()

# 使用 OpenCV 读取图像并转换为 PIL 图像
image = cv2.imread('image.jpg')
image_pil = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

# 定义图像转换
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 应用转换
input_tensor = transform(image_pil).unsqueeze(0)  # 增加批次维度

# 进行预测
with torch.no_grad():
    predictions = model(input_tensor)
    print('Predictions:', predictions)

使用 OpenCV 进行相机校准与立体视觉

相机校准 是计算机视觉中的一个常见任务,目的是校正相机的光学失真。OpenCV 提供了方便的工具来实现相机校准。

  • 相机校准

假设你有一组棋盘图像,可以通过这些图像进行相机校准。

import numpy as np
import cv2

# 设置棋盘角点的尺寸
chessboard_size = (9, 6)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

# 准备世界坐标系的棋盘点
objp = np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)

# 用于存储对象点和图像点
objpoints = []  # 3D 点
imgpoints = []  # 2D 点

# 读取棋盘图像
images = ['chessboard1.jpg', 'chessboard2.jpg']  # 替换为实际图像路径

for image_path in images:
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 查找棋盘角点
    ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)

    if ret:
        objpoints.append(objp)

        # 提高角点的准确性
        corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        imgpoints.append(corners2)

        # 显示角点
        cv2.drawChessboardCorners(img, chessboard_size, corners2, ret)
        cv2.imshow('Chessboard Corners', img)
        cv2.waitKey(500)

# 进行相机校准
ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
print('Camera Matrix:', camera_matrix)
print('Distortion Coefficients:', dist_coeffs)

cv2.destroyAllWindows()

通过相机校准,你可以获得相机的内参(如焦距、主点位置)和畸变系数,从而校正拍摄的图像。

  • 立体视觉与深度图

你还可以使用 OpenCV 实现立体视觉,通过两台相机捕捉的图像计算深度信息。

# 假设你已经捕获了左图和右图
imgL = cv2.imread('left_image.jpg', 0)
imgR = cv2.imread('right_image.jpg', 0)

# 创建 SGBM 立体匹配对象
stereo = cv2.StereoSGBM_create(minDisparity=0, numDisparities=16, blockSize=15)

# 计算视差图
disparity = stereo.compute(imgL, imgR)

# 显示视差图
cv2.imshow('Disparity', disparity)
cv2.waitKey(0)
cv2.destroyAllWindows()

视差图可以反映图像中各个像素的深度信息,常用于 3D 建模和场景重建。

图像分割与图像形态学操作

图像分割 是将图像划分为不同区域或对象的过程。图像形态学操作 可以用于提取对象的形状特征。

  • 分水岭算法进行图像分割
# 转换为灰度图并进行二值化
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# 应用形态学操作
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=2)

# 确定背景区域
sure_bg = cv2.dilate(opening, kernel, iterations=3)

# 寻找前景区域
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
ret, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)

# 确定未知区域
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)

# 标记连接的组件
ret, markers = cv2.connectedComponents(sure_fg)

# 增加1,确保背景为 1,前景为其他值
markers = markers + 1

# 将未知区域标记为 0
markers[unknown == 255] = 0

# 应用分水岭算法
markers = cv2.watershed(image, markers)

# 将边界标记为红色
image[markers == -1] = [0, 0, 255]

cv2.imshow('Watershed Segmentation', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

结论

通过本详细的 OpenCV 教程,你已经学习了从基本的图像与视频处理到高级的对象检测、分割和形态学操作。你掌握了如何读取、保存和显示图像,并通过颜色空间转换、滤波、边缘检测等图像处理技术对图像进行分析。同时,我们还讨论了如何利用 OpenCV 进行对象跟踪和运动检测,以及如何结合 TensorFlowPyTorch 等深度学习框架进行高级计算机视觉任务。

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

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

相关文章

鸿蒙开发之ArkUI 界面篇 十二 背景属性

backgroundColor背景色(纯颜色,没法实现立体感之类高级效果)、 backgroundImage背景图(一般是设计师设计好的图)、 backgroundImageSize背景图尺寸(用于调整背景图的尺寸)、 backgroundImagePosition背景图位置(用于调整背景图的位置)。 背景图的添加是属性backgrou…

在家找不到手机?除了语音助手,还可以用远程控制!

总说手机有定位功能,但手机定位一般只能用于室外较大范围,例如在某个街角交叉位置、某个公园位置,某幢楼的某层位置。如果是在室内,例如自己家,手机定位就显得没那么好用了。 在家里怎么找突然“失踪”的手机&#xff…

Android RecycleView 深度解析与面试题梳理

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 引言 在 Android 开发中,列表和网格布局是非常常见的界面元素,它们用于展示大量数据集合。RecyclerView 是 Android 提…

Leetcode 470. 用 Rand7() 实现 Rand10()

Leetcode 470. 用 Rand7() 实现 Rand10() 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。 不要使用系统的 Math.random() 方法。 示例 1: 输入: 1 输出: [7] 示例 2: 输入: 2 输出: [8,4] 示例 3…

OTA升级

方式1: 方式2: 服务器与mcu通讯机制

LeetCode[简单] 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 思路:类似与二分查找 唯一需要注意的是,搜索…

vulnhub靶机:Fristileaks 详细过程

下载 下载地址:https://www.vulnhub.com/entry/fristileaks-13,133/ 修改网卡 网卡设置为nat模式,并修改mac地址为 08:00:27:A5:A6:76 信息收集 主机发现 arp-scan -l 发现靶机 IP 是 192.168.109.178 端口扫描 nmap -p- -A 192.168.109.178 目录…

AI基础 L27 Introduction to Automated Planning - III

Complexity Analysis • Complexity analyses are done on decision problems or language-recognition problems — Problems that have yes-or-no answers • A language is a set L of strings over some alphabet A — Recognition procedure for L ◦ A procedure R(x) th…

情感识别系统源码分享

情感识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

人工智能开发实战常用分类算法归纳与解析

内容导读 决策树贝叶斯分类器最近邻分类器支持向量机神经网络 一、决策树 决策树(Decision Tree)是用于决策的一棵树,从根节点出发,通过决策节点对样本的不同特征属性进行划分,按照结果进入不同的分支,最终达到某一叶子节点&am…

基于yolov8的肉鸡健康状态检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的肉鸡健康状态检测系统是一个先进的目标检测应用,旨在通过图像分析实现对肉鸡健康状态的快速、准确评估。该系统利用了YOLOv8模型的尖端技术,该模型由Ultralytics公司开发,具有卓越的检测精度和速度。 YOLOv8模型采…

新书出版,大陆首本NestJS图书《NestJS全栈开发解析:快速上手与实践》

新书全栈实战项目:数字门店管理平台开源啦🎉🎉🎉 GitHub地址(持续更新NestJS企业级实践):欢迎star⭐️⭐️⭐️ 前端ReactTypeScriptVite 后端NestMySQLRedisDocker 前言 对,你没看…

教程 | ArcGIS Pro如何自动保存数据编辑内容

目录 1、工程自动保存 2、数据编辑自动保存 世界上最痛苦的事情就是: 软件崩溃,我没保存!!! 电脑死机,我没保存!!! 突然断电,我没保存!&…

星云股份战略运营副总裁袁智勇︱如何培养“能打胜仗”的项目经理

全国项目经理专业人士年度盛会 福建星云电子股份有限公司总裁办战略运营副总裁袁智勇先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾,演讲议题为“如何培养“能打胜仗”的项目经理”。大会将于10月26-27日在北京举办&…

MUNIK谈ASPICE系列专题分享(十)ASPICE配置管理如何做

前言: ASPICE(Automotive Software Process Improvement and Capability dEtermination)是一种用于评估汽车行业软件开发过程成熟度的模型。配置管理是ASPICE中的一个关键过程领域(KPA),它涉及到对软件项目…

C++list的使用:尾插、头插、insert、erase、reverse、sort等的介绍

文章目录 前言一、尾插、头插、insert、erase二、reverse、sort总结 前言 Clist的使用&#xff1a;尾插、头插、insert、erase、reverse、sort等的介绍 一、尾插、头插、insert、erase #include <iostream> #include <list>using namespace std;void test_list1(…

下拉框QComboBox

文本 // 获取和设置当前条目的索引 int currentIndex() const void setCurrentIndex(int index)// 获取和设置当前条目的文本 QString currentText() const void setCurrentText(const QString &text)// 获取和设置指定索引条目的文本 QString itemText(int index) co…

老友记台词 第二季 第一集 Friends 201(全英版)

文章目录 201 The One With Ross New Girlfriend[Scene: Central Perk, Phoebe is recapping last season, and as she talks we see a montague of scenes from Ross and Rachel.][Scene: The Airport, continued from last season, Rachel is waiting for Ross to come of th…

【PLW004】基于Python网络爬虫与推荐算法的新闻推荐平台v1.0(Python+Django+NLP+Vue+MySQL前后端分离)

基于Python网络爬虫与推荐算法的新闻推荐平台。 网络爬虫&#xff1a;通过Python实现新浪新闻的爬取&#xff0c;可爬取新闻页面上的标题、文本、图片、视频链接&#xff08;保留排版&#xff09; 推荐算法&#xff1a;权重衰减标签推荐区域推荐热点推荐融合推荐算法。 文章目录…

计算机毕业设计 二手图书交易系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…