MATLAB:

% 作者:Ephemeroptera
% 时间:2018/11/24
% 联系qq:605686962%% 读取视频以及视频第一帧
video=VideoReader('ww.mp4');
firstFrame=imresize(readFrame(video),[480 640]);%% KLT的初始化设置
faceDetector = vision.CascadeObjectDetector; %开启前脸侦测器
faceBbox=faceDetector(firstFrame); %检测人脸
MinEigenPoints = detectMinEigenFeatures(rgb2gray(firstFrame), 'ROI', faceBbox);%使用最小特征值算法和返回cornerPoints检测角点
firstShow=insertObjectAnnotation(firstFrame,'rectangle',faceBbox,'Face','LineWidth',2,'Color','g'); %显示
firstShow=insertMarker(firstShow,MinEigenPoints.Location,'+','Color','w','Size',2);
figure(1);imshow(firstShow);title('the initial');pointTracker = vision.PointTracker('MaxBidirectionalError', 2);%向前后错误阈值设置为2
initialize(pointTracker, MinEigenPoints.Location, firstFrame);%初始化追踪器%% KLT追踪
oldPoints =MinEigenPoints.Location;% 获取初始化时特征角点
bboxPoints = bbox2points(faceBbox);% 获取人脸框的四个坐标
n=2;
while hasFrame(video)%遍历视频frame = imresize(readFrame(video),[480 640]); % 读取当前帧[newPoints,validity,score] = pointTracker(frame); % 获取可疑点oldPoints = oldPoints(validity, :);  % 获取高置信点匹配对newPoints = newPoints(validity, :);  % 获取高置信点匹配对(第一次过滤)%估计几何仿射关系,进一步获取高质量的点匹配对(第二次过滤)[xform, oldPoints, newPoints] = estimateGeometricTransform(oldPoints, newPoints, 'similarity', 'MaxDistance', 4);bboxPoints = transformPointsForward(xform, bboxPoints); %由仿射关系更新bboxPointsbboxPolygon = reshape(bboxPoints', 1, []);% 重构成行向量%显示每一帧trackShow = insertShape(frame,'Polygon',bboxPolygon,'LineWidth',2,'Color','g');trackShow = insertMarker(trackShow,newPoints,'+','Color','w','Size',2);figure(2);imshow(trackShow);title(strcat('NO. ',num2str(n),' Frame..'));drawnow;%新旧轮替oldPoints = newPoints;setPoints(pointTracker, oldPoints);n=n+1;
end

结果演示:

初始:

追踪:

C++:

/****************************************************************/
//作者:Ephemeroptera
//最后修改时间:2018/11/26
//地点:AHU;
//联系qq:605686962
/****************************************************************/
#include <iostream>
#include"opencv2/opencv.hpp"
#include "opencv2/video/tracking.hpp"
#include "dlib/image_processing/frontal_face_detector.h"
#include <dlib/image_processing.h>
#include <dlib/opencv.h>using namespace cv;
using namespace std;int main()
{try{//读取视频VideoCapture capture("eyes.avi");//声明前脸检测器detectordlib::frontal_face_detector faceDetector = dlib::get_frontal_face_detector();//捕获第一帧Mat  firstFrame;capture >> firstFrame;resize(firstFrame, firstFrame, Size(640, 480));//cv to dlibdlib::cv_image<dlib::bgr_pixel> cframe(firstFrame);//检测人脸std::vector<dlib::rectangle> facebbox = faceDetector(cframe);//facebbox格式由dlib转换为cvRect faceRect(facebbox[0].left(), facebbox[0].top(), facebbox[0].width(), facebbox[0].height());//再变换为Mat形式Mat faceROI = (Mat_<double>(4, 2) << faceRect.x, faceRect.y,faceRect.x + faceRect.width, faceRect.y,faceRect.x + faceRect.width, faceRect.y + faceRect.height,faceRect.x, faceRect.y + faceRect.height);faceROI = faceROI.t();//转置//特征点初始化const ushort MAX_COUNT = 300;//特征点数量上限vector<Point2f> initCorners;//初始特征点容器Mat firstGray(firstFrame.size(), CV_8UC1);//灰度化cvtColor(firstFrame, firstGray, CV_RGB2GRAY);//指定ROIMat mask = Mat::zeros(firstGray.size(), CV_8UC1);//mask初始化全为0mask(faceRect).setTo(255);//将非roi区域置为255goodFeaturesToTrack(firstGray, initCorners, MAX_COUNT, 0.01, 10, mask, 3, 3, 0, 0.04);//特征点初步检测//亚像素再次检测Size subPixWinSize(10, 10);TermCriteria termcrit(TermCriteria::COUNT | TermCriteria::EPS, 20, 0.03);//声明迭代属性(最大次数或者极小波动)cornerSubPix(firstGray, initCorners, subPixWinSize, Size(-1, -1), termcrit);//进一步满足亚像素特性筛选//遍历视频int numOfframes = 1;//当前帧数Mat oldFrame;//定义新帧和旧帧Mat newFrame;vector<Point2f> oldCorners;vector<Point2f> newCorners;while (waitKey(30) != 27){++numOfframes;//帧+1//获取每一帧Mat rgbFrame;capture >> rgbFrame;//读取结束跳出if (rgbFrame.empty()){break;}//灰度化Mat grayFrame(rgbFrame.size(), CV_8UC1);cvtColor(rgbFrame, grayFrame, CV_RGB2GRAY);//图像大小归一resize(grayFrame, grayFrame, Size(640, 480));if (numOfframes == 2)//如果遍历开始{oldFrame = firstGray;oldCorners = initCorners;}newFrame = grayFrame;//当前帧为新帧//KLT核心算法vector<uchar> validity;//置信vector<float> err;//有效光流的误差Size winSize(31, 31);//搜索窗大小calcOpticalFlowPyrLK(oldFrame, newFrame, oldCorners, newCorners, validity, err, winSize, 3, termcrit, 0, 0.001);//标记点(遍历所有特征点)int i; int k;for (i = k = 0; i < newCorners.size(); ++i){if (!validity[i])//如果没找到对应点跳转下一个continue;oldCorners[k] = oldCorners[i];newCorners[k++] = newCorners[i];//提取高质量点circle(rgbFrame, newCorners[i], 2, Scalar(0, 255, 0), -1, 8);//标记}oldCorners.resize(k);  //滤除劣质特征点newCorners.resize(k);//预测特诊点的变化Mat transEstimate = estimateRigidTransform(oldCorners, newCorners, 0);//bbox变化Mat bias = Mat::ones(Size(4, 1), CV_64FC1);//添加偏置,(2x4)->(3x4)faceROI.push_back(bias);faceROI = transEstimate * faceROI;//(2x3)*(3x4)->(2x4)//画出bboxPoint2f point0(faceROI.at<double>(0, 0), faceROI.at<double>(1, 0));Point2f point1(faceROI.at<double>(0, 1), faceROI.at<double>(1, 1));Point2f point2(faceROI.at<double>(0, 2), faceROI.at<double>(1, 2));Point2f point3(faceROI.at<double>(0, 3), faceROI.at<double>(1, 3));line(rgbFrame, point0, point1, Scalar(255, 0, 0),3,16);line(rgbFrame, point1, point2, Scalar(255, 0, 0),3,16);line(rgbFrame, point2, point3, Scalar(255, 0, 0),3,16);line(rgbFrame, point3, point0, Scalar(255, 0, 0),3,16);imshow("KLT", rgbFrame);//新旧轮替oldFrame = newFrame;oldCorners = newCorners;}}catch (const std::exception& e){cout << "\nexception thrown!" << endl;cout << e.what() << endl;}return 0;
}

结果展示:

分别用MATLAB和opencv实现 :KLT目标追踪相关推荐

  1. 基于opencv的BackgroundSubtractorMOG2目标追踪

    基于opencv的BackgroundSubtractorMOG2目标追踪 BackgroundSubtractorMOG2是以高斯混合模型为基础的背景/前景分割算法.它是以2004年和2006年Z. ...

  2. python机器识别追踪_多目标追踪器:用OpenCV实现多目标追踪(C++/Python)

    原标题:多目标追踪器:用OpenCV实现多目标追踪(C++/Python) MultiTracker : Multiple Object Tracking using OpenCV (C++/Pyth ...

  3. Opencv之多目标追踪(基于Dlib库)

    Dlib介绍 Dlib是一个包含机器学习算法的C++开源工具包.Dlib可以帮助您创建很多复杂的机器学习方面的软件来帮助解决实际问题.目前Dlib已经被广泛的用在行业和学术领域,包括机器人,嵌入式设备 ...

  4. 干货 | OpenCV中KLT光流跟踪原理详解与代码演示

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 稀疏光流跟踪(KLT)详解 在视频移动 ...

  5. 目标跟踪(1)基于OpenCV实现单目标跟踪

    在本教程中,我们将学习使用OpenCV跟踪对象.OpenCV 3.0开始引入跟踪API.我们将学习如何和何时使用OpenCV 4.2中可用的8种不同的跟踪器- BOOSTING, MIL, KCF, ...

  6. 经验之谈,关于HOG调参:对matlab和opencv作对比

    笔者曾经做过一个项目,后期是把matlab转化为opencv,在此过程中,遇到的比较大的问题是HOG特征的提取问题,由于两个不用语言写的函数其输入参数的格式和编程思想有较多不同,在调试过程中花费了较多 ...

  7. 相机标定参数Matlab转OpenCV格式脚本程序

    注意事项: OpenCV中畸变参数的排列顺序为 [ k 1 , k 2 , p 1 , p 2 , k 3 , ⋯ ] [k_1,k_2,p_1,p_2,k_3,\cdots] [k1​,k2​,p1 ...

  8. 用C++ 和OpenCV 实现视频目标检测(YOLOv4模型)

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 据说,现在很多小区都上线了AI抓拍高空抛物的黑科技,可以自动分析抛物 ...

  9. python opencv模板匹配多目标_基于opencv的多目标模板匹配

    利用opencv进行多目标模板匹配,只要是利用其matchTemplate函数,但在多目标(这里是讨论目标图片中不同大小模板的匹配),以下贴出代码和图片,供大家参考: #include #includ ...

最新文章

  1. 北大元培系AI公司,一年狂揽三轮融资,最新A轮斩获数千万美元
  2. Django打造在线教育平台_day_4: 找回密码
  3. Django-Json 数据返回
  4. PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量
  5. chrome postman插件_一款 Postman 的开源替代品: Postwoman
  6. php monolith,单体架构(Monolith)与微服务架构(MicroService)
  7. Oracle 11.2.0.4.0 Dataguard部署和日常维护(7) - Dataguard Flashback篇
  8. 如何在PS中去除图片文字?两种简单方法轻松搞定!
  9. CENTOS6 安装和使用PHP全链路追踪 Molten
  10. 联合索引的最左匹配原则的成因
  11. Python+Django+sqlite3实现基于内容的音乐推荐系统
  12. 我去图书馆微信公众号抢座【Python版本】
  13. 第14课:Spark 分布式模型训练及调优(实战)
  14. url怎么隐藏html后缀,url 去掉.HTML 后缀 zencart
  15. 大话设计模式——饕餮盛宴
  16. com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method XXX in the service
  17. Camunda撤回流程操作
  18. 烧写APM板的bootloader
  19. numpy——.npy和.npz文件
  20. uniGUI之UniEdit

热门文章

  1. 基于小波变换的信号分离
  2. Windows系统软件
  3. python使用异步下载高清大图
  4. 游戏开发中网络通讯协议对比
  5. 【OSChina-MoPaaS应用开发大赛】报纸订购系统 --- 新界面
  6. html声明charset=“utf-8“后,浏览器访问中文依旧乱码的问题解决(绝对有效)
  7. java毕业设计医护人员排班系统Mybatis+系统+数据库+调试部署
  8. [electron 工具] 使用 electron、vue 和 nodejs 做一个网件路由器 SOAP API 测试工具之一 ( 简介 )...
  9. 基于TI-RTOS的CC2650DK开发(7)---软件中断
  10. 面向5G行业应用的OpenUPF及关键技术