自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

傳統(tǒng)視覺項(xiàng)目 | ?使用 OpenCV 進(jìn)行運(yùn)動(dòng)檢測(cè)

開發(fā) 機(jī)器視覺
在本文中,我們將引導(dǎo)你了解檢測(cè)視頻流或?qū)崟r(shí)畫面中運(yùn)動(dòng)的基本概念、工具和技術(shù)。

在技術(shù)不斷重塑我們與世界互動(dòng)方式的時(shí)代,計(jì)算機(jī)視覺已成為最令人興奮的創(chuàng)新領(lǐng)域之一。從自動(dòng)駕駛汽車到家庭安防系統(tǒng),檢測(cè)和解釋運(yùn)動(dòng)的能力已成為現(xiàn)代應(yīng)用的重要組成部分。在這些進(jìn)步的背后,OpenCV(開源計(jì)算機(jī)視覺庫(kù))扮演了核心角色,它使開發(fā)者能夠構(gòu)建強(qiáng)大而高效的圖像和視頻處理系統(tǒng)。

在本文中,我們將引導(dǎo)你了解檢測(cè)視頻流或?qū)崟r(shí)畫面中運(yùn)動(dòng)的基本概念、工具和技術(shù)。通過本文的學(xué)習(xí),你不僅將擁有一個(gè)可運(yùn)行的原型,還會(huì)對(duì)運(yùn)動(dòng)檢測(cè)背后的原理有更深入的理解。

運(yùn)動(dòng)檢測(cè)的工作原理是什么?

運(yùn)動(dòng)檢測(cè),也稱為動(dòng)作檢測(cè),涉及識(shí)別視頻流中連續(xù)幀之間的變化。其基本思想很簡(jiǎn)單:如果幀的某一部分隨時(shí)間發(fā)生顯著變化,我們假設(shè)該區(qū)域發(fā)生了運(yùn)動(dòng)。以下是運(yùn)動(dòng)檢測(cè)的基本流程:

  • 幀差分:通過比較視頻的連續(xù)幀,我們可以識(shí)別像素值發(fā)生變化的區(qū)域。這些差異通常表示運(yùn)動(dòng)。
  • 閾值處理:在識(shí)別出差異后,應(yīng)用閾值以將顯著變化與噪聲分離。這確保忽略微小變化(如光照變化)。
  • 輪廓檢測(cè):為了定位和勾勒移動(dòng)物體,分析處理后的圖像以檢測(cè)輪廓。這些輪廓代表移動(dòng)物體的形狀。
  • 背景減除(可選):在更高級(jí)的情況下,維護(hù)一個(gè)背景模型,任何與背景的偏差都被視為運(yùn)動(dòng)。這種方法在固定攝像頭的場(chǎng)景中特別有效。
  • 后處理:可以使用其他技術(shù)(如過濾小范圍運(yùn)動(dòng)或穩(wěn)定檢測(cè))來優(yōu)化結(jié)果,提高準(zhǔn)確性。

為什么選擇OpenCV?

OpenCV(開源計(jì)算機(jī)視覺)是一個(gè)強(qiáng)大的開源庫(kù),專為實(shí)時(shí)計(jì)算機(jī)視覺和圖像處理而設(shè)計(jì)。它提供了廣泛的工具和功能,使運(yùn)動(dòng)檢測(cè)、人臉識(shí)別、目標(biāo)跟蹤等任務(wù)變得簡(jiǎn)單高效。OpenCV的主要特點(diǎn)包括:

  • 廣泛的算法:預(yù)建的圖像處理、特征提取和目標(biāo)檢測(cè)算法。
  • 多語(yǔ)言支持:與Python、C++、Java等語(yǔ)言無縫協(xié)作。
  • 實(shí)時(shí)性能:針對(duì)速度進(jìn)行了優(yōu)化,非常適合實(shí)時(shí)應(yīng)用。
  • 豐富的文檔:龐大的社區(qū)和優(yōu)秀的文檔使OpenCV對(duì)初學(xué)者友好且高度可定制。

在本文中,我們將使用OpenCV的視頻處理功能構(gòu)建一個(gè)運(yùn)動(dòng)檢測(cè)系統(tǒng)。通過將OpenCV的工具與Python的簡(jiǎn)潔性結(jié)合,你會(huì)發(fā)現(xiàn)實(shí)現(xiàn)一個(gè)能夠有效檢測(cè)和突出運(yùn)動(dòng)的解決方案非常容易。

開始使用

步驟1:安裝必要的庫(kù)

pip install opencv-python numpy

步驟2:導(dǎo)入庫(kù)

import cv2
import numpy as np

步驟3:定義運(yùn)動(dòng)檢測(cè)邏輯

  • 使用函數(shù)calculate_motion_regions檢測(cè)運(yùn)動(dòng)。
  • 比較連續(xù)幀以發(fā)現(xiàn)差異。
  • 使用輪廓突出顯示運(yùn)動(dòng)區(qū)域。
  • 通過閾值過濾小范圍運(yùn)動(dòng)。
def calculate_motion_regions(prev_frame, curr_frame, mask, threshold=900):
    # Apply the mask to both frames
    prev_roi = cv2.bitwise_and(prev_frame, prev_frame, mask=mask)
    curr_roi = cv2.bitwise_and(curr_frame, curr_frame, mask=mask)

    # Convert to grayscale for simplicity
    prev_gray = cv2.cvtColor(prev_roi, cv2.COLOR_BGR2GRAY)
    curr_gray = cv2.cvtColor(curr_roi, cv2.COLOR_BGR2GRAY)

    # Calculate absolute difference
    diff = cv2.absdiff(prev_gray, curr_gray)

    # Threshold the difference to binarize
    _, diff_thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

    # Find contours of the motion regions
    contours, _ = cv2.findContours(diff_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    motion_regions = []
    for contour in contours:
        if cv2.contourArea(contour) > threshold:  # Filter small motion areas
            motion_regions.append([contour])

    return motion_regions, diff_thresh

步驟4:初始化視頻捕獲和掩碼

打開視頻文件。

cap = cv2.VideoCapture(r"YourVideoPath") # or use 0 for webcam
if not cap.isOpened():
    print("Error: Cannot open video file.")
    exit()

讀取第一幀并創(chuàng)建覆蓋整個(gè)幀的掩碼。

ret, prev_frame = cap.read()
if not ret:
    print("Error: Cannot read the first frame.")
    cap.release()
    exit()

mask = np.ones(prev_frame.shape[:2], dtype=np.uint8) * 255

步驟5:逐幀處理視頻

循環(huán)遍歷視頻幀,計(jì)算運(yùn)動(dòng)區(qū)域并顯示結(jié)果。

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

    motion_regions, motion_mask = calculate_motion_regions(prev_frame, curr_frame, mask)

    # Draw bounding boxes around motion regions

    for motion_region in motion_regions:
        cv2.polylines(curr_frame, motion_region, isClosed=True, color=(0, 255, 0), thickness=1)

    # Update the previous frame
    prev_frame = curr_frame.copy()

    # Convert motion mask to 3 channels for concatenation
    motion_mask_colored = cv2.cvtColor(motion_mask, cv2.COLOR_GRAY2BGR)

    curr_frame = cv2.resize(curr_frame, (490, 640))
    motion_mask_colored = cv2.resize(motion_mask_colored, (490, 640))

    # Concatenate the current frame and the motion mask side-by-side
    combined_frame = cv2.hconcat([curr_frame, motion_mask_colored])

    # Show the combined frame
    cv2.imshow('Motion Detection', combined_frame)

    # Break the loop with 'q'
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

步驟6:回收

cap.release()
cv2.destroyAllWindows()

工作原理

(1) 幀比較:

  • 每一幀都與前一幀進(jìn)行比較,以識(shí)別差異(運(yùn)動(dòng))。
  • 使用每幀的灰度版本以簡(jiǎn)化處理。

(2) 運(yùn)動(dòng)閾值處理:

通過閾值過濾掉微小差異,以分離出顯著的運(yùn)動(dòng)區(qū)域。

(3) 運(yùn)動(dòng)區(qū)域邊界:

在檢測(cè)到的運(yùn)動(dòng)區(qū)域周圍繪制輪廓以突出顯示。

(4) 可視化:

將處理后的幀和運(yùn)動(dòng)掩碼并排顯示,以便更好地理解。

運(yùn)行代碼

  • 將完整腳本保存為.py文件。
  • 運(yùn)行腳本
  • 按q鍵退出視頻顯示。
責(zé)任編輯:趙寧寧 來源: 小白玩轉(zhuǎn)Python
相關(guān)推薦

2022-08-25 09:00:00

Python編程語(yǔ)言開源庫(kù)

2024-11-27 16:06:12

2016-03-25 10:41:40

項(xiàng)目運(yùn)維管理運(yùn)維

2023-10-12 09:21:41

Java圖像

2023-03-09 07:54:54

2020-10-15 12:00:01

Python 開發(fā)編程語(yǔ)言

2025-02-10 16:00:00

OpenCVYOLOv8計(jì)算機(jī)視覺

2024-11-06 16:56:51

2010-06-11 16:04:34

Windows 7驅(qū)動(dòng)

2024-07-02 10:28:59

2023-06-26 10:44:42

2010-04-02 08:56:00

HTML 5

2024-09-12 17:19:43

YOLO目標(biāo)檢測(cè)深度學(xué)習(xí)

2025-02-11 08:30:00

2018-05-08 14:25:22

Pythondlib人臉檢測(cè)

2024-11-29 16:10:31

2021-07-15 08:00:00

人工智能深度學(xué)習(xí)技術(shù)

2018-06-19 11:00:33

OpenCVPythonC++

2012-03-20 16:31:13

2024-12-13 15:53:58

VLM小型視覺語(yǔ)言模型LLM
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)