OpenCV LK光流法测试
OpenCV版本: 3.2.0
例程文件目录/samples/cpp/lkdemo.cpp
原始程序是采集相机数据,台式机没有摄像头,用Euroc测试集,偷ORB_SLAM2 /Examples/Monocular/mono_euroc.cc里的LoadImages函数读取数据
在cpp目录下新建一个自己的目录mylk,拷贝lkdemo和example_cmake目录下的CMakeLists.txt并修改:
add_executable(lk_example lkdemo.cpp)
target_link_libraries(lk_example ${OpenCV_LIBS})
新建目录build,进入后cmake .. + make 编译运行即可。run.sh如下:
./lkdemo ~/slamData/EuRoC/mav02/cam0/data ~/ORB_SLAM2/Examples/Stereo/EuRoC_TimeStamps/MH02.txt
先提取角点,亚像素精度提炼角点,光流跟踪。


运行过程中会监控鼠标和键盘:
按下鼠标左键 -> 添加一个角点
按下r -> 初始化角点
按下c -> 清除角点
按下n -> 只显示角点(右图)
按下esc -> 退出
修改后的程序:
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp" #include <iostream>
#include <ctype.h>
#include <fstream>
#include <algorithm>
using namespace std; using namespace cv;
void LoadImages(const string &strImagePath, const string &strPathTimes,
vector<string> &vstrImages, vector<double> &vTimeStamps)
{
ifstream fTimes;
fTimes.open(strPathTimes.c_str());
vTimeStamps.reserve();
vstrImages.reserve();
while(!fTimes.eof())
{
string s;
getline(fTimes,s);
if(!s.empty())
{
stringstream ss;
ss << s;
vstrImages.push_back(strImagePath + "/" + ss.str() + ".png");
double t;
ss >> t;
vTimeStamps.push_back(t/1e9); }
}
}
static void help()
{
// print a welcome message, and the OpenCV version
cout << "\nThis is a demo of Lukas-Kanade optical flow lkdemo(),\n"
"Using OpenCV version " << CV_VERSION << endl;
cout << "\nIt uses camera by default, but you can provide a path to video as an argument.\n";
cout << "\nHot keys: \n"
"\tESC - quit the program\n"
"\tr - auto-initialize tracking\n"
"\tc - delete all the points\n"
"\tn - switch the \"night\" mode on/off\n"
"To add/remove a feature point click it\n" << endl;
} Point2f point;
bool addRemovePt = false; static void onMouse( int event, int x, int y, int /*flags*/, void* /*param*/ )
{
if( event == EVENT_LBUTTONDOWN )
{
point = Point2f((float)x, (float)y);
addRemovePt = true;
}
} int main( int argc, char** argv )
{
VideoCapture cap;
TermCriteria termcrit(TermCriteria::COUNT|TermCriteria::EPS,,0.03);
Size subPixWinSize(,), winSize(,); const int MAX_COUNT = ;
bool needToInit = false;
bool nightMode = false; namedWindow( "LK Demo", );
setMouseCallback( "LK Demo", onMouse, ); Mat gray, prevGray, image, frame;
vector<Point2f> points[]; vector<string> vstrImageFilenames;
vector<double> vstrstamps;
LoadImages(string(argv[]), string(argv[]), vstrImageFilenames, vstrstamps);
for(int i=;i<vstrImageFilenames.size();i++)
{ image = imread(vstrImageFilenames[i],IMREAD_COLOR);
cvtColor(image, gray, COLOR_BGR2GRAY); if( nightMode )
image = Scalar::all(); if( needToInit )
{
// automatic initialization
goodFeaturesToTrack(gray, points[], MAX_COUNT, 0.01, , Mat(), , , 0.04);
cornerSubPix(gray, points[], subPixWinSize, Size(-,-), termcrit);
addRemovePt = false;
}
else if( !points[].empty() )
{
vector<uchar> status;
vector<float> err;
if(prevGray.empty())
gray.copyTo(prevGray);
calcOpticalFlowPyrLK(prevGray, gray, points[], points[], status, err, winSize,
, termcrit, , 0.001);
size_t i, k;
for( i = k = ; i < points[].size(); i++ )
{
if( addRemovePt )
{
if( norm(point - points[][i]) <= )
{
addRemovePt = false;
continue;
}
} if( !status[i] )
continue; points[][k++] = points[][i];
circle( image, points[][i], , Scalar(,,), -, );
}
points[].resize(k);
} if( addRemovePt && points[].size() < (size_t)MAX_COUNT )
{
vector<Point2f> tmp;
tmp.push_back(point);
cornerSubPix( gray, tmp, winSize, Size(-,-), termcrit);
points[].push_back(tmp[]);
addRemovePt = false;
} needToInit = false;
imshow("LK Demo", image); char c = (char)waitKey();
if( c == )
break;
switch( c )
{
case 'r':
needToInit = true;
break;
case 'c':
points[].clear();
points[].clear();
break;
case 'n':
nightMode = !nightMode;
break;
} std::swap(points[], points[]);
cv::swap(prevGray, gray);
} return ;
}
OpenCV LK光流法测试的更多相关文章
- OpenCV Using Python——基于SURF特征提取和金字塔LK光流法的单目视觉三维重建 (光流、场景流)
https://blog.csdn.net/shadow_guo/article/details/44312691 基于SURF特征提取和金字塔LK光流法的单目视觉三维重建 1. 单目视觉三维重建问题 ...
- OpenCV 使用光流法检测物体运动
OpenCV 可以使用光流法检测物体运动,贴上代码以及效果. // opticalflow.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" ...
- LK 光流法简介
前言 若假定一个局部区域的像素运动是一致的,则可以用这个新的约束条件替代前文中提到的全局速度平滑约束条件.这种光流算法就叫做 LK 光流法. LK 光流法的推导 首先,需要推导出光流约束方程. 这一步 ...
- 光流法详解之一(LK光流)
Lucas–Kanade光流算法是一种两帧差分的光流估计算法.它由Bruce D. Lucas 和 Takeo Kanade提出 [1]. LK光流法有三个假设条件: 1. 亮度恒定:一个像素点随着时 ...
- 【Matlab】运动目标检测之“光流法”
光流(optical flow) 1950年,Gibson首先提出了光流的概念,所谓光流就是指图像表现运动的速度.物体在运动的时候之所以能被人眼发现,就是因为当物体运动时,会在人的视网膜上形成一系列的 ...
- 【图像处理】openCV光流法追踪运动物体
openCV光流法追踪运动物体 email:chentravelling@163.com 一.光流简单介绍 摘自:zouxy09 光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观 ...
- 目标跟踪之Lukas-Kanade光流法
转载自:http://blog.csdn.net/u014568921/article/details/46638557 光流是图像亮度的运动信息描述.光流法计算最初是由Horn和Schunck于19 ...
- LK光流算法:提高计算精度和增加搜索范围
LK光流算法:提高计算精度和增加搜索范围 关于LK算法的基本理论,见:http://www.cnblogs.com/dzyBK/p/4960630.html 这里主要阐述如何提高LK算法的计算精度和在 ...
- 目标跟踪之Lukas-Kanade光流法(转)
光流是图像亮度的运动信息描述.光流法计算最初是由Horn和Schunck于1981年提出的,创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法.光流计算基于物体移动的光学特性提 ...
随机推荐
- Web Deploy远程部署配置图解
原文链接:https://jingyan.baidu.com/album/642c9d34e614de644a46f783.html
- ios中输入法把 内容顶起后 内容下不来问题
之前是做一个日期选择的功能,引入了一个选择日期的插件,当input框获得焦点时,弹出日期选择框,但是,输入法页弹出来了,把选择日期的插件顶的老高了,很丑,于是我在网上查了个方法不让输入法弹出来,就是在 ...
- java 集合(三)List接口
package cn.sasa.demo1; import java.util.ArrayList; import java.util.LinkedList; import java.util.Lis ...
- Redis分布式锁服务(转)
原文:http://www.cnblogs.com/mushroom/p/4752499.html 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj ...
- es手动创建索引,修改索引,删除索引
1.创建索引 创建索引的语法PUT /my_index{ "settings": { ... any settings ... }, "mappings": { ...
- 手动建立mapping以及增加属性
只能创建index时手动建立mapping,或者新增field mapping,但是不能update field mapping 1.手动建立mappingPUT /website{ "ma ...
- oracle中并行执行不一定比串行执行快
并行执行与串行执行相比,能否缩短执行时间,取决于如下几个方面:1.待执行的目标SQL是否适合并行执行,有些SQL是不太适合并行执行的,比如走索引的嵌套循环连接.2.数据库服务器上的硬件资源(如CPU. ...
- pip批量安装和卸载package
创建文件 将要安装或卸载的包按指定格式保存到文件中,这里以 packages.txt 为例,格式如下: Flask_Script==2.0.6 alembic==1.0.5 SQLAlchemy==1 ...
- 静态文件link 数据库迁移命令 新建app命令
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"& ...
- 【Java】-NO.16.EBook.4.Java.1.004-【疯狂Java讲义第3版 李刚】- 内部类
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.004-[疯狂Java讲义第3版 李刚]- 内部类 Style:EBook Series:Java S ...