1. 程式人生 > >opencv3光流法的使用

opencv3光流法的使用

#include <iostream>  
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp>  // Gaussian Blur
#include <opencv2/ml/ml.hpp>


using namespace cv;
using namespace std;


void duan_OpticalFlow(Mat &frame, Mat & result);
bool
addNewPoints(); bool acceptTrackedPoint(int i); Mat curgray; // 當前圖片 Mat pregray; // 預測圖片 vector<Point2f> point[2]; // point0為特徵點的原來位置,point1為特徵點的新位置 vector<Point2f> initPoint; // 初始化跟蹤點的位置 vector<Point2f> features; // 檢測的特徵 int maxCount = 500; // 檢測的最大特徵數 double qLevel = 0.01
; // 特徵檢測的等級 double minDist = 10.0; // 兩特徵點之間的最小距離 vector<uchar> status; // 跟蹤特徵的狀態,特徵的流發現為1,否則為0 vector<float> err; int main() { Mat matSrc; Mat matRst; VideoCapture cap(0); //int totalFrameNumber = cap.get(CV_CAP_PROP_FRAME_COUNT); // perform the tracking process printf
("Start the tracking process, press ESC to quit.\n"); while(cap.isOpened()) { // get frame from the video cap >> matSrc; if (!matSrc.empty()) { duan_OpticalFlow(matSrc, matRst); } else { cout << "Error : Get picture is empty!" << endl; } if (waitKey(1) == 27) break; } waitKey(0); return 0; } void duan_OpticalFlow(Mat &frame, Mat & result) { cvtColor(frame, curgray, CV_BGR2GRAY); frame.copyTo(result); if (addNewPoints()) { goodFeaturesToTrack(curgray, features, maxCount, qLevel, minDist); point[0].insert(point[0].end(), features.begin(), features.end()); initPoint.insert(initPoint.end(), features.begin(), features.end()); } if (pregray.empty()) { curgray.copyTo(pregray); } calcOpticalFlowPyrLK(pregray, curgray, point[0], point[1], status, err); int k = 0; for (size_t i = 0; i<point[1].size(); i++) { if (acceptTrackedPoint(i)) { initPoint[k] = initPoint[i]; point[1][k++] = point[1][i]; } } point[1].resize(k); initPoint.resize(k); for (size_t i = 0; i<point[1].size(); i++) { line(result, initPoint[i], point[1][i], Scalar(0, 0, 255)); circle(result, point[1][i], 3, Scalar(0, 255, 0), -1); } swap(point[1], point[0]); swap(pregray, curgray); imshow("Optical Flow Demo", result); //waitKey(50); } bool addNewPoints() { return point[0].size() <= 10; } bool acceptTrackedPoint(int i) { return status[i] && ((abs(point[0][i].x - point[1][i].x) + abs(point[0][i].y - point[1][i].y)) > 2);//檢測是否為移動點 }

相關推薦

opencv3的使用

#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highg

opencv3.10和前景提取法

//bgfg_segm.h #ifndef BGFG_SEGM_H #define BGFG_SEGM_H #include "opencv2/core.hpp" #include "opencv2/core/utility.hpp" using namespace

【圖像處理】openCV追蹤運動物體

num blank ndis water 不同 h+ width 相關性 ida openCV光流法追蹤運動物體 email:[email protected]/* */ 一、光流簡單介紹 摘自:zouxy09 光流的概念是G

的理解

光流法是比較經典的運動估計方法,本文不僅敘述簡單明瞭,而且附程式碼,故收藏. 在空間中,運動可以用運動場描述。而在一個影象平面上,物體的運動往往是通過影象序列中不同圖象灰度分佈的不同體現的。從而,空間中的運動場轉移到影象上就表示為光流場,光流場反映了影象上每一點灰度的變化趨勢。

入門基礎

本文參考了https://blog.csdn.net/zouxy09/article/details/8683859 光流的概念:它是空間運動物體在觀察成像平面上的畫素運動的瞬時速度,是利用影象序列中畫素在時間域上的變化以及相鄰幀之間的相關性來找到上一幀跟當前幀之間存在的對應關係,從而計算出相鄰幀

opencv對特定區域進行跟蹤

本例子使用了opencv3.0,利用滑鼠選擇矩形框,然後對選擇的區域進行跟蹤 //---------------------------------光流法對特定區域進行跟蹤----------------- #include <iostream> #include <o

OpenCV中跟蹤器的使用方法學習

一、基於特徵點的目標跟蹤的一般步驟 (1)探測當前幀的特徵點 (2)通過當前幀和下一幀的灰度比較,估計當前幀特徵點在下一幀的位置 (3)過濾位置不變的特徵點,餘下的點就是目標了 基於特徵點的目標跟蹤演算法和1,2兩個步驟有關,特徵點可以是Harris角點,也可以是邊緣點等等,第二步估

影象處理之---

LK光流演算法公式詳解: 由於工程需要用到 Lucas-Kanade 光流,在此進行一下簡單整理(後續還會陸續整理關於KCF,PCA,SVM,最小二乘、嶺迴歸、核函式、dpm等等): 光流,簡單說也就是畫面移動過程中,影象上每個畫素的x,y位移量,比如第t幀的時候A點的位置是(x1,

Lucas-Kanade 演算法原理以及應用,正向、反向、additive、Compositional

先祭出一片神級總結性的文章:Lucas-Kanade 20 Years On: A Unifying Framework Lucas-Kanade 演算法原理以及應用 Lucas-Kanade 演算法原理以及應用 一 演算法原理 1

學習

光流估計就是指利用時間上相鄰的兩幀影象,得到點的運動。滿足以下幾點假設: 前後兩幀點的位移不大(泰勒展開) 外界光強保持恆定。 空間相關性,每個點的運動和他們的鄰居相似(連續函式,泰勒展開) 在相鄰的兩幀影象中,點(x,y)發生了位移(u,v),那麼移動前後兩點的亮度應該是相等的。如下:

【OpenCV筆記】之金字塔Lucas-Kanade

本文參考連結:https://blog.csdn.net/zy122121cs/article/details/44955353 參考論文:”Pyramidal Implementation of the Lucas Kanade Feature TrackerDescrip

(Optical Flow)及OpenCV實現

Optical Flow Optical flow 有兩個假設: 亮度恆定:在相鄰連續兩幀中一個目標的畫素強度不會變化。 空間一致性:周圍畫素有類似執行。 時間規律:相鄰幀時間足夠短,以至於在考慮執行變化時可以忽略它們之間的差異。 假設在第一幀中畫素

目標跟蹤之LK

簡介   光流是一種簡單實用的影象運動的表達方式,通常定義為一個影象序列中的影象亮度模式的表觀運動,即空間物體表面上的點的運動速度在視覺感測器的成像平面上的表達。----百度百科 光流法的前提假設: (1)相鄰幀之間的亮度恆定 (2)相鄰視訊幀的取幀時間連續,或者,相

OpenCV學習筆記(二十六)——小試SVM演算法ml OpenCV學習筆記(二十七)——基於級聯分類器的目標檢測objdect OpenCV學習筆記(二十八)——對運動目標跟蹤Video Ope

OpenCV學習筆記(二十六)——小試SVM演算法ml  總感覺自己停留在碼農的初級階段,要想更上一層,就得靜下心來,好好研究一下演算法的東西。OpenCV作為一個計算機視覺的開源庫,肯定不會只停留在數字影象處理的初級階段,我也得加油,深入研究它的演算法庫。就從ml入手

【影象處理】openCV追蹤運動物體

openCV光流法追蹤運動物體 email:[email protected] 一、光流簡介         光流的概念是Gibson在1950年首先提出來的。它是空間運動物體在觀察成像平面上的畫素運動的瞬時速度,是利用影象序列中畫素在時間域上的變化以及相鄰幀之

-運動目標的檢測(opencv學習)

        cvCalcOpticalFlowPyrLK 函式在使用時,首先要確定特徵點,也就是目標舊的位置。         本程式通過使用cvGoodFeaturesToTrack 函式選擇角點作為特徵點。         本程式只是一個簡單的運動檢測,在具體應用過程中,可以根據自己的需要修正 #i

學習--optical flow

學習背景: 為了更好地去理解Sift_flow的提出背景,廢話不多說,步入正題。 《學習openCV》一書,把它放在第10章跟蹤與運動,想必定和跟蹤問題有關了,腦子裡可以大概過一下跟蹤方面的問題,,自己過吧,略。 http://blog.csdn.net/carson200

OpenCv_運動目標檢測

以下內容摘自一篇碩士論文《視訊序列中運動目標檢測與跟蹤演算法的研究》: 1950年Gibson首先提出了光流的概念,光流(optical flow)法是空間運動物體在觀測成像面上的畫素運動的瞬時速度。物體在運動的時候,它在影象上對應點的亮度模式也在做相應的運

目標檢測(三):opencv下Farneback

上節說到過的calcOpticalFlowPyrLK光流演算法,可以看到它實際上是一種稀疏特徵點的光流演算法,也就是說我們先找到那些(特徵)點需要進行處理,然後再處理,該節介紹下一個全域性性的密集光流演算法,也就是對每一個點都進行光流計算,函式為calcOpti

目標檢測(二):opencv下的L-K演算法

後續將簡單介紹光流法的一些簡單實現包,包括opencv下的光流演算法與matlab下的光流演算法。該節主要介紹opencv下的光流實現。 Opencv的光流實現由好幾個方法可以(也就是說有好幾個函式可以用),每個函式當然也對應著不同的原理,那麼它的效果以及演算