日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于MeanShift的目标跟踪算法及实现

發布時間:2025/7/25 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于MeanShift的目标跟踪算法及实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

from: http://blog.csdn.net/jinshengtao/article/details/30258833

一、簡介

???? 首先扯扯無參密度估計理論,無參密度估計也叫做非參數估計,屬于數理統計的一個分支,和參數密度估計共同構成了概率密度估計方法。參數密度估計方法要求特征空間服從一個已知的概率密度函數,在實際的應用中這個條件很難達到。而無參數密度估計方法對先驗知識要求最少,完全依靠訓練數據進行估計,并且可以用于任意形狀的密度估計。所以依靠無參密度估計方法,即不事先規定概率密度函數的結構形式,在某一連續點處的密度函數值可由該點鄰域中的若干樣本點估計得出。常用的無參密度估計方法有:直方圖法、最近鄰域法和核密度估計法。

???? MeanShift算法正是屬于核密度估計法,它不需要任何先驗知識而完全依靠特征空間中樣本點的計算其密度函數值。對于一組采樣數據,直方圖法通常把數據的值域分成若干相等的區間,數據按區間分成若干組,每組數據的個數與總參數個數的比率就是每個單元的概率值;核密度估計法的原理相似于直方圖法,只是多了一個用于平滑數據的核函數。采用核函數估計法,在采樣充分的情況下,能夠漸進地收斂于任意的密度函數,即可以對服從任何分布的數據進行密度估計。

???? 然后談談MeanShift的基本思想及物理含義:

??? 此外,從公式1中可以看到,只要是落入Sh的采樣點,無論其離中心x的遠近,對最終的Mh(x)計算的貢獻是一樣的。然而在現實跟蹤過程中,當跟蹤目標出現遮擋等影響時,由于外層的像素值容易受遮擋或背景的影響,所以目標模型中心附近的像素比靠外的像素更可靠。因此,對于所有采樣點,每個樣本點的重要性應該是不同的,離中心點越遠,其權值應該越小。故引入核函數和權重系數來提高跟蹤算法的魯棒性并增加搜索跟蹤能力。

??????接下來,談談核函數:

??? 核函數也叫窗口函數,在核估計中起到平滑的作用。常用的核函數有:Uniform,Epannechnikov,Gaussian等。本文算法只用到了Epannechnikov,它數序定義如下:

二、基于MeanShift的目標跟蹤算法

???? 基于均值漂移的目標跟蹤算法通過分別計算目標區域和候選區域內像素的特征值概率得到關于目標模型和候選模型的描述,然后利用相似函數度量初始幀目標模型和當前幀的候選模版的相似性,選擇使相似函數最大的候選模型并得到關于目標模型的Meanshift向量,這個向量正是目標由初始位置向正確位置移動的向量。由于均值漂移算法的快速收斂性,通過不斷迭代計算Meanshift向量,算法最終將收斂到目標的真實位置,達到跟蹤的目的。

???? 下面通過圖示直觀的說明MeanShift跟蹤算法的基本原理。如下圖所示:目標跟蹤開始于數據點xi0(空心圓點xi0,xi1,…,xiN表示的是中心點,上標表示的是的迭代次數,周圍的黑色圓點表示不斷移動中的窗口樣本點,虛線圓圈代表的是密度估計窗口的大小)。箭頭表示樣本點相對于核函數中心點的漂移向量,平均的漂移向量會指向樣本點最密集的方向,也就是梯度方向。因為 Meanshift 算法是收斂的,因此在當前幀中通過反復迭代搜索特征空間中樣本點最密集的區域,搜索點沿著樣本點密度增加的方向“漂移”到局部密度極大點點xiN,也就是被認為的目標位置,從而達到跟蹤的目的,MeanShift 跟蹤過程結束。

?

?

運動目標的實現過程【具體算法】:

?

三、代碼實現

說明:

1.?????? RGB顏色空間刨分,采用16*16*16的直方圖

2.?????? 目標模型和候選模型的概率密度計算公式參照上文

3.?????? OpenCV版本運行:按P停止,截取目標,再按P,進行單目標跟蹤

4.?????? Matlab版本,將視頻改為圖片序列,第一幀停止,手工標定目標,雙擊目標區域,進行單目標跟蹤。

?

matlab版本:

?

[plain] view plaincopy
  • function?[]?=?select()??
  • close?all;??
  • clear?all;??
  • %%%%%%%%%%%%%%%%%%根據一幅目標全可見的圖像圈定跟蹤目標%%%%%%%%%%%%%%%%%%%%%%%??
  • I=imread('result72.jpg');??
  • figure(1);??
  • imshow(I);??
  • ??
  • ??
  • [temp,rect]=imcrop(I);??
  • [a,b,c]=size(temp);?????????%a:row,b:col??
  • ??
  • ??
  • %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%計算目標圖像的權值矩陣%%%%%%%%%%%%%%%%%%%%%%%??
  • y(1)=a/2;??
  • y(2)=b/2;??
  • tic_x=rect(1)+rect(3)/2;??
  • tic_y=rect(2)+rect(4)/2;??
  • m_wei=zeros(a,b);%權值矩陣??
  • h=y(1)^2+y(2)^2?;%帶寬??
  • ??
  • ??
  • for?i=1:a??
  • ????for?j=1:b??
  • ????????dist=(i-y(1))^2+(j-y(2))^2;??
  • ????????m_wei(i,j)=1-dist/h;?%epanechnikov?profile??
  • ????end??
  • end??
  • C=1/sum(sum(m_wei));%歸一化系數??
  • ??
  • ??
  • %計算目標權值直方圖qu??
  • %hist1=C*wei_hist(temp,m_wei,a,b);%target?model??
  • hist1=zeros(1,4096);??
  • for?i=1:a??
  • ????for?j=1:b??
  • ????????%rgb顏色空間量化為16*16*16?bins??
  • ????????q_r=fix(double(temp(i,j,1))/16);??%fix為趨近0取整函數??
  • ????????q_g=fix(double(temp(i,j,2))/16);??
  • ????????q_b=fix(double(temp(i,j,3))/16);??
  • ????????q_temp=q_r*256+q_g*16+q_b;????????????%設置每個像素點紅色、綠色、藍色分量所占比重??
  • ????????hist1(q_temp+1)=?hist1(q_temp+1)+m_wei(i,j);????%計算直方圖統計中每個像素點占的權重??
  • ????end??
  • end??
  • hist1=hist1*C;??
  • rect(3)=ceil(rect(3));??
  • rect(4)=ceil(rect(4));??
  • ??
  • ??
  • ??
  • ??
  • %%%%%%%%%%%%%%%%%%%%%%%%%讀取序列圖像??
  • myfile=dir('D:\matlab7\work\mean?shift\image\*.jpg');??
  • lengthfile=length(myfile);??
  • ??
  • ??
  • for?l=1:lengthfile??
  • ????Im=imread(myfile(l).name);??
  • ????num=0;??
  • ????Y=[2,2];??
  • ??????
  • ??????
  • ????%%%%%%%mean?shift迭代??
  • ????while((Y(1)^2+Y(2)^2>0.5)&num<20)???%迭代條件??
  • ????????num=num+1;??
  • ????????temp1=imcrop(Im,rect);??
  • ????????%計算侯選區域直方圖??
  • ????????%hist2=C*wei_hist(temp1,m_wei,a,b);%target?candidates?pu??
  • ????????hist2=zeros(1,4096);??
  • ????????for?i=1:a??
  • ????????????for?j=1:b??
  • ????????????????q_r=fix(double(temp1(i,j,1))/16);??
  • ????????????????q_g=fix(double(temp1(i,j,2))/16);??
  • ????????????????q_b=fix(double(temp1(i,j,3))/16);??
  • ????????????????q_temp1(i,j)=q_r*256+q_g*16+q_b;??
  • ????????????????hist2(q_temp1(i,j)+1)=?hist2(q_temp1(i,j)+1)+m_wei(i,j);??
  • ????????????end??
  • ????????end??
  • ????????hist2=hist2*C;??
  • ????????figure(2);??
  • ????????subplot(1,2,1);??
  • ????????plot(hist2);??
  • ????????hold?on;??
  • ??????????
  • ????????w=zeros(1,4096);??
  • ????????for?i=1:4096??
  • ????????????if(hist2(i)~=0)?%不等于??
  • ????????????????w(i)=sqrt(hist1(i)/hist2(i));??
  • ????????????else??
  • ????????????????w(i)=0;??
  • ????????????end??
  • ????????end??
  • ??????????
  • ??????????
  • ??????????
  • ????????%變量初始化??
  • ????????sum_w=0;??
  • ????????xw=[0,0];??
  • ????????for?i=1:a;??
  • ????????????for?j=1:b??
  • ????????????????sum_w=sum_w+w(uint32(q_temp1(i,j))+1);??
  • ????????????????xw=xw+w(uint32(q_temp1(i,j))+1)*[i-y(1)-0.5,j-y(2)-0.5];??
  • ????????????end??
  • ????????end??
  • ????????Y=xw/sum_w;??
  • ????????%中心點位置更新??
  • ????????rect(1)=rect(1)+Y(2);??
  • ????????rect(2)=rect(2)+Y(1);??
  • ????end??
  • ??????
  • ??????
  • ????%%%跟蹤軌跡矩陣%%%??
  • ????tic_x=[tic_x;rect(1)+rect(3)/2];??
  • ????tic_y=[tic_y;rect(2)+rect(4)/2];??
  • ??????
  • ????v1=rect(1);??
  • ????v2=rect(2);??
  • ????v3=rect(3);??
  • ????v4=rect(4);??
  • ????%%%顯示跟蹤結果%%%??
  • ????subplot(1,2,2);??
  • ????imshow(uint8(Im));??
  • ????title('目標跟蹤結果及其運動軌跡');??
  • ????hold?on;??
  • ????plot([v1,v1+v3],[v2,v2],[v1,v1],[v2,v2+v4],[v1,v1+v3],[v2+v4,v2+v4],[v1+v3,v1+v3],[v2,v2+v4],'LineWidth',2,'Color','r');??
  • ????plot(tic_x,tic_y,'LineWidth',2,'Color','b');??
  • ??????
  • ??????
  • end??

  • ?運行結果:

    ?

    ?

    ?

    opencv版本:

    [cpp] view plaincopy
  • #include?"stdafx.h"??
  • #include?"cv.h"??
  • #include?"highgui.h"??
  • #define??u_char?unsigned?char??
  • #define??DIST?0.5??
  • #define??NUM?20??
  • ??
  • //全局變量??
  • bool?pause?=?false;??
  • bool?is_tracking?=?false;??
  • CvRect?drawing_box;??
  • IplImage?*current;??
  • double?*hist1,?*hist2;??
  • double?*m_wei;??????????????????????????????????????????????????????????????????//權值矩陣??
  • double?C?=?0.0;????????????????????????????????????????????????????????????????//歸一化系數??
  • ??
  • void?init_target(double?*hist1,?double?*m_wei,?IplImage?*current)??
  • {??
  • ????IplImage?*pic_hist?=?0;??
  • ????int?t_h,?t_w,?t_x,?t_y;??
  • ????double?h,?dist;??
  • ????int?i,?j;??
  • ????int?q_r,?q_g,?q_b,?q_temp;??
  • ??????
  • ????t_h?=?drawing_box.height;??
  • ????t_w?=?drawing_box.width;??
  • ????t_x?=?drawing_box.x;??
  • ????t_y?=?drawing_box.y;??
  • ??
  • ????h?=?pow(((double)t_w)/2,2)?+?pow(((double)t_h)/2,2);????????????//帶寬??
  • ????pic_hist?=?cvCreateImage(cvSize(300,200),IPL_DEPTH_8U,3);?????//生成直方圖圖像??
  • ??
  • ????//初始化權值矩陣和目標直方圖??
  • ????for?(i?=?0;i?<?t_w*t_h;i++)??
  • ????{??
  • ????????m_wei[i]?=?0.0;??
  • ????}??
  • ??
  • ????for?(i=0;i<4096;i++)??
  • ????{??
  • ????????hist1[i]?=?0.0;??
  • ????}??
  • ??
  • ????for?(i?=?0;i?<?t_h;?i++)??
  • ????{??
  • ????????for?(j?=?0;j?<?t_w;?j++)??
  • ????????{??
  • ????????????dist?=?pow(i?-?(double)t_h/2,2)?+?pow(j?-?(double)t_w/2,2);??
  • ????????????m_wei[i?*?t_w?+?j]?=?1?-?dist?/?h;???
  • ????????????//printf("%f\n",m_wei[i?*?t_w?+?j]);??
  • ????????????C?+=?m_wei[i?*?t_w?+?j]?;??
  • ????????}??
  • ????}??
  • ??
  • ????//計算目標權值直方??
  • ????for?(i?=?t_y;i?<?t_y?+?t_h;?i++)??
  • ????{??
  • ????????for?(j?=?t_x;j?<?t_x?+?t_w;?j++)??
  • ????????{??
  • ????????????//rgb顏色空間量化為16*16*16?bins??
  • ????????????q_r?=?((u_char)current->imageData[i?*?current->widthStep?+?j?*?3?+?2])?/?16;??
  • ????????????q_g?=?((u_char)current->imageData[i?*?current->widthStep?+?j?*?3?+?1])?/?16;??
  • ????????????q_b?=?((u_char)current->imageData[i?*?current->widthStep?+?j?*?3?+?0])?/?16;??
  • ????????????q_temp?=?q_r?*?256?+?q_g?*?16?+?q_b;??
  • ????????????hist1[q_temp]?=??hist1[q_temp]?+??m_wei[(i?-?t_y)?*?t_w?+?(j?-?t_x)]?;??
  • ????????}??
  • ????}??
  • ??
  • ????//歸一化直方圖??
  • ????for?(i=0;i<4096;i++)??
  • ????{??
  • ????????hist1[i]?=?hist1[i]?/?C;??
  • ????????//printf("%f\n",hist1[i]);??
  • ????}??
  • ??
  • ????//生成目標直方圖??
  • ????double?temp_max=0.0;??
  • ??
  • ????for?(i?=?0;i?<?4096;i++)?????????//求直方圖最大值,為了歸一化??
  • ????{??
  • ????????//printf("%f\n",val_hist[i]);??
  • ????????if?(temp_max?<?hist1[i])??
  • ????????{??
  • ????????????temp_max?=?hist1[i];??
  • ????????}??
  • ????}??
  • ????//畫直方圖??
  • ????CvPoint?p1,p2;??
  • ????double?bin_width=(double)pic_hist->width/4096;??
  • ????double?bin_unith=(double)pic_hist->height/temp_max;??
  • ??
  • ????for?(i?=?0;i?<?4096;?i++)??
  • ????{??
  • ????????p1.x?=?i?*?bin_width;??
  • ????????p1.y?=?pic_hist->height;??
  • ????????p2.x?=?(i?+?1)*bin_width;??
  • ????????p2.y?=?pic_hist->height?-?hist1[i]?*?bin_unith;??
  • ????????//printf("%d,%d,%d,%d\n",p1.x,p1.y,p2.x,p2.y);??
  • ????????cvRectangle(pic_hist,p1,p2,cvScalar(0,255,0),-1,8,0);??
  • ????}??
  • ????cvSaveImage("hist1.jpg",pic_hist);??
  • ????cvReleaseImage(&pic_hist);??
  • }??
  • ??
  • void?MeanShift_Tracking(IplImage?*current)??
  • {??
  • ????int?num?=?0,?i?=?0,?j?=?0;??
  • ????int?t_w?=?0,?t_h?=?0,?t_x?=?0,?t_y?=?0;??
  • ????double?*w?=?0,?*hist2?=?0;??
  • ????double?sum_w?=?0,?x1?=?0,?x2?=?0,y1?=?2.0,?y2?=?2.0;??
  • ????int?q_r,?q_g,?q_b;??
  • ????int?*q_temp;??
  • ????IplImage?*pic_hist?=?0;??
  • ??
  • ????t_w?=?drawing_box.width;??
  • ????t_h?=?drawing_box.height;??
  • ??????
  • ????pic_hist?=?cvCreateImage(cvSize(300,200),IPL_DEPTH_8U,3);?????//生成直方圖圖像??
  • ????hist2?=?(double?*)malloc(sizeof(double)*4096);??
  • ????w?=?(double?*)malloc(sizeof(double)*4096);??
  • ????q_temp?=?(int?*)malloc(sizeof(int)*t_w*t_h);??
  • ??
  • ????while?((pow(y2,2)?+?pow(y1,2)?>?0.5)&&?(num?<?NUM))??
  • ????{??
  • ????????num++;??
  • ????????t_x?=?drawing_box.x;??
  • ????????t_y?=?drawing_box.y;??
  • ????????memset(q_temp,0,sizeof(int)*t_w*t_h);??
  • ????????for?(i?=?0;i<4096;i++)??
  • ????????{??
  • ????????????w[i]?=?0.0;??
  • ????????????hist2[i]?=?0.0;??
  • ????????}??
  • ??
  • ????????for?(i?=?t_y;i?<?t_h?+?t_y;i++)??
  • ????????{??
  • ????????????for?(j?=?t_x;j?<?t_w?+?t_x;j++)??
  • ????????????{??
  • ????????????????//rgb顏色空間量化為16*16*16?bins??
  • ????????????????q_r?=?((u_char)current->imageData[i?*?current->widthStep?+?j?*?3?+?2])?/?16;??
  • ????????????????q_g?=?((u_char)current->imageData[i?*?current->widthStep?+?j?*?3?+?1])?/?16;??
  • ????????????????q_b?=?((u_char)current->imageData[i?*?current->widthStep?+?j?*?3?+?0])?/?16;??
  • ????????????????q_temp[(i?-?t_y)?*t_w?+?j?-?t_x]?=?q_r?*?256?+?q_g?*?16?+?q_b;??
  • ????????????????hist2[q_temp[(i?-?t_y)?*t_w?+?j?-?t_x]]?=??hist2[q_temp[(i?-?t_y)?*t_w?+?j?-?t_x]]?+??m_wei[(i?-?t_y)?*?t_w?+?j?-?t_x]?;??
  • ????????????}??
  • ????????}??
  • ??
  • ????????//歸一化直方圖??
  • ????????for?(i=0;i<4096;i++)??
  • ????????{??
  • ????????????hist2[i]?=?hist2[i]?/?C;??
  • ????????????//printf("%f\n",hist2[i]);??
  • ????????}??
  • ????????//生成目標直方圖??
  • ????????double?temp_max=0.0;??
  • ??
  • ????????for?(i=0;i<4096;i++)?????????//求直方圖最大值,為了歸一化??
  • ????????{??
  • ????????????if?(temp_max?<?hist2[i])??
  • ????????????{??
  • ????????????????temp_max?=?hist2[i];??
  • ????????????}??
  • ????????}??
  • ????????//畫直方圖??
  • ????????CvPoint?p1,p2;??
  • ????????double?bin_width=(double)pic_hist->width/(4368);??
  • ????????double?bin_unith=(double)pic_hist->height/temp_max;??
  • ??
  • ????????for?(i?=?0;i?<?4096;?i++)??
  • ????????{??
  • ????????????p1.x?=?i?*?bin_width;??
  • ????????????p1.y?=?pic_hist->height;??
  • ????????????p2.x?=?(i?+?1)*bin_width;??
  • ????????????p2.y?=?pic_hist->height?-?hist2[i]?*?bin_unith;??
  • ????????????cvRectangle(pic_hist,p1,p2,cvScalar(0,255,0),-1,8,0);??
  • ????????}??
  • ????????cvSaveImage("hist2.jpg",pic_hist);??
  • ??????
  • ????????for?(i?=?0;i?<?4096;i++)??
  • ????????{??
  • ????????????if?(hist2[i]?!=?0)??
  • ????????????{??
  • ????????????????w[i]?=?sqrt(hist1[i]/hist2[i]);??
  • ????????????}else??
  • ????????????{??
  • ????????????????w[i]?=?0;??
  • ????????????}??
  • ????????}??
  • ??????????????
  • ????????sum_w?=?0.0;??
  • ????????x1?=?0.0;??
  • ????????x2?=?0.0;??
  • ??
  • ????????for?(i?=?0;i?<?t_h;?i++)??
  • ????????{??
  • ????????????for?(j?=?0;j?<?t_w;?j++)??
  • ????????????{??
  • ????????????????//printf("%d\n",q_temp[i?*?t_w?+?j]);??
  • ????????????????sum_w?=?sum_w?+?w[q_temp[i?*?t_w?+?j]];??
  • ????????????????x1?=?x1?+?w[q_temp[i?*?t_w?+?j]]?*?(i?-?t_h/2);??
  • ????????????????x2?=?x2?+?w[q_temp[i?*?t_w?+?j]]?*?(j?-?t_w/2);??
  • ????????????}??
  • ????????}??
  • ????????y1?=?x1?/?sum_w;??
  • ????????y2?=?x2?/?sum_w;??
  • ??????????
  • ????????//中心點位置更新??
  • ????????drawing_box.x?+=?y2;??
  • ????????drawing_box.y?+=?y1;??
  • ??
  • ????????//printf("%d,%d\n",drawing_box.x,drawing_box.y);??
  • ????}??
  • ????free(hist2);??
  • ????free(w);??
  • ????free(q_temp);??
  • ????//顯示跟蹤結果??
  • ????cvRectangle(current,cvPoint(drawing_box.x,drawing_box.y),cvPoint(drawing_box.x+drawing_box.width,drawing_box.y+drawing_box.height),CV_RGB(255,0,0),2);??
  • ????cvShowImage("Meanshift",current);??
  • ????//cvSaveImage("result.jpg",current);??
  • ????cvReleaseImage(&pic_hist);??
  • }??
  • ??
  • void?onMouse(?int?event,?int?x,?int?y,?int?flags,?void?*param?)??
  • {??
  • ????if?(pause)??
  • ????{??
  • ????????switch(event)??
  • ????????{??
  • ????????case?CV_EVENT_LBUTTONDOWN:???
  • ????????????//the?left?up?point?of?the?rect??
  • ????????????drawing_box.x=x;??
  • ????????????drawing_box.y=y;??
  • ????????????break;??
  • ????????case?CV_EVENT_LBUTTONUP:??
  • ????????????//finish?drawing?the?rect?(use?color?green?for?finish)??
  • ????????????drawing_box.width=x-drawing_box.x;??
  • ????????????drawing_box.height=y-drawing_box.y;??
  • ????????????cvRectangle(current,cvPoint(drawing_box.x,drawing_box.y),cvPoint(drawing_box.x+drawing_box.width,drawing_box.y+drawing_box.height),CV_RGB(255,0,0),2);??
  • ????????????cvShowImage("Meanshift",current);??
  • ??????????????
  • ????????????//目標初始化??
  • ????????????hist1?=?(double?*)malloc(sizeof(double)*16*16*16);??
  • ????????????m_wei?=??(double?*)malloc(sizeof(double)*drawing_box.height*drawing_box.width);??
  • ????????????init_target(hist1,?m_wei,?current);??
  • ????????????is_tracking?=?true;??
  • ????????????break;??
  • ????????}??
  • ????????return;??
  • ????}??
  • }??
  • ??
  • ??
  • ??
  • int?_tmain(int?argc,?_TCHAR*?argv[])??
  • {??
  • ????CvCapture?*capture=cvCreateFileCapture("test.avi");??
  • ????current?=?cvQueryFrame(capture);??
  • ????char?res[20];??
  • ????int?nframe?=?0;??
  • ??
  • ????while?(1)??
  • ????{?????
  • ????/*??sprintf(res,"result%d.jpg",nframe);?
  • ????????cvSaveImage(res,current);?
  • ????????nframe++;*/??
  • ????????if(is_tracking)??
  • ????????{??
  • ????????????MeanShift_Tracking(current);??
  • ????????}??
  • ??
  • ????????int?c=cvWaitKey(1);??
  • ????????//暫停??
  • ????????if(c?==?'p')???
  • ????????{??
  • ????????????pause?=?true;??
  • ????????????cvSetMouseCallback(?"Meanshift",?onMouse,?0?);??
  • ????????}??
  • ????????while(pause){??
  • ????????????if(cvWaitKey(0)?==?'p')??
  • ????????????????pause?=?false;??
  • ????????}??
  • ????????cvShowImage("Meanshift",current);??
  • ????????current?=?cvQueryFrame(capture);?//抓取一幀??
  • ????}??
  • ??
  • ????cvNamedWindow("Meanshift",1);??
  • ????cvReleaseCapture(&capture);??
  • ????cvDestroyWindow("Meanshift");??
  • ????return?0;??
  • }??
  • 運行結果:

    ?

    初始目標直方圖:


    候選目標直方圖:

    code: http://download.csdn.net/detail/real_myth/9717307



    48樓 planc 2016-07-28 20:02發表 [回復] [引用] [舉報]
    模板直方圖hist1一直沒更新過?那物體形變多了不是會跟丟
    47樓 Legenas 2016-05-20 09:46發表 [回復]
    博主,代碼鏈接失效了,能不能再發一份呢? Re: 兩個小西瓜 2016-07-15 14:48發表 [回復]
    回復Legenas:你好,麻煩問一下你的可以運行成功嗎?
    46樓 我打天涯走過 2016-05-18 20:29發表 [回復]
    q_temp=q_r*256+q_g*16+q_b; %設置每個像素點紅色,黃色,藍色分量所占比重 這句不知道是什么意思
    45樓 我打天涯走過 2016-05-18 20:29發表 [回復]
    不是很懂,慢慢看,慢慢來
    44樓 maimai134 2016-05-05 22:58發表 [回復]
    相似函數體現在哪里? Re: sinat_33383057 2016-08-30 14:51發表 [回復]
    回復maimai134:你好我想問一下,你找到相似函數是怎么體現的了嘛 ?
    43樓 天上有時下牛 2016-04-18 16:44發表 [回復]
    請問,我是用同樣的程序,目標區域的直方圖正常,可候選區域的直方圖是錯誤的,只有一條豎線,而且跟蹤的框一直不懂??
    42樓 qq_34594651 2016-04-09 10:03發表 [回復]
    請問什么是目標全可見的圖片,您的result72.jpg是什么樣子的圖片
    41樓 wtyxzy 2016-03-25 13:51發表 [回復]
    你好 請問為什么經常會出現這樣的錯誤:Attempted to access temp1(98,1,1); index out of bounds because size(temp1)=[97,80,3]., 矩形的大小一直是不變的,為什么截取的圖片大小會不一樣啊
    40樓 那年聰聰 2016-03-11 14:29發表 [回復]
    為什么在“2、候選模型描述”那里是以上一幀的中心位置為搜索窗口,但是在“運動目標的實現過程【具體算法】”處和“程序實現”時都采用的是以初始目標中心點位置為搜索窗口?
    39樓 1106889182 2016-03-07 08:19發表 [回復]
    感覺真心不錯
    38樓 team79 2016-03-01 14:54發表 [回復]
    公式的推倒還是不是特別明白,還有你在實現的時候省略了g的計算 不是特別明白。我想轉載一下
    37樓 baidu_33825610 2016-01-22 21:23發表 [回復]
    謝謝樓主,學習中
    36樓 倒霉蛋蛋035 2016-01-05 09:52發表 [回復]
    學習了!!!
    35樓 lgs125478 2015-12-29 20:42發表 [回復]
    博主,您好,看了你的博客,感覺是不是少了點東西,就是在選擇目標模板以后,在后面跟蹤時就沒有體現meanShift算法的思想?少了反向直方圖了是不是?
    34樓 krystal727 2015-12-08 16:22發表 [回復]
    請教,matlab程序運行出來了,但是figure2出來的圖像和figure1是同一張,是什么原因呢
    33樓 sinat_27808703 2015-12-04 11:29發表 [回復]
    感謝作者分享
    32樓 JR_Smart 2015-12-03 09:41發表 [回復]
    非常感謝,可用
    31樓 kunsiri 2015-11-21 13:29發表 [回復]
    運行完出了figure1,然后雙擊目標區域就成了下面這樣了,咋回事?
    Warning: Divide by zero.
    > In meanshift at 30
    ??? Error using ==> imread
    File "result100.jpg" does not exist.

    Error in ==> meanshift at 59
    Im=imread(myfile(l).name);
    30樓 csdnyiqixuexiba 2015-11-19 16:10發表 [回復]
    樓主你好,我用的opencv的版本可以運行,但是為什么選定目標之后,目標移動后總是跟丟呢
    29樓 sinat_32257463 2015-11-10 19:18發表 [回復]
    樓主,求素材,程序學習中......
    28樓 zhuihun140 2015-10-06 16:04發表 [回復]
    請問素材在哪里可以找到
    27樓 mc12345611 2015-09-17 17:18發表 [回復]
    謝謝,頂
    26樓 qq_30078917 2015-08-31 19:32發表 [回復]
    博主,為什么matlab的運行出來只有一張圖片? Re: hlinghoney 2015-10-14 17:35發表 [回復]
    回復qq_30078917:同問
    25樓 莎蘭 2015-08-24 21:09發表 [回復]
    你好,我用不同的數據測試,有時會出現如下問題:
    Attempted to access temp(1,1,2); index out of bounds because size(temp)=[35,28,1].

    Error in MeanShiftDemo (line 46)
    q_g=fix(double(temp(i,j,2))/16);

    請問,我該如何解決?
    我覺得原因是我還不理解下面這段代碼的含義:
    for i=1:a
    for j=1:b
    %rgb顏色空間量化為16*16*16 bins
    q_r=fix(double(temp(i,j,1))/16); %fix為趨近0取整函數
    q_g=fix(double(temp(i,j,2))/16);
    q_b=fix(double(temp(i,j,3))/16);
    q_temp=q_r*256+q_g*16+q_b; %設置每個像素點紅色、綠色、藍色分量所占比重
    hist1(q_temp+1)= hist1(q_temp+1)+m_wei(i,j); %計算直方圖統計中每個像素點占的權重
    end
    end
    謝謝,麻煩指導一下 Re: tianzhiyihe 2015-08-28 21:11發表 [回復]
    回復莎蘭:你的問題是temp[:,:,1]是單通道圖像,你去訪問它的第二通道temp[:,:2],當然出錯了。要正確運行只要令下面的q_g,q_b=0,就行了。 Re: 莎蘭 2015-09-02 16:30發表 [回復]
    回復tianzhiyihe:謝謝,這個問題解決了!不過 我有個新問題(能不能加一下QQ:617423023)

    Attempted to access m_wei(1,89); index out of bounds because size(m_wei)=[320,88].

    問題分析:我覺得當imcrop中給出的矩形(x,y,w,h)當x,y有負數時就會出現這個問題,我該如何解決?難道要把m_wei的計算放入整個循環過程嗎?
    24樓 fswy2015 2015-08-14 11:57發表 [回復]
    q_temp = q_r * 256 + q_g * 16 + q_b;這句怎么理解? Re: Shield_Wang 2015-08-28 10:25發表 [回復]
    回復fswy2015:對啊,權重為什么要這么設置 Re: xiaohuilang6 2015-10-12 17:03發表 [回復]
    回復Shield_Wang:如果顏色空間為灰度空間,則梯度直方圖區間為0-255,如果劃分為16份,就是0-15,如果顏色空間為rgb,一樣的,就是16*16*16的大小的直方圖
    23樓 陽_子_陽 2015-07-28 17:25發表 [回復]
    可以試試
    22樓 yang_yang5201314 2015-07-14 16:39發表 [回復]
    公式好復雜,慢慢理解!
    21樓 wubing911127 2015-07-14 15:49發表 [回復]
    很好 Re: sxakhyct 2015-08-26 16:08發表 [回復]
    回復wubing911127:m_wei(i,j)=1-dist/h 為什么是1-dist/h啊,按照文章中的公式,貌似直接是m_wei(i,j)=dist/h啊?
    Re: sinat_29822957 2015-07-16 20:26發表 [回復]
    回復wubing911127:你好,我運行的是matlab的代碼,為什么只出來了figure1而且沒有報錯。
    20樓 yaoxingfu72 2015-07-12 14:20發表 [回復]
    matlab程序第59行有錯誤:
    image文件夾的路徑并沒有加上。imread函數搜索不到image文件中。作者并沒有加上。
    解決辦法:1.在函數開始的時候把image文件夾路徑加上。
    2.imread(['./image/',myfile(l).name]);
    19樓 yaoxingfu72 2015-07-12 14:19發表 [回復]
    image文件夾的路徑并沒有加上。imread函數搜索不到image文件中。作者并沒有加上。matlab程序第59行
    解決辦法:1.在函數開始的時候把image文件夾路徑加上。
    2.imread(['./image/',myfile(l).name]); Re: krystal727 2015-12-07 10:39發表 [回復]
    回復yaoxingfu72:能具體解釋一下,['./image/',myfile(l).name]每個部分代表什么意思么,新手求助 Re: sinat_34615612 2016-04-11 10:31發表 [回復]
    回復krystal727:這個不就是絕對路徑嗎?
    Re: kunsiri 2015-11-20 17:19發表 [回復]
    回復yaoxingfu72:到底怎么改路徑啊,按你那么改還是不行啊
    Re: Shield_Wang 2015-08-27 16:01發表 [回復]
    回復yaoxingfu72:按照你的說法,成功了
    18樓 suiyue_defan 2015-06-19 10:27發表 [回復]
    xw=xw+w(uint32(q_temp1(i,j))+1)*[i-y(1)-0.5,j-y(2)-0.5];這句中為什么減0.5呢? Re: 憤怒的菜菜鳥 2015-08-10 14:21發表 [回復]
    回復suiyue_defan:減0.5是對計算精度的控制
    Re: R-e-D 2015-07-06 15:00發表 [回復]
    回復suiyue_defan:我也有同樣的疑問,不知道你解決了嗎?同求
    17樓 佼者無謂 2015-06-15 12:59發表 [回復]
    想問個很基礎的問題,為什么沒看到主函數?這個demo主函數編譯器程序接口是哪個。
    16樓 fyy19870201 2015-05-13 12:19發表 [回復]
    很有收獲。
    15樓 tianldn 2015-05-11 13:03發表 [回復]
    運行mltlab,斷定目標區域,雙擊后沒有反應,應該怎么做啊
    14樓 hanxiaodongege 2015-05-04 16:01發表 [回復]
    運行了 怎么沒反應呢 是不是我直接復制的?
    13樓 KLORDLY 2015-04-09 13:30發表 [回復]
    lz您好,之前看了你那個基于MeanShift的目標跟蹤,我用opencv2.4.5和microsoft visual studio 2012 運行,可以跟蹤,但很快會出現“0xC0000005: 讀取位置 0x00000048 時發生訪問沖突。”這是怎么回事,謝謝! Re: chuhoat 2016-03-23 08:48發表 [回復]
    回復KLORDLY:同樣的問題,你已經解決了沒有? Re: KLORDLY 2016-04-22 15:21發表 [回復]
    回復chuhoat:恩,解決了
    12樓 LCRopencv 2015-04-09 10:01發表 [回復]
    博主你好,我剛開始學習meanshift,看了你的博客受益匪淺,非常詳細到位,我都能理解。不過我還想學習如何讓窗口自適應的算法和代碼,我自己找了兩天也沒學懂。希望博主能指點一下,謝謝。
    11樓 KLORDLY 2015-04-02 15:55發表 [回復]
    那個myfile(l)是什么文件,我是不是只需要把這個改一下就可以運行了,在opencv2.4.5上,謝謝樓主了!
    10樓 myt584914977 2015-03-09 09:41發表 [回復]
    運行mltlab,斷定目標區域,雙擊后沒有反應,應該怎么做啊 新手求教哇
    9樓 zzzhaut 2015-03-06 19:06發表 [回復]
    問題解決沒有?
    8樓 fangqing001 2015-01-28 15:20發表 [回復]
    xw=xw+w(uint32(q_temp1(i,j))+1)*[i-y(1)-0.5,j-y(2)-0.5] 請問這一句目的是什么呢?新手一枚,謝謝指教!
    7樓 inmiracle 2015-01-20 10:40發表 [回復]
    寫的很好,上節不是說基于卡爾曼實現嗎
    6樓 山寨小哥 2015-01-04 16:35發表 [回復]
    Epanechnikov profile不是平方形式,而是一次的,只不過輸入的是x的2范數,所以導數為常數
    5樓 Fanatic357 2014-10-27 15:42發表 [回復]
    樓主博文不錯喔,增長不少知識。
    請問能說一下你的碩士畢業論文名稱嗎,謝謝了。
    學生一枚,也是研究這方面的。
    4樓 chongziyang 2014-10-11 19:26發表 [回復]
    請問Y表示的是什么呢,是偏移量么?
    還有就是怎么保證BH系數是最大的呢?越看越糊涂了,望指導。能交流下么,最近小弟在研究這個,扣扣823691966 Re: sinat_33383057 2016-09-02 11:17發表 [回復]
    回復chongziyang:你的問題解決了嘛?BH系數如何保證最大的呢?
    3樓 a010655 2014-08-01 20:20發表 [回復]
    請問下載了代碼以后為什么報錯。
    ??? Error using ==> imread
    File "result100.jpg" does not exist.
    你的代碼我只變了下圖片讀取的地址,假如錯了,也不該只是result100.jpg錯了,其他也會錯啊 Re: yaoxingfu72 2015-07-12 14:19發表 [回復]
    回復a010655:image文件夾的路徑并沒有加上。imread函數搜索不到image文件中。作者并沒有加上。matlab程序第59行
    解決辦法:1.在函數開始的時候把image文件夾路徑加上。
    2.imread(['./image/',myfile(l).name]); Re: x312396296 2015-11-05 20:22發表 [回復]
    回復yaoxingfu72:還是不懂如何實現路徑問題。。。
    Re: 李木木_Edward 2014-11-26 10:42發表 [回復]
    回復a010655:我也出了這個問題,請問你解決了沒有? Re: baidu_27748963 2015-05-04 11:55發表 [回復]
    回復李木木_Edward:請問你后來怎么解決的呀= =求指教 Re: sinat_27534737 2015-05-18 14:06發表 [回復]
    回復baidu_27748963:你的解決了嗎???我也是同樣的問題! 跪求解答! Re: dan_dan_dan1234 2015-06-02 21:54發表 [回復]
    回復sinat_27534737:我的之前也有這個問題,后來我看到主界面左側的Current Folder里我使用的圖片文件夾是灰色的,我就右鍵把這個文件夾添加到工作路徑中就好了(右鍵彈出菜單中add to path)
    Re: dan_dan_dan1234 2015-06-02 21:55發表 [回復]
    回復sinat_27534737:我的之前也有這個問題,后來我看到主界面左側的Current Folder里我使用的圖片文件夾是灰色的,我就右鍵把這個文件夾添加到工作路徑中就好了(右鍵彈出菜單中add to path)
    Re: dan_dan_dan1234 2015-06-02 21:54發表 [回復]
    回復sinat_27534737:我的之前也有這個問題,后來我看到主界面左側的Current Folder里我使用的圖片文件夾是灰色的,我就右鍵把這個文件夾添加到工作路徑中就好了(右鍵彈出菜單中add to path)
    2樓 新的飛揚 2014-07-15 10:13發表 [回復]
    請問這里為什么沒有乘以g(x)的值呢?謝謝!
    xw=xw+w(uint32(q_temp1(i,j))+1)*[i-y(1)-0.5,j-y(2)-0.5]; Re: yangmei3668038 2014-11-19 19:54發表 [回復]
    回復新的飛揚:他的權重是根據到目標中心點的距離算的,沒有完全按照這個核函數,但這樣是可以的,而且簡單。前面已經乘過權重了(直方圖的計算時把權重融合進去了),也就是g(x)。 Re: sinat_33383057 2016-09-02 11:19發表 [回復]
    回復yangmei3668038:請問相似度函數最大是怎么體現的呢?
    Re: R-e-D 2015-07-06 15:04發表 [回復]
    回復yangmei3668038:為什么i j要減去0.5啊,望回復。菜鳥一枚! Re: 憤怒的菜菜鳥 2015-08-10 17:18發表 [回復]
    回復R-e-D:計算精度問題,浮點運算。
    Re: yychenxie21 2014-09-15 19:49發表 [回復]
    g(x)是k(x)倒數的負數,等于常數 Re: han_shan_zi 2014-10-20 21:37發表 [回復]
    回復yychenxie21:k(x)=C(1-x~2)倒數好像不等于常數啊.

    總結

    以上是生活随笔為你收集整理的基于MeanShift的目标跟踪算法及实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。