【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.mzph.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. 蜂窝结构设计 基本原理:将服务区域划分为多个六边形“蜂窝小区”,每个小区由*…