OpenCV —— 跟蹤與運動

來源:互聯網
上載者:User

標籤:style   blog   color   width   資料   art   

理解物體運動主要包含兩個部分:識別和建模

識別在視頻流後續的幀中找出之前某幀鎮南關的感興趣物體

 

尋找角點

可跟蹤的特徵點都稱為角點,從直觀上講,角點(而非邊緣)是一類含有足夠資訊且能從當前幀和下一幀中都能提取出來的點

Harris 角點位於映像二階導數的自相關矩陣有兩個最大特徵值的地方,這在本質上表示以此點為中心周圍存在至少兩個不同方向的紋理,正如實際的角點是由至少兩個邊緣相交於一點而產生

cvGoodFeaturesToTrack 採用Shi 和Tomasi提出的方法,先計算二階導數,在計算特徵值,返回滿足易於跟蹤的定義的一系列點(角點數組)

void cvGoodFeaturesToTrack(

const CvArrr* image,   8為或32位單通道映像

CvArr* eigImage,   每個元素包含了輸入映像中對應點的最小特徵值

CvArr* tempImage,   臨時變數

CvPoint2D32f* corners,   輸出

int * corner_count,   可以返回的最大角點數目

double quality_level,   認為是角點的可接受的最小特徵值,不應超過1

double min_distance,  剔除距離較近的角點

const CvArr* mask = NULL,

int block_size=3,

int use_harris=0,

double k=0.4

);

亞像素級角點

cvFindCornerSubPix 用於發現亞像素精度的角點位置

實際計算亞像素級的角點位置時,解的是一個點積的運算式為0的方程組,其中每一個方程都是由q鄰域的一個點產生。

搜尋視窗的中心是整數座標值的角點並從中心點在每個方向上擴充視窗尺寸指定的像素

不變特徵

SIFT 在一點處檢測主要梯度方向,根據這個方向記錄局部梯度長條圖結果,擁有旋轉不變性

 

光流

可以將映像中的每個像素與速度關聯,或者等價地,與表示像素在連續兩幀之間的位移關聯。這樣得到的是稠密光流 —— 每個像素都與速度關聯

稀疏光流的計算需要在被跟蹤之前指定一組點 —— 角點

Lucas – Kanade 方法

LK演算法只需要每個興趣點周圍小視窗的局部資訊,所以它可以應用於稀疏內容。

不足 —— 較大的運動會將點移出這個小視窗

解決 —— 金字塔,跟蹤影像金字塔允許小視窗捕獲較大的運動

演算法原理

1,亮度恒定 —— 情境中物體被跟蹤部分的亮度不變

2,時間連續或者運動是“小運動” —— 運動相對於幀率是緩慢的

3,空間一致 —— 相鄰的店保持相鄰

 

在影像金字塔的最高層計算光流,用得到的運動估計結果作為下一層金字塔的起始點,重複這個過程直到到達金字塔的最底層,這樣就將不滿足運動假設的可能性降到最小。

cvCalcOpticalFlowLK —— 非金字塔的LK稠密光流演算法

cvCalcOpticalFlowPyrLK —— 金字塔的LK代碼

  影像金字塔的計算量較大,計算得到的映像對的後面一幀被作為下次計算的映像對的初始幀

#include <cv.h>#include <cxcore.h>#include <highgui.h>const int MAX_CORNERS=500;int main(int argc,char** argv){    IplImage* imgA=cvLoadImage("image0.jpg",CV_LOAD_IMAGE_GRAYSCALE);    IplImage* imgB=cvLoadImage("image1.jpg",CV_LOAD_IMAGE_GRAYSCALE);    CvSize img_sz=cvGetSize(imgA);    int win_size=10;    IplImage* imgC=cvLoadImage("",CV_LOAD_IMAGE_UNCHANGED);    // get the features    IplImage* eig_image=cvCreateImage(img_sz,IPL_DEPTH_32F,1);    IplImage* tmp_image=cvCreateImage(img_sz,IPL_DEPTH_32F,1);    int corner_count=MAX_CORNERS;    CvPoint2D32f* cornersA=new CvPoint2D32f[MAX_CORNERS];    cvGoodFeaturesToTrack(        imgA,        eig_image,        tmp_image,        cornersA,        &corner_count,        0.01,        5.0,        0,        3,        0,        0.04);    cvFindCornerSubPix(        imgA,        cornersA,        corner_count,        cvSize(win_size,win_size),        cvSize(-1,-1),        cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03);        );        // LK                char features_found[MAX_CORNERS];        float fearture_errors[MAX_CORNERS];                CvSize pyr_sz=cvSize(imgA->width+8,imgB->height/3);                IplImage* pyrA=cvCreateImage(pyr_sz,IPL_DEPTH_32F,1);        IplImage* pyrB=cvCreateImage(pyr_sz,IPL_DEPTH_32F,1);        CvPoint2D32f* cornersB=new CvPoint2D32f[MAX_CORNERS];        cvCalcOpticalFlowPyrLK(            imgA,            imgB,            pyrA,            pyrB,            cornersA,            cornersB,            corner_count,            cvSize(win_size,win_size),            5,            features_found,            fearture_errors,            cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.3),            0            );        // 結果顯示        for (int i=0;i<corner_count;i++)        {            if (features_found[i]==0||fearture_errors[i]>550)            {                printf("Error is %f\n",fearture_errors[i]);                continue;            }            printf("Got it\n");            CvPoint  p0=cvPoint(cvRound(cornersA[i].x),cvRound(cornersA[i].y));            cvPoint p1=cvPoint(cvRound(cornersB[i].x),cvRound(cornersB[i].y));            cvLine(imgC,p0,p1,CV_RGB(255,0,0),2);        }}

稠密跟蹤方法

亮度恒定假設,速度的平滑約束 (通過對光流速度分量的二階導數進行規則化獲得)

與LK演算法一樣,HornSchunck方法也要通過迭代來解微分方程

cvCalcOpticalFlowHS

mean – shift

在一組資料的密度分布中尋找局部極值的穩定的方法

mean – shift 等價於先對連續分布用 mean-shift核進行卷積,然後再應用爬山演算法

cvMeanShift

反向投影圖 —— 機率密度圖,用輸入映像的某一位置上像素值對應長條圖bin上的值來代替該像素值

 

Camshift 搜尋視窗會自我調整尺寸

cvCamShift

運動模板

可應用於姿態識別

運動模板需要知道物體的輪廓

運動曆史映像

OpenCV 中完成運動模板構建的函數是 cvUpdateMotionHistory

一旦運動模板記錄了不同時間的物體輪廓,就可以用計算運動模板映像的梯度來擷取全域運動資訊

cvCalcMotionGradient 計算梯度 (輸入有允許的最小和最大的梯度值)

cvCalcGlobalOrientation 計算有效梯度方向向量和來擷取全域運動方向

cvSegmentMotion 分割和計算局部運動

預估器

預測階段 —— 用從過去得到的資訊進一步修正模型以取得下一個將會出現的位置

矯正階段 —— 獲得一個測量,然後與基於前一次測量的預期值進行調整

Kalman 濾波器

若有一組強而合理的假設,給出系統的曆史測量值,則可以建立最大化這些早前測量值的後驗機率的系統狀態模型

假設:1,被建模的系統是線性;2,影響測量的雜訊屬於白色雜訊;3,雜訊本質上是高斯分布的

額,這個內容挺多的,應該專門看一下

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.