使用Python OpenCV进行实时距离估计


Python 和 OpenCV 彻底改变了计算机视觉领域,使开发人员和研究人员能够探索广泛的应用。凭借其简洁性、多功能性和广泛的库支持,Python 已成为包括计算机视觉在内的各个领域的流行编程语言。作为 Python 功能的补充,OpenCV(开源计算机视觉库)提供了一个强大的图像和视频处理工具包,使其成为实现计算机视觉算法的首选。

在本文中,我们将指导您完成设置开发环境、捕获实时视频馈送、校准摄像头以及使用 OpenCV 实现目标检测和跟踪技术的流程。然后,我们将探索各种距离计算方法,包括三角测量,并展示如何无缝集成这些技术以实时估计物体之间的距离。在文章的下一部分,我们将介绍相机校准的基础知识及其在距离估计中的意义。

使用Python OpenCV进行实时距离估计

首先,我们需要安装 OpenCV 及其依赖项。

安装 Python:如果您尚未安装 Python,请访问官方 Python 网站 (python.org) 并下载与您的操作系统兼容的最新版本。

安装 OpenCV:可以使用 pip 等包管理器安装 OpenCV。打开您的终端或命令提示符并运行以下命令:

pip install opencv-python

此命令将下载并安装 Python 的 OpenCV 包。

安装其他库:除了 OpenCV 之外,我们还将为此项目使用其他 Python 库。通过运行以下 pip 命令来安装它们:

pip install numpy
pip install matplotlib

NumPy 是一个强大的数值计算库,而 Matplotlib 可用于可视化数据和显示图像。

通过使用 OpenCV 访问摄像头馈送来捕获实时视频

为了执行实时距离估计,我们首先需要使用 OpenCV 访问摄像头馈送。幸运的是,OpenCV 提供了直接的功能来完成此任务。在本教程中,我们将使用 `VideoCapture` 类,它允许我们从摄像头捕获视频帧。

这是一个演示如何访问摄像头馈送的代码片段示例:

import cv2

# Create a VideoCapture object
cap = cv2.VideoCapture(0)

# Check if the camera is opened successfully
if not cap.isOpened():
    print("Failed to open the camera")
    exit()

# Read and display frames from the camera
while True:
    ret, frame = cap.read()
    if not ret:
        print("Failed to read frame from the camera")
        break

    # Display the frame
    cv2.imshow("Camera Feed", frame)

    # Break the loop if 'q' is pressed
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Release the VideoCapture object and close the windows
cap.release()
cv2.destroyAllWindows()

在上面的代码中,我们已经访问了视频摄像头的馈送。现在让我们了解如何跟踪物体。

OpenCV 中的目标检测和跟踪

目标检测是计算机视觉中的一项关键任务,它涉及定位和分类图像或视频流中的物体。OpenCV 提供了几种目标检测算法,包括 Haar 级联和定向梯度直方图 (HOG)。

Haar 级联:Haar 级联是经过训练的分类器,它们根据特定的视觉特征(例如边缘、角点和纹理模式)来检测物体。这些分类器使用一系列用正负样本训练的弱分类器来逐步缩小目标物体的搜索范围。

HOG(定向梯度直方图):HOG 是一种特征描述符,它捕获局部物体的外观和形状信息。它通过计算和分析图像中梯度方向的分布来工作。

在本教程中,我们将重点介绍使用 OpenCV 的基于 Haar 级联的目标检测方法。这是一个演示视频流中目标检测和跟踪的代码片段示例:

import cv2

# Load the pre-trained Haar cascade classifier
cascade_path = "haarcascade_frontalface_default.xml"
face_cascade = cv2.CascadeClassifier(cascade_path)

# Access the camera feed
cap = cv2.VideoCapture(0)

while True:
    # Read a frame from the camera
    ret, frame = cap.read()
    if not ret:
        print("Failed to read frame from the camera")
        break

    # Convert the frame to grayscale
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Detect faces in the grayscale frame
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    # Draw rectangles around the detected faces
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # Display the resulting frame
    cv2.imshow("Object Detection", frame)

    # Break the loop if 'q' is pressed
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Release the VideoCapture object and close the windows
cap.release()
cv2.destroyAllWindows()

在上面的代码中,我们首先使用 OpenCV 提供的 `CascadeClassifier` 类加载用于人脸检测的 Haar 级联分类器。您可以尝试使用不同的预训练 Haar 级联和参数来检测其他物体或提高检测精度。

使用三角测量进行距离计算

三角测量是一种广泛使用的基于几何和透视原理的距离估计方法。三角测量涉及使用视差和已知的几何关系来计算距离。

OpenCV 提供了轻松实现三角测量算法的功能和工具。这是一个演示使用 OpenCV 进行立体三角测量的代码片段示例:

import cv2
import numpy as np

# Load the camera calibration parameters
camera_matrix_1 = np.load("camera_matrix_1.npy")
dist_coeff_1 = np.load("dist_coeff_1.npy")
camera_matrix_2 = np.load("camera_matrix_2.npy")
dist_coeff_2 = np.load("dist_coeff_2.npy")
R = np.load("rotation_matrix.npy")
T = np.load("translation_vector.npy")

# Load the corresponding image points in each view
image_points_1 = np.load("image_points_1.npy")
image_points_2 = np.load("image_points_2.npy")

# Perform stereo triangulation
points_4d = cv2.triangulatePoints(camera_matrix_1, camera_matrix_2, image_points_1, image_points_2)

# Convert 4D homogeneous coordinates to 3D Cartesian coordinates
points_3d = cv2.convertPointsFromHomogeneous(points_4d.T)

# Extract the X, Y, and Z coordinates
x = points_3d[:, 0, 0]
y = points_3d[:, 0, 1]
z = points_3d[:, 0, 2]

# Calculate the distances
distances = np.sqrt(x**2 + y**2 + z**2)

# Print the calculated distances
for i, distance in enumerate(distances):
    print(f"Point {i+1} distance: {distance}")

在上面的代码中,我们已经实现了用于距离计算的三角测量算法。通过使用 OpenCV 实现这些三角测量算法,我们可以准确地估计实时应用中的距离。

实时距离估计

现在我们已经介绍了目标检测、相机校准和距离计算的各个组成部分,是时候将所有内容整合在一起,创建一个完整的实时距离估计系统了。

我们的实时距离估计应用程序的代码实现将如下所示:

import cv2
import numpy as np

# Load the camera calibration parameters
camera_matrix_1 = np.load("camera_matrix_1.npy")
dist_coeff_1 = np.load("dist_coeff_1.npy")
camera_matrix_2 = np.load("camera_matrix_2.npy")
dist_coeff_2 = np.load("dist_coeff_2.npy")
R = np.load("rotation_matrix.npy")
T = np.load("translation_vector.npy")

# Load the pre-trained Haar cascade classifier
cascade_path = "haarcascade_frontalface_default.xml"
face_cascade = cv2.CascadeClassifier(cascade_path)

# Access the camera feed
cap = cv2.VideoCapture(0)

while True:
    # Read a frame from the camera
    ret, frame = cap.read()
    if not ret:
        print("Failed to read frame from the camera")
        break

    # Convert the frame to grayscale
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Detect faces in the grayscale frame
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    for (x, y, w, h) in faces:
        # Calculate the 2D image points for triangulation
        image_points_1 = np.array([[x, y+h/2]], dtype=np.float32)
        image_points_2 = np.array([[x+w, y+h/2]], dtype=np.float32)

        # Perform stereo triangulation
        points_4d = cv2.triangulatePoints(camera_matrix_1, camera_matrix_2, image_points_1, image_points_2)

        # Convert 4D homogeneous coordinates to 3D Cartesian coordinates
        points_3d = cv2.convertPointsFromHomogeneous(points_4d.T)

        # Extract the X, Y, and Z coordinates
        x = points_3d[0, 0, 0]
        y = points_3d[0, 0, 1]
        z = points_3d[0, 0, 2]

        # Calculate the distance
        distance = np.sqrt(x**2 + y**2 + z**2)

        # Draw a bounding box and display the distance on the frame
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
        cv2.putText(frame, f"Distance: {distance:.2f} units", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)

    # Display the resulting frame
    cv2.imshow("Real-time Distance Estimation", frame)

    # Break the loop if 'q' is pressed
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Release the capture and close the windows
cap.release()
cv2.destroyAllWindows()

在上面的代码中,我们已经成功地使用 Python 和 OpenCV 实现了一个实时距离估计应用程序。

结论

在本教程中,我们学习了如何使用 Python 和 OpenCV 执行实时距离估计。通过结合目标检测、跟踪和三角测量技术,我们创建了一个完整的系统,用于实时估计物体之间的距离。使用提供的代码示例,您现在可以探索机器人技术、增强现实和安全系统等各个领域的应用。享受探索计算机视觉的激动人心的可能性!

更新于: 2023年7月25日

2K+ 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告