meanshift算法Word格式.docx
- 文档编号:22923341
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:20
- 大小:20.50KB
meanshift算法Word格式.docx
《meanshift算法Word格式.docx》由会员分享,可在线阅读,更多相关《meanshift算法Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
#pragmaresource"
*.dfm"
TForm1*Form1;
IplImage*image=0,*hsv=0,*hue=0,*mask=0,*backproject=0,*histimg=0;
CvHistogram*hist=0;
intbackproject_mode=0;
intselect_object=0;
inttrack_object=0;
intshow_hist=1;
CvPointorigin;
CvRectselection;
CvRecttrack_window;
CvBox2Dtrack_box;
CvConnectedComptrack_comp;
inthdims=256;
floathranges_arr[]={0,180};
float*hranges=hranges_arr;
intvmin=10,vmax=256,smin=30;
//---------------------------------------------------------------------------
CvSizecvGetSize(IplImage*img)
{
CvSizeaa;
aa.width=img->
width;
aa.height=img->
height;
returnaa;
}
__fastcallTForm1:
:
TForm1(TComponent*Owner)
:
TForm(Owner)
voidon_mouse(intevent,intx,inty,intflags,void*param)
if(!
image)
return;
if(image->
origin)
y=image->
height-y;
if(select_object)
{
selection.x=MIN(x,origin.x);
selection.y=MIN(y,origin.y);
selection.width=selection.x+CV_IABS(x-origin.x);
selection.height=selection.y+CV_IABS(y-origin.y);
selection.x=MAX(selection.x,0);
selection.y=MAX(selection.y,0);
selection.width=MIN(selection.width,image->
width);
selection.height=MIN(selection.height,image->
height);
selection.width-=selection.x;
selection.height-=selection.y;
}
switch(event)
caseCV_EVENT_LBUTTONDOWN:
origin=cvPoint(x,y);
selection=cvRect(x,y,0,0);
select_object=1;
break;
caseCV_EVENT_LBUTTONUP:
select_object=0;
if(selection.width>
0&
&
selection.height>
0)
track_object=-1;
CvScalarhsv2rgb(floathue)
intrgb[3],p,sector;
staticconstintsector_data[][3]=
{{0,2,1},{1,2,0},{1,0,2},{2,0,1},{2,1,0},{0,1,2}};
hue*=0.033333333333333333333333333333333f;
sector=cvFloor(hue);
p=cvRound(255*(hue-sector));
p^=sector&
1?
255:
0;
rgb[sector_data[sector][0]]=255;
rgb[sector_data[sector][1]]=0;
rgb[sector_data[sector][2]]=p;
returncvScalar(rgb[2],rgb[1],rgb[0],0);
void__fastcallTForm1:
Button1Click(TObject*Sender)
CvCapture*capture=0;
//capture=cvCaptureFromCAM(0);
capture=cvCaptureFromAVI("
video.avi"
);
ShowMessage("
Hotkeys:
/n"
"
/tESC-quittheprogram/n"
/tc-stopthetracking/n"
/tb-switchto/frombackprojectionview/n"
/th-show/hideobjecthistogram/n"
Toinitializetracking,selecttheobjectwithmouse/n"
cvNamedWindow("
Histogram"
1);
CamShiftDemo"
cvSetMouseCallback("
on_mouse,0);
cvCreateTrackbar("
Vmin"
"
&
vmin,256,0);
Vmax"
vmax,256,0);
Smin"
smin,256,0);
for(;
;
)
IplImage*frame=0;
inti,bin_w,c;
frame=cvQueryFrame(capture);
frame)
/*allocateallthebuffers*/
image=cvCreateImage(cvGetSize(frame),8,3);
image->
origin=frame->
origin;
hsv=cvCreateImage(cvGetSize(frame),8,3);
hue=cvCreateImage(cvGetSize(frame),8,1);
mask=cvCreateImage(cvGetSize(frame),8,1);
backproject=cvCreateImage(cvGetSize(frame),8,1);
hist=cvCreateHist(1,&
hdims,CV_HIST_ARRAY,&
hranges,1);
histimg=cvCreateImage(cvSize(320,200),8,3);
cvZero(histimg);
cvCopy(frame,image,0);
cvCvtColor(image,hsv,CV_BGR2HSV);
if(track_object)
int_vmin=vmin,_vmax=vmax;
cvInRangeS(hsv,cvScalar(0,smin,MIN(_vmin,_vmax),0),
cvScalar(180,256,MAX(_vmin,_vmax),0),mask);
cvSplit(hsv,hue,0,0,0);
if(track_object<
floatmax_val=0.f;
cvSetImageROI(hue,selection);
cvSetImageROI(mask,selection);
cvCalcHist(&
hue,hist,0,mask);
cvGetMinMaxHistValue(hist,0,&
max_val,0,0);
cvConvertScale(hist->
bins,hist->
bins,max_val?
255./max_val:
0.,0);
cvResetImageROI(hue);
cvResetImageROI(mask);
track_window=selection;
track_object=1;
bin_w=histimg->
width/hdims;
for(i=0;
i<
hdims;
i++)
intval=cvRound(cvGetReal1D(hist->
bins,i)*histimg->
height/255);
CvScalarcolor=hsv2rgb(i*180.f/hdims);
cvRectangle(histimg,cvPoint(i*bin_w,histimg->
height),
cvPoint((i+1)*bin_w,histimg->
height-val),
color,-1,8,0);
cvCalcBackProject(&
hue,backproject,hist);
cvAnd(backproject,mask,backproject,0);
//cvCamShift(backproject,track_window,
//cvTermCriteria(CV_TERMCRIT_EPS|CV_TERMCRIT_ITER,10,1),
//&
track_comp,&
track_box);
cvMeanShift(backproject,track_window,
cvTermCriteria(CV_TERMCRIT_EPS|CV_TERMCRIT_ITER,10,1),
&
track_comp);
track_window=track_comp.rect;
if(backproject_mode)
cvCvtColor(backproject,image,CV_GRAY2BGR);
track_box.angle=-track_box.angle;
//cvEllipseBox(image,track_box,CV_RGB(255,0,0),3,CV_AA,0);
cvRectangle(image,cvPoint(track_comp.rect.x,track_comp.rect.y),
cvPoint(track_comp.rect.x+track_comp.rect.width,track_comp.rect.y+track_comp.rect.height)
CV_RGB(255,0,0),1,CV_AA,0);
if(select_object&
selection.width>
cvRectangle(image,cvPoint(selection.x,selection.y),
cvPoint(selection.x+selection.width,selection.y+selection.height)
CV_RGB(0,0,255),1,CV_AA,0);
cvShowImage("
image);
histimg);
c=cvWaitKey(100);
if((char)c==27)
switch((char)c)
case'
b'
backproject_mode^=1;
c'
track_object=0;
h'
show_hist^=1;
show_hist)
cvDestroyWindow("
else
default:
;
cvReleaseCapture(&
capture);
cvDestroyWindow("
);
第二种:
(编译成功)
//对运动物体的跟踪:
//如果背景固定,可用帧差法然后在计算下连通域将面积小的去掉即可
//如果背景单一,即你要跟踪的物体颜色和背景色有较大区别可用基于颜色的跟踪如CAMSHIFT鲁棒性都是较好的
//如果背景复杂,如背景中有和前景一样的颜色就需要用到一些具有预测性的算法如卡尔曼滤波等可以和CAMSHIFT结合
#ifndef_EiC
ctype.h>
//用HSV中的Hue分量进行跟踪
//直方图类
//Meanshift跟踪算法返回的Box类
//typedefstructCvBox2D{
//CvPoint2D32fcenter;
/*盒子的中心*/
//CvSize2D32fsize;
/*盒子的长和宽*/
//floatangle;
/*水平轴与第一个边的夹角,用弧度表示*/
//}CvBox2D;
//连接部件
//typedefstructCvConnectedComp{
//doublearea;
/*连通域的面积*/
//floatvalue;
/*分割域的灰度缩放值*/
//CvRectrect;
/*分割域的ROI*/
//}CvConnectedComp;
inthdims=16;
//划分直方图bins的个数,越多越精确
//像素值的范围
//用于初始化CvHistogram类
//用于设置滑动条
//鼠标回调函数,该函数用鼠标进行跟踪目标的选择
//如果图像原点坐标在左下,则将其改为左上
//select_object为1,表示在用鼠标进行目标选择
//此时对矩形类selection用当前的鼠标位置进行设置
//鼠标按下,开始点击选择跟踪物体
//鼠标松开,完成选择跟踪物体
//如果选择物体有效,则打开跟踪功能
//用于将Hue量转换成RGB量
intmain(intargc,char**argv)
if(argc==1||(argc==2&
strlen(argv[1])==1&
isdigit(argv[1][0])))
//打开摄像头
capture=cvCaptureFromCAM(argc==2?
argv[1][0]-'
0'
0);
elseif(argc==2)
//打开avi
capture=cvCaptureFromAVI(argv[1]);
capture)
//打开视频流失败
fprintf(stde
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- meanshift 算法