【OpenCV】幀差法、級聯分類器、透視變換

一、幀差法(移動目標識別):

好處:開銷小,不怎么消耗CPU的算力,對硬件要求不高,但只適合固定攝像頭

1、優點

  1. 計算效率高,硬件要求

  2. 響應速度快,實時性強

    直接利用連續幀的像素差異檢測運動,延遲極低,可實時捕捉動態目標的運動軌跡。
  3. 無需背景建模,適應動態變化

    不依賴靜態背景模型(如高斯混合模型 GMM),因此對光照突變、背景微小變化(如樹葉晃動)不敏感,魯棒性優于部分背景差分法。
  4. 內存占用少

    僅需存儲前一幀或前幾幀圖像,內存開銷小,適合資源受限的系統。

2、缺點

  1. 僅適用于固定攝像頭場景

  2. 無法檢測靜止目標

    若目標在相鄰幀間無位移(如短暫靜止的行人),差分結果中目標區域像素差異為零,會被誤認為背景,導致漏檢。
  3. 對噪聲敏感,檢測精度低

    微小噪聲(如傳感器噪聲、光線波動)會導致差分圖像出現大量 “偽運動區域”,需依賴形態學操作(如腐蝕、膨脹)降噪,但可能模糊目標邊界或丟失細節
  4. 目標 “空洞化” 與 “斷裂” 問題

    當目標內部像素變化較小時(如純色物體),差分后可能出現 “空洞”;若目標運動速度快,相鄰幀重疊區域少,可能導致檢測結果不連續(如車輛被分割為多個碎片)。
  5. 無法提供目標完整信息

    僅能檢測運動區域的位置和輪廓,無法獲取目標類別(如人、車)、尺寸、歷史軌跡關聯等高級信息,需結合其他算法(如目標跟蹤、深度學習分類)補充。
步驟目的核心操作 / 算法
1. 讀取圖像獲取視頻流中的連續幀(如第?t?幀和第?t+1?幀)VideoCapture?+?read()
2. 灰度轉換減少計算復雜度,突出亮度變化cvtColor()
3. 幀差分計算計算相鄰幀像素差異,突出運動區域absdiff()
4. 二值化處理將差分結果轉換為二值圖像(前景為運動區域,背景為靜止區域)threshold()
5. 降噪去除噪聲,連接斷裂的運動區域腐蝕(erode())+ 膨脹(dilate()
6. 多邊擬合提取運動目標輪廓,過濾無效噪聲findContours()?+ 輪廓面積過濾
7. 結果輸出在原圖標記目標區域并顯示 / 保存rectangle()?+?imshow()

3.開、閉運算

開運算:先腐蝕在膨脹,用來消除圖像周邊小白點

閉運算:先膨脹在腐蝕,用來消除物體內部的小黑點

二、opencv級聯分類器:

正樣本數據采集:需要檢測的物體圖片

負樣本數據采集:非檢測物的圖片(是正樣本的3倍)

1.優點

  • 可檢測特定目標,泛化能力較強(需充分訓練)。
  • 計算效率高(級聯結構快速排除非目標區域)。
  • 無需視頻時序信息,適用于單圖像檢測。

2.缺點

  • 需要大量標注數據進行訓練,且訓練過程耗時。
  • 僅能檢測預定義目標,無法檢測未知類型目標。
  • 對目標尺度、姿態變化敏感(需多尺度檢測或重新訓練)。

3.步驟:

  • 1.灰度處理

Mat gray;
cvtColor(frame,gray,CV_BGR2GRAY);

  • 2.壓縮到原來一半

Mat small(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);
resize(gray,small,small.size(),0,0,INTER_LINEAR);

  • 3.直方圖均衡化

equalizeHist(small,small);

  • 4.用級聯分類識別車輛

?vector<Rect> cars;
cascade.detectMultiScale(small,cars,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));

  • 5.繪制矩形

vector<Rect>::const_iterator iter;

for(iter=cars.begin();iter!=cars.end();iter++){
? ? rectangle(frame,
? ? ? ? ?cvPoint(cvRound(iter->x*scale),cvRound(iter->y*scale)),
? ? ? ? ?cvPoint(cvRound((iter->x+iter->width)*scale),cvRound((iter->y+iter->height)*scale)),
? ? ? ? ?Scalar(0,255,0),
? ? ? ? ?2,3
? ? ? ? );

}

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;void detec_car(Mat& frame,CascadeClassifier& cascade,double scale)
{//1.灰度處理Mat gray;cvtColor(frame,gray,CV_BGR2GRAY);//2.壓縮到原來一半Mat small(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);resize(gray,small,small.size(),0,0,INTER_LINEAR);//3.直方圖均衡化equalizeHist(small,small);//4.用級聯分類識別車輛vector<Rect> cars;cascade.detectMultiScale(small,cars,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));//5.繪制矩形vector<Rect>::const_iterator iter;for(iter=cars.begin();iter!=cars.end();iter++){rectangle(frame,cvPoint(cvRound(iter->x*scale),cvRound(iter->y*scale)),cvPoint(cvRound((iter->x+iter->width)*scale),cvRound((iter->y+iter->height)*scale)),Scalar(0,255,0),2,3);}imshow("res",frame);
}int main()
{Mat frame;//加載級聯分類器CascadeClassifier cascade;cascade.load("xml/cars.xml");VideoCapture video("video/carMove.mp4");while(video.read(frame)){imshow("video",frame);detec_car(frame,cascade,2.0);waitKey(40);}return 0;
}

三、透視變換

將傾斜的圖片物品扯平變正

(1)findHomography函數

Mat findHomography( InputArray srcPoints, InputArray dstPoints,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int method = 0, double ransacReprojThreshold = 3,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OutputArray mask=noArray(), const int maxIters = 2000,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?const double confidence = 0.995);

//輸入點擊坐標順序,接收順序(都是存在容器當中)

通過原圖四個坐標和轉化后四個坐標計算映射矩陣

Mat homo=findHomography(data.points,obj,CV_FM_RANSAC);

(2)warpPerspective函數

void warpPerspective( InputArray src, OutputArray dst,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?InputArray M, Size dsize,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int flags = INTER_LINEAR,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int borderMode = BORDER_CONSTANT,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?const Scalar& borderValue = Scalar());


?warpPerspective(img,result,homo,result.size());

#include <iostream>#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;typedef struct{Mat img;//需操作的圖像vector<Point2f> points;//保存每次鼠標點擊的位置信息
}DATA;void mouseHandle(int event,int x,int y,int flag,void* arg){DATA* pd=(DATA*)arg;if(event==EVENT_LBUTTONDOWN){//鼠標左鍵按下//圖片,中心坐標,半徑,圓顏色,邊緣粗細,線條類型circle(pd->img,Point(x,y),3,Scalar(0,255,0),3,CV_AA);if(pd->points.size()<4){pd->points.push_back(Point2f(x,y));}imshow("book",pd->img);}}
int main()
{//行列(高寬)Mat result=Mat::zeros(400,800,CV_8UC1);Mat img=imread("image/1.jpg");imshow("book",img);DATA data;data.img=img;setMouseCallback("book",mouseHandle,&data);waitKey(0);//設置轉換后的坐標//這個順序要與點擊順序一致,左上為開始,順時針vector<Point2f> obj;obj.push_back(Point2f(0,0));obj.push_back(Point2f(800,0));obj.push_back(Point2f(800,400));obj.push_back(Point2f(0,400));//通過原圖四個坐標和轉化后四個坐標計算映射矩陣Mat homo=findHomography(data.points,obj,CV_FM_RANSAC);imshow("homo",homo);//四個參數類型//InputArray src,   OutputArray dst,  InputArray M,   Size dsizewarpPerspective(img,result,homo,result.size());imshow("result",result);waitKey(0);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83440.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83440.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫遷移的藝術:團隊協作中的沖突預防與解決之道

title: 數據庫遷移的藝術:團隊協作中的沖突預防與解決之道 date: 2025/05/17 00:13:50 updated: 2025/05/17 00:13:50 author: cmdragon excerpt: 在團隊協作中,數據庫遷移腳本沖突是常見問題。通過Alembic工具,可以有效地管理和解決這些沖突。沖突預防的四原則包括功能分…

Linux常用命令43——bunzip2解壓縮bz2文件

在使用Linux或macOS日常開發中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;bunzip2可解壓縮.bz2格式的壓縮文件。bunzip2實際上是bzip2的符號連接&#xff0c;執行bunzip2與bzip2 -d的效果相同。本篇學習記錄bunzip2命令的基本使用。 首先查看幫助文檔&#…

盲盒:拆開未知的驚喜,收藏生活的儀式感

一、什么是盲盒&#xff1f;—— 一場關于“未知”的浪漫冒險 盲盒&#xff0c;是一種充滿神秘感的消費體驗&#xff1a; &#x1f381; 盒中藏驚喜——每個盲盒外觀相同&#xff0c;但內含隨機商品&#xff0c;可能是普通款、稀有款&#xff0c;甚至是“隱藏款”&#xff1b;…

Android 中使用通知(Kotlin 版)

1. 前置條件 Android Studio&#xff1a;確保使用最新版本&#xff08;2023.3.1&#xff09;目標 API&#xff1a;最低 API 21&#xff0c;兼容 Android 8.0&#xff08;渠道&#xff09;和 13&#xff08;權限&#xff09;依賴庫&#xff1a;使用 WorkManager 和 Notificatio…

使用大模型預測急性結石性疾病技術方案

目錄 1. 數據預處理與特征工程偽代碼 - 數據清洗與特征處理數據預處理流程圖2. 大模型構建與訓練偽代碼 - 模型訓練模型訓練流程圖3. 術前預測系統偽代碼 - 術前風險評估術前預測流程圖4. 術中實時調整系統偽代碼 - 術中風險預警術中調整流程圖5. 術后護理系統偽代碼 - 并發癥預…

每日Prompt:生成自拍照

提示詞 幫我生成一張圖片&#xff1a;圖片風格為「人像攝影」&#xff0c;請你畫一張及其平凡無奇的iPhone對鏡自拍照&#xff0c;主角是穿著JK風格cos服的可愛女孩&#xff0c;在自己精心布置的可按風格的房間內的落地鏡前用后置攝像頭隨手一拍的快照。照片開啟了閃光燈&…

動態規劃-64.最小路徑和-力扣(LetCode)

一、題目解析 從左上角到右下角使得數字總和最小且只能向下或向右移動 二、算法原理 1.狀態表示 我們需要求到達[i,j]位置時數字總和的最小值&#xff0c;所以dp[i][j]表示&#xff1a;到達[i,j]位置時&#xff0c;路徑數字總和的最小值。 2.狀態轉移方程 到達[i,j]之前要先…

LeetCode LCR 010 和為 K 的子數組 (Java)

兩種解法詳解&#xff1a;暴力枚舉與前綴和哈希表尋找和為k的子數組 在解決數組中和為k的連續子數組個數的問題時&#xff0c;我們可以采用不同的方法。本文將詳細解析兩種常見的解法&#xff1a;暴力枚舉法和前綴和結合哈希表的方法&#xff0c;分析它們的思路、優缺點及適用…

OpenVLA (2) 機器人環境和環境數據

文章目錄 [TOC](文章目錄) 前言1 BridgeData V21.1 概述1.2 硬件環境 2 數據集2.1 場景與結構2.2 數據結構2.2.1 images02.2.2 obs_dict.pkl2.2.3 policy_out.pkl 3 close question3.1 英偉達環境3.2 LIBERO 環境更適合仿真3.3 4090 運行問題 前言 按照筆者之前的行業經驗, 數…

深度學習(第3章——亞像素卷積和可形變卷積)

前言&#xff1a; 本章介紹了計算機識別超分領域和目標檢測領域中常常使用的兩種卷積變體&#xff0c;亞像素卷積&#xff08;Subpixel Convolution&#xff09;和可形變卷積&#xff08;Deformable Convolution&#xff09;&#xff0c;并給出對應pytorch的使用。 亞像素卷積…

大模型在腰椎間盤突出癥預測與治療方案制定中的應用研究

目錄 一、引言 1.1 研究背景 1.2 研究目的與意義 二、腰椎間盤突出癥概述 2.1 定義與病因 2.2 癥狀與診斷方法 2.3 治療方法概述 三、大模型技術原理與應用基礎 3.1 大模型的基本原理 3.2 大模型在醫療領域的應用現狀 3.3 用于腰椎間盤突出癥預測的可行性分析 四、…

Vue3學習(組合式API——ref模版引用與defineExpose編譯宏函數)

目錄 一、ref模版引用。 &#xff08;1&#xff09;基本介紹。 &#xff08;2&#xff09;核心基本步驟。(以獲取DOM、組件為例) &#xff08;3&#xff09;案例&#xff1a;獲取dom對象演示。 <1>需求&#xff1a;點擊按鈕&#xff0c;讓輸入框聚焦。 &#xff08;4&…

公鏈開發及其配套設施:錢包與區塊鏈瀏覽器

公鏈開發及其配套設施&#xff1a;錢包與區塊鏈瀏覽器的技術架構與生態實踐 ——2025年區塊鏈基礎設施建設的核心邏輯與創新突破 一、公鏈開發&#xff1a;構建去中心化世界的基石 1. 技術架構設計的三重挑戰 公鏈作為開放的區塊鏈網絡&#xff0c;需在性能、安全性與去中心…

Kotlin 作用域函數(let、run、with、apply、also)對比

Kotlin 的 作用域函數&#xff08;Scope Functions&#xff09; 是簡化代碼邏輯的重要工具&#xff0c;它們通過臨時作用域為對象提供更簡潔的操作方式。以下是 let、run、with、apply、also 的對比分析&#xff1a; 一、核心區別對比表 函數上下文對象引用返回值是否擴展函數…

14、Python時間表示:Unix時間戳、毫秒微秒精度與time模塊實戰

適合人群&#xff1a;零基礎自學者 | 編程小白快速入門 閱讀時長&#xff1a;約5分鐘 文章目錄 一、問題&#xff1a;計算機中的時間的表示、Unix時間點&#xff1f;1、例子1&#xff1a;計算機的“生日”&#xff1a;Unix時間點2、答案&#xff1a;&#xff08;1&#xff09;U…

AI日報 - 2024年5月17日

&#x1f31f; 今日概覽 (60秒速覽) ▎&#x1f916; 大模型前沿 | OpenAI推出自主編碼代理Codex&#xff1b;Google DeepMind發布Gemini驅動的編碼代理AlphaEvolve&#xff0c;能設計先進算法&#xff1b;Meta旗艦AI模型Llama 4 Behemoth發布推遲。 Codex能并行處理多任務&…

DriveMM:用于自動駕駛的一體化大型多模態模型——論文閱讀

《DriveMM: All-in-One Large Multimodal Model for Autonomous Driving》2024年12月發表&#xff0c;來自中山大學深圳分校和美團的論文。 大型多模態模型&#xff08;LMM&#xff09;通過整合大型語言模型&#xff0c;在自動駕駛&#xff08;AD&#xff09;中表現出卓越的理解…

C++_STL_map與set

1. 關聯式容器 在初階階段&#xff0c;我們已經接觸過STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、 forward_list(C11)等&#xff0c;這些容器統稱為序列式容器&#xff0c;因為其底層為線性序列的數據結構&#xff0c;里面 存儲的是元素本身。那什么是…

【嵌入式開發-RGB 全彩 LED】

嵌入式開發-RGB 全彩 LED ■ RGB 全彩 LED簡介■ 電路設計■ ■ RGB 全彩 LED簡介 RGB 全彩 LED 模塊顯示不同的顏色。 ■ 電路設計 全彩 LED 使用 PA5、 藍色&#xff08;B&#xff09; TIM2_CHN3 PA1、 綠色&#xff08;G&#xff09;TIM2_CHN2 PA2、 紅色&#xff08;R&am…

計算機網絡:手機和基站之間的通信原理是什么?

手機與基站之間的通信是無線通信技術的核心應用之一,涉及復雜的物理層傳輸、協議交互和網絡管理機制。以下從技術原理、通信流程和關鍵技術三個層面深入解析這一過程: 一、蜂窩網絡基礎架構 1. 蜂窩結構設計 基本原理:將服務區域劃分為多個六邊形“蜂窩小區”,每個小區由*…