首页 > 其他分享 >OpenCV 与 Matplotlib 的结合使用:轮毂检测与目标跟踪

OpenCV 与 Matplotlib 的结合使用:轮毂检测与目标跟踪

时间:2024-09-10 18:20:35浏览次数:3  
标签:plt 轮毂 cv2 Matplotlib OpenCV 灰度 图像 轮廓 image

目录

绘制轮廓图像

实现思路

1. 读取图像并转换为灰度图像

2. 二值化处理

3. 查找轮廓

4. 绘制轮廓

5. 显示结果

代码实现

效果展示

动态逐步显示轮廓结果

实现思路

1. 读取图像并缩放

2. 转换为灰度图像

3. 二值化处理

4. 查找轮廓

5. 动态显示轮廓

6. 显示最终结果并关闭窗口

7. 使用 Matplotlib 显示最终图像

代码实现

效果展示

物体跟踪

实现思路

整体代码

效果展示


绘制轮廓图像

实现思路

使用 OpenCV 检测图像中的轮廓并在图像上绘制轮廓,最后通过 Matplotlib 来显示处理结果。以下是代码的具体实现思路:

1. 读取图像并转换为灰度图像


image = cv2.imread('./imgs/006.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

  • 首先,通过 cv2.imread() 读取指定路径下的图片文件,并将其存储在 image 变量中。image 是一个彩色图像,使用 BGR 颜色格式。
  • 为了简化后续的轮廓检测处理,将彩色图像转换为灰度图像,使用 cv2.cvtColor() 函数进行 BGR 到灰度的颜色空间转换。gray 变量存储灰度图像数据,灰度图像的每个像素点只有亮度信息,去除了颜色信息。

2. 二值化处理


ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

  • 使用 cv2.threshold() 对灰度图像进行二值化处理。二值化的原理是将图像中的像素值按照阈值进行划分,大于 127 的像素值被设置为 255(白色),小于或等于 127 的像素值被设置为 0(黑色),生成一个只有黑白两色的图像 thresh
  • 这种处理方式非常适合用于轮廓检测,因为轮廓可以在二值化的图像中更加清晰地表现出来。

3. 查找轮廓


contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

  • 在二值化图像 thresh 上查找轮廓,使用 cv2.findContours() 函数。该函数返回两个值:
    • contours:一个包含所有轮廓信息的列表。每个轮廓由一组点的坐标构成。
    • hierarchy:轮廓之间的层次结构信息。
  • cv2.RETR_EXTERNAL 参数指定只提取外部轮廓(不处理嵌套轮廓),而 cv2.CHAIN_APPROX_SIMPLE 参数则简化了轮廓的表示,去除了冗余点。

4. 绘制轮廓


cv2.drawContours(image, contours, -1, (0, 255, 0), 3)

  • 使用 cv2.drawContours() 在原始图像 image 上绘制所有检测到的轮廓。函数的参数解释如下:
    • image:要在其上绘制轮廓的图像。
    • contours:包含轮廓数据的列表。
    • -1:表示绘制所有轮廓。如果指定特定的索引,则只绘制该特定轮廓。
    • (0, 255, 0):指定轮廓的颜色为绿色(BGR 格式中的绿色)。
    • 3:指定轮廓线的粗细为 3 像素。

5. 显示结果


plt.figure(figsize=(10, 5))
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Detected Contours')
plt.axis('off')
plt.show()

  • 使用 Matplotlib 来显示处理后的图像。由于 OpenCV 使用 BGR 颜色格式,而 Matplotlib 使用 RGB 格式,因此需要用 cv2.cvtColor() 函数将图像颜色从 BGR 转换为 RGB。
  • plt.imshow() 用于显示转换后的图像,并通过 plt.axis('off') 隐藏坐标轴。
  • 最后通过 plt.show() 函数展示出图像,图像上会标注出绿色的轮廓。

代码实现

import cv2
import matplotlib.pyplot as plt

# 读取图像并转换为灰度
image = cv2.imread('./imgs/006.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)

# 显示结果
plt.figure(figsize=(10, 5))
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Detected Contours')
plt.axis('off')
plt.show()

效果展示

还可以但也是略显拉胯

动态逐步显示轮廓结果

实现思路

        通过 OpenCV 读取并处理图像,查找其中的轮廓,然后逐步绘制每个轮廓并动态显示处理结果,最后使用 Matplotlib 显示最终效果。代码的具体步骤如下:

1. 读取图像并缩放


image = cv2.imread('./imgs/006.jpg')

        首先,使用 cv2.imread() 读取指定路径下的图片文件,并存储在变量 image 中。


scale_percent = 50  # 调整比例,例如50%表示图片缩小一半
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)
resized_image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)

        接着,将读取的图片进行缩放,使其适合显示。scale_percent 设置为 50%,表示缩小至原图像的一半。cv2.resize() 根据新的宽度和高度调整图像大小,缩放后的图像存储在 resized_image 变量中。

2. 转换为灰度图像


gray = cv2.cvtColor(resized_image, cv2.COLOR_BGR2GRAY)

        将缩放后的彩色图像转换为灰度图像,因为在接下来的步骤中,轮廓检测通常是在灰度图上进行的。使用 cv2.cvtColor() 完成从 BGR(彩色)到灰度的转换。

3. 二值化处理


ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

        使用 cv2.threshold() 对灰度图像进行二值化处理。该函数将图像中像素值大于 127 的部分设置为 255,其他部分设置为 0,生成一个只有黑白两种颜色的图像 thresh。这有助于后续的轮廓检测,使得轮廓更为清晰。

4. 查找轮廓


contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        在二值化图像上查找轮廓,使用 cv2.findContours() 函数。cv2.RETR_EXTERNAL 表示只提取最外层的轮廓,cv2.CHAIN_APPROX_SIMPLE 则减少冗余点以优化轮廓的表示。函数返回检测到的轮廓列表 contours,以及层次信息 hierarchy

5. 动态显示轮廓


for cnt in contours:
    # 绘制每个轮廓
    cv2.drawContours(resized_image, [cnt], -1, (0, 255, 0), 3)

    # 动态显示当前的结果
    cv2.imshow('Contour Detection', resized_image)

    # 设置等待时间,每隔500ms显示一个轮廓
    cv2.waitKey(500)

        在这部分,遍历所有检测到的轮廓 contours,并使用 cv2.drawContours() 将每个轮廓绘制在缩放后的图像 resized_image 上。每次绘制完一个轮廓后,使用 cv2.imshow() 动态显示当前处理的图像结果。

        cv2.waitKey(500) 控制显示的时间间隔为 500 毫秒,这使得用户可以看到轮廓逐步被绘制的过程,营造动态展示的效果。

6. 显示最终结果并关闭窗口


cv2.waitKey(0)
cv2.destroyAllWindows()

在所有轮廓绘制完成后,程序会停留在最后的显示结果上,直到用户按下任意键关闭窗口。cv2.destroyAllWindows() 用于关闭所有由 OpenCV 打开的窗口。

7. 使用 Matplotlib 显示最终图像


plt.figure(figsize=(10, 5))
plt.imshow(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))
plt.title('Detected Contours')
plt.axis('off')
plt.show()

        在完成 OpenCV 的处理后,使用 Matplotlib 来显示最终的检测结果。由于 OpenCV 使用的是 BGR 颜色空间,而 Matplotlib 使用 RGB,因此需要用 cv2.cvtColor() 将图像颜色从 BGR 转换为 RGB 格式。plt.imshow() 显示处理后的图像,并通过 plt.axis('off') 去掉坐标轴。

代码实现

import cv2
import matplotlib.pyplot as plt

# 读取图像并转换为灰度
image = cv2.imread('./imgs/006.jpg')

# 缩放图片,使窗口大小合适
scale_percent = 50  # 调整比例,例如50%表示图片缩小一半
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)
resized_image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)

# 转换为灰度
gray = cv2.cvtColor(resized_image, cv2.COLOR_BGR2GRAY)

# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 动态显示每个轮廓
for cnt in contours:
    # 绘制每个轮廓
    cv2.drawContours(resized_image, [cnt], -1, (0, 255, 0), 3)

    # 动态显示当前的结果
    cv2.imshow('Contour Detection', resized_image)

    # 设置等待时间,每隔500ms显示一个轮廓
    cv2.waitKey(500)

# 显示最终结果并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

# 使用matplotlib显示最终图像
plt.figure(figsize=(10, 5))
plt.imshow(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))
plt.title('Detected Contours')
plt.axis('off')
plt.show()

效果展示

        这里的效果其实就是绘制轮廓图像然后让他一点点的绘制出来,就是这么个效果,动图不好截图,我就不再展示了。


物体跟踪

实现思路

  • 摄像头捕获cv2.VideoCapture(0) 打开系统默认摄像头并开始捕获视频流。
  • 背景减法:通过 cv2.createBackgroundSubtractorMOG2() 来生成前景掩码,用于检测运动物体。
  • 轮廓检测:使用 cv2.findContours() 检测运动物体的轮廓。
  • 物体跟踪:通过 cv2.boundingRect() 为每个符合条件的轮廓绘制边界框,实现物体的实时跟踪。
  • 退出条件:按下 'q' 键可退出循环并停止摄像头。

整体代码

import cv2

# 初始化视频捕获,打开摄像头
cap = cv2.VideoCapture(0)

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

while True:
    # 读取摄像头帧
    ret, frame = cap.read()
    if not ret:
        break

    # 对帧进行背景减除,获取前景掩码
    fgmask = fgbg.apply(frame)

    # 查找前景中的轮廓
    contours, _ = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 遍历每个轮廓,进行物体跟踪
    for cnt in contours:
        # 忽略较小的轮廓,避免噪声
        if cv2.contourArea(cnt) > 500:
            # 获取轮廓的边界框
            x, y, w, h = cv2.boundingRect(cnt)

            # 绘制边界框
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

            # 在物体上显示跟踪的文字
            cv2.putText(frame, 'Tracking Object', (x, y - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)

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

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

# 释放资源并关闭窗口
cap.release()
cv2.destroyAllWindows()

效果展示

标签:plt,轮毂,cv2,Matplotlib,OpenCV,灰度,图像,轮廓,image
From: https://blog.csdn.net/DDDDWJDDDD/article/details/142069036

相关文章

  • OpenCV 与 YoloV3的结合使用:目标实时跟踪
    目录代码分析1.YOLO模型加载2.视频加载与初始化3.视频帧处理4.物体检测5.处理检测结果6.边界框和类别显示7.帧率(FPS)计算8.结果显示与退出9.资源释放整体代码效果展示总结代码分析这段代码使用YOLO(YouOnlyLookOnce)模型进行视频中的物体检测,并通......
  • 【OpenCV】简介入门及资料文档,工具准备和环境部署
    OpenCV已更新到 4.x,计算机视觉和机器学习的软件库git地址:https://github.com/opencv/opencv1.跨平台:Linux,Windows,Android,MacOS2.由C和C++轻量级编写3.提供C++,Java,Python,Ruby,MATLAB,C#、Ch、Ruby,GO接口应用:图像处理(滤波、边缘检测等)视频处理(实时视频处理等)物体......
  • Matplotlib 完全指南:从基础图表到高级可视化
    Matplotlib是一个功能强大的Python库,用于创建各种类型的图表和可视化。无论您是数据科学家、工程师还是研究人员,Matplotlib都可以帮助您以直观的方式探索数据并传达结果。在本文中,我们将提供一个完整的指南,介绍如何使用Matplotlib创建基本的图表,包括折线图、散点图、柱状图和......
  • 【机器学习】C++与OpenCV实战:创建你的第一个图片显示程序
    ......
  • qt5.15.2+opencv4.10+VS2019_64 均值滤波,高斯滤波算法详细分析
    目录 一.加载图像二.灰度图像三.均值滤波1.均值滤波均值滤波算法(MeanFiltering):    参数含义:    一句话总结:均值滤波特点:应用场景:缺点:2.高斯滤波高斯滤波算法(GaussianBlur):        高斯滤波计算过程:    参数含义:    ......
  • opencv学习:图像轮廓识别及代码实现
    图像轮廓1.获取图像轮廓cv2.findContours()函数是OpenCV库中用于检测图像中轮廓的函数。它可以检测到图像中所有连通区域的边界,并返回这些轮廓的列表。从OpenCV3.4版本开始,这个函数的返回值和参数有所变化,以下是详细的参数说明:方法:contours,hierarchy=cv2.findCon......
  • 基于ARM芯片与OpenCV的工业分拣机器人项目设计与实现流程详解
    一、项目概述项目目标和用途本项目旨在设计和实现一套工业分拣机器人系统,能够高效、准确地对不同类型的物品进行自动分拣。该系统广泛应用于物流、仓储和制造业,能够显著提高工作效率,降低人工成本。技术栈关键词ARM芯片步进电机控制OpenCV图像识别无线通信模块......
  • OpenCV(cv::Mat::setTo())
    目录1.函数定义2.示例3.使用场景4.性能5.注意事项cv::Mat::setTo()是OpenCV中用于将矩阵中的所有元素设置为一个给定的值。它可以应用于整个矩阵,也可以通过掩码(mask)仅对部分矩阵进行操作。这个函数常用于图像处理中的多种场景,例如图像填充、区域修改等。1.函数定......
  • Python Matplotlib绘制柏拉图以及在ax.table上绘制矩形、直线、椭圆
    快速入门指南官网官方网址:Matplotlib—VisualizationwithPython官方教程:Tutorials—Matplotlib3.9.2documentation官方指南:UsingMatplotlib—Matplotlib3.9.2documentation官方示例:Examples—Matplotlib3.9.2documentation官方API说明:APIReference—Mat......
  • 掌握动态图表:使用Python的Matplotlib库实现动态数据可视化
    在数据可视化领域,Matplotlib库是Python中最流行和功能强大的工具之一。它能够生成各种静态图表,如散点图、折线图和柱状图等。然而,Matplotlib也提供了创建动态图表的功能,使得我们能够以动画的方式展示数据的变化趋势,从而更直观地理解数据。本文将介绍如何使用Matplotlib库创建动态图......