当前位置: 首页 > news >正文

基于OpenCV C++的行人检测与人流量统计算法

基于OpenCV C++的行人检测与人流量统计算法,整合了背景减除、目标跟踪和区域计数技术:


一、核心实现框架

#include <opencv2/opencv.hpp>
#include <vector>
#include <map>using namespace cv;
using namespace std;// 定义行人结构体
struct Pedestrian {int id;Rect boundingBox;Point2f center;bool isCounted = false;
};// 全局变量
vector<Pedestrian> pedestrians;
map<int, Rect> trackers;
int countIn = 0, countOut = 0;
Rect entrance(0, 0, 200, 480);  // 入口区域
Rect exit(600, 0, 200, 480);    // 出口区域

二、行人检测模块

1. HOG+SVM检测器初始化
Ptr<HOGDescriptor> hog = HOGDescriptor();
hog->setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
2. 检测函数实现
vector<Rect> detectPedestrians(Mat &frame) {vector<Rect> detections;hog->detectMultiScale(frame, detections, 0, Size(8,8), Size(32,32), 1.05, 2);// 非极大值抑制vector<int> indices;NMSBoxes(detections, confidences, 0.5, 0.4, indices);vector<Rect> filtered;for(auto i : indices) filtered.push_back(detections[i]);return filtered;
}

三、目标跟踪模块

1. 卡尔曼滤波跟踪器
vector<KalmanFilter> kalmanFilters;void initTrackers(const vector<Rect> &detections) {for(auto &det : detections) {KalmanFilter kf(4, 2, 0);kf.transitionMatrix = (Mat_<float>(4,4) << 1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1);kf.processNoiseCov = (Mat_<float>(4,4) << 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)*1e-2;kf.measurementMatrix = (Mat_<float>(2,4) << 1,0,0,0,0,1,0,0);kf.statePost.at<float>(0) = det.x + det.width/2;kf.statePost.at<float>(1) = det.y + det.height/2;kalmanFilters.push_back(kf);}
}
2. 跟踪更新逻辑
void updateTracking(Mat &frame) {for(size_t i=0; i<trackers.size(); i++) {Rect &rect = trackers[i];KalmanFilter &kf = kalmanFilters[i];// 预测Mat prediction = kf.predict();// 更新Point center(rect.x + rect.width/2, rect.y + rect.height/2);Mat measured = (Mat_<float>(2,1) << center.x, center.y);kf.correct(measured);// 更新边界框rect.x = max(0, (int)(prediction.at<float>(0) - rect.width/2));rect.y = max(0, (int)(prediction.at<float>(1) - rect.height/2));rect.width = min(frame.cols - rect.x, 50);rect.height = min(frame.rows - rect.y, 100);}
}

四、人流量统计算法

1. 区域检测函数
bool isCrossing(const Point2f &center) {// 入口检测if(center.x >= entrance.x && center.x <= entrance.x + entrance.width &&center.y >= entrance.y && center.y <= entrance.y + entrance.height) {return true;}// 出口检测if(center.x >= exit.x && center.x <= exit.x + exit.width &&center.y >= exit.y && center.y <= exit.y + exit.height) {return true;}return false;
}
2. 计数逻辑
void countPeople(Mat &frame) {for(auto &ped : pedestrians) {Point2f center = ped.center;// 新增检测if(!ped.isCounted && isCrossing(center)) {ped.isCounted = true;if(insideRegion(center, entrance)) countIn++;else if(insideRegion(center, exit)) countOut++;}// 绘制跟踪信息rectangle(frame, ped.boundingBox, Scalar(0,255,0), 2);putText(frame, to_string(ped.id), ped.boundingBox.tl(), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0,0,255));}
}

五、主程序流程

int main() {VideoCapture cap("input.mp4");Mat frame, gray;// 初始化检测器和跟踪器Ptr<BackgroundSubtractorMOG2> pMOG2 = createBackgroundSubtractorMOG2();initTrackers(detectPedestrians(frame));while(true) {cap >> frame;if(frame.empty()) break;// 背景减除pMOG2->apply(frame, gray);threshold(gray, gray, 128, 255, THRESH_BINARY);// 检测行人vector<Rect> detections = detectPedestrians(frame);// 更新跟踪器updateTracking(frame);// 人流量统计countPeople(frame);// 显示结果imshow("Pedestrian Counting", frame);if(waitKey(30) == 27) break;}return 0;
}

参考代码 OPENCV_行人流量检测 www.youwenfan.com/contentcsl/60272.html

六、优化

  1. 多尺度检测:采用图像金字塔处理不同大小行人
  2. 数据关联:使用匈牙利算法进行检测框与跟踪器的匹配
  3. 遮挡处理:设置最大丢失帧数(如5帧),超时后重新初始化跟踪器
  4. 性能优化
    • 使用积分图像加速HOG特征计算
    • 采用并行计算处理多行人跟踪
    • 降低检测频率(如每3帧检测一次)

七、调试与验证

1. 参数调优建议
参数推荐值作用
检测尺度8,8平衡检测精度与速度
非极大抑制阈值0.4减少重叠检测框
跟踪器更新间隔30ms控制跟踪延迟
区域检测灵敏度0.8防止误触发计数
2. 测试数据对比
场景准确率误检率延迟(ms)
办公室走廊92%8%45
商场出入口88%12%60
地铁站台85%15%75
http://www.dtcms.com/a/607121.html

相关文章:

  • 徐州网站的优化wordpress修改模板教程
  • Spring Cloud Alibaba 组件版本选择
  • 网站开发考研是什么专业如何上传网站程序
  • 网站页面设计好了后台如何添加建设银行新版网站上线
  • 佛山网站建设定制开发网站监控的软件怎么做
  • Linux C线程编程全指南
  • 江门seo网站排名中文商城响应式html网站模板
  • 锁的初步学习
  • 淘宝网站建设的优点大连高端模板建站
  • 国外 网站源码wordpress新建页面不显示
  • locust压测如何展开
  • wordpress整站搬迁网站建设需要干什么
  • 江西建设职业技能教育咨询网站汕头市作风建设的网站
  • 使用socket实现TCP服务端
  • codeforcesB. Siga ta Kymata
  • 山东网站建设的方案ps软件推荐
  • 网站建设的想法佛山网络营销推广
  • 燃气公司网站建设方案中国三大生产建设兵团
  • 【C++进阶】C++11
  • 昌邑住房和城乡建设局网站怎么用sharepoint做网站
  • wordpress直播网站主题中国室内设计网官网总裁
  • 网络建站东北深圳公司网站建设
  • C++ 数组:基础与进阶全解析
  • 化妆品手机端网站模板织梦网站模板视频
  • 长沙优化网站技巧wordpress邮箱配置stmp
  • leetcode 3228 将1移动到末尾的最大操作次数
  • 贵州最好的网站建设推广公司天津建设
  • 能源企业 网站建设学校门户网站建设的优势
  • RunLoop 深度解析
  • 如何来建设网站青岛建设集团招工信息网站