0001 function [dsKCFoutputSr,dsKCFoutputSq,dsKCFsegmentationOut, avTime,totalTime,timeMatrix] = ...
0002 wrapperDSKCF(video_path, depth_path, img_files, depth_files, pos, target_sz, ...
0003 DSKCFparameters, show_visualization,save_Images,dest_path,noBitShift)
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101 resize_image = (sqrt(prod(target_sz)) >= 100);
0102 if resize_image,
0103 pos = floor(pos / 2);
0104 target_sz = floor(target_sz / 2);
0105 end
0106
0107
0108
0109 DSKCFparameters.window_sz = floor(target_sz * (1 + DSKCFparameters.padding));
0110
0111
0112
0113 scaleDSKCF_struct=initDSKCFparam(DSKCFparameters,target_sz,pos);
0114
0115
0116 shapeDSKCF_struct=initDSKCFshape(5,0);
0117
0118
0119 if(isempty(scaleDSKCF_struct))
0120 disp('Scale structure initialization failed, tracking aborted');
0121 dsKCFoutputSr=[];
0122 dsKCFoutputSq=[];
0123 dsKCFsegmentationOut=[];
0124 avTime=[];
0125 return;
0126 end
0127
0128
0129
0130 totalTime = 0;
0131
0132
0133 positions = zeros(numel(img_files), 2);
0134 dsKCFoutputSr = zeros(numel(img_files), 2);
0135 dsKCFoutputSq = zeros(numel(img_files), 2);
0136 dsKCFsegmentationOut = zeros(numel(img_files), 2);
0137
0138
0139
0140
0141 sizeSr = zeros(numel(img_files), 2);
0142 sizeSq = zeros(numel(img_files), 2);
0143
0144 frameCurr=[];
0145
0146
0147
0148
0149
0150 framePrev=[];
0151
0152
0153
0154 occlusionState=[];
0155
0156 nanPosition=[];
0157
0158 avTime=[];
0159
0160 numberTimeIntervals=8;
0161 timeMatrix=repmat(-1,numel(img_files),numberTimeIntervals);
0162
0163 segmentedBB=[];
0164 segmentedSize=[];
0165
0166
0167 for frame = 1:numel(img_files),
0168
0169 im = imread([video_path img_files{frame}]);
0170 depth = imread([depth_path depth_files{frame}]);
0171
0172
0173 if(isa(depth,'uint16'))
0174 if(noBitShift==false)
0175 depth = bitor(bitshift(depth,-3), bitshift(depth,16-3));
0176 end
0177
0178 depth16Bit = depth;
0179
0180
0181 depth = double(depth);
0182 depth(depth==0) = 10000;
0183 depth = (depth-500)/8500;
0184 depth(depth<0) = 0;
0185 depth(depth>1) = 1;
0186 depth = uint8(255*(1 - depth));
0187 end
0188
0189
0190 if size(im,3) > 1,
0191 imRGB=im;
0192 im = rgb2gray(im);
0193 else
0194 imRGB=im;
0195 imRGB(:,:,2)=im;
0196 imRGB(:,:,3)=im;
0197 end
0198
0199 if resize_image,
0200 im = imresize(im, 0.5);
0201 imRGB = imresize(imRGB, 0.5);
0202 depth = imresize(depth, 0.5);
0203 depth16Bit = depth16Bit((1:2:end),(1:2:end));
0204 end
0205
0206
0207
0208
0209 tTotal=tic();
0210 firstFrame=frame==1;
0211
0212
0213 frameCurr.rgb = imRGB;
0214 frameCurr.gray = im;
0215 frameCurr.depth = double(depth);
0216 frameCurr.depthNoData=depth16Bit==0;
0217 frameCurr.depth16Bit=depth16Bit;
0218
0219
0220 if(firstFrame)
0221 segmentedMASK=repmat(0,size(frameCurr.depth));
0222 trackerDSKCF_struct=initDSKCFtracker();
0223
0224 if(isempty(trackerDSKCF_struct))
0225 disp('DS-KCF tracker structure initialization failed, tracking aborted');
0226 dsKCFoutputSr=[];
0227 dsKCFoutputSq=[];
0228 avTime=[];
0229 return;
0230 end
0231
0232 framePrev.rgb = imRGB;
0233 framePrev.gray = im;
0234 framePrev.depth = depth;
0235 framePrev.depthNoData=depth16Bit==0;
0236 framePrev.depth16Bit=depth16Bit;
0237
0238 trackerDSKCF_struct.previousTarget.posX=pos(2);
0239 trackerDSKCF_struct.previousTarget.posY=pos(1);
0240 trackerDSKCF_struct.previousTarget.h=scaleDSKCF_struct.target_sz(scaleDSKCF_struct.i).target_sz(1);
0241 trackerDSKCF_struct.previousTarget.w=scaleDSKCF_struct.target_sz(scaleDSKCF_struct.i).target_sz(2);
0242 trackerDSKCF_struct.previousTarget.bb=fromCentralPointToBB...
0243 (trackerDSKCF_struct.previousTarget.posX,trackerDSKCF_struct.previousTarget.posY,...
0244 trackerDSKCF_struct.previousTarget.w,trackerDSKCF_struct.previousTarget.h,size(im,2),size(im,1));
0245 trackerDSKCF_struct.currentTarget.meanDepthObj=0;
0246
0247 [trackerDSKCF_struct.previousTarget.meanDepthObj,trackerDSKCF_struct.previousTarget.stdDepthObj,...
0248 trackerDSKCF_struct.previousTarget.LabelRegions,...
0249 trackerDSKCF_struct.previousTarget.regionIndex,...
0250 trackerDSKCF_struct.previousTarget.Centers,...
0251 trackerDSKCF_struct.previousTarget.LUT] = ...
0252 initDistributionFast(trackerDSKCF_struct.previousTarget.bb, ...
0253 framePrev.depth16Bit,framePrev.depthNoData);
0254
0255
0256 trackerDSKCF_struct.currentTarget=trackerDSKCF_struct.previousTarget;
0257
0258
0259 scaleDSKCF_struct.InitialDepth = trackerDSKCF_struct.previousTarget.meanDepthObj;
0260 scaleDSKCF_struct.currDepth = trackerDSKCF_struct.previousTarget.meanDepthObj;
0261
0262
0263 trackerDSKCF_structOccluder=initDSKCFtracker_occluder();
0264 DSKCFparameters_Occluder=DSKCFparameters;
0265
0266
0267 if(show_visualization)
0268
0269 myFigColor=figure();
0270 myFigDepth=figure();
0271 set(myFigDepth,'resize','off');
0272 set(myFigColor,'resize','off');
0273 end
0274
0275
0276 trackerDSKCF_struct.currentTarget.segmentedBB=...
0277 trackerDSKCF_struct.currentTarget.bb';
0278 end
0279
0280
0281
0282
0283 [pos,trackerDSKCF_struct,trackerDSKCF_structOccluder,scaleDSKCF_struct,...
0284 DSKCFparameters_Occluder,segmentedMASK,shapeDSKCF_struct,timeMatrix(frame,1:7)]=...
0285 singleFrameDSKCF(firstFrame,pos,frameCurr,trackerDSKCF_struct,DSKCFparameters,...
0286 scaleDSKCF_struct,trackerDSKCF_structOccluder,DSKCFparameters_Occluder,shapeDSKCF_struct);
0287
0288 if(isempty(trackerDSKCF_struct.currentTarget.segmentedBB))
0289 segmentedBB=[segmentedBB;segmentedBB(end,:)];
0290 else
0291 segmentedBB=[segmentedBB;trackerDSKCF_struct.currentTarget.segmentedBB];
0292 end
0293
0294 occlusionState=[occlusionState ;trackerDSKCF_struct.currentTarget.underOcclusion];
0295
0296
0297 avTime=[avTime; toc(tTotal)];
0298 timeMatrix(frame,8)=avTime(end);
0299 totalTime = totalTime + avTime(end);
0300
0301
0302 if (save_Images==false && show_visualization==true)
0303
0304
0305 if(resize_image)
0306 imRGB = imresize(imRGB, 2);
0307 depth = imresize(depth, 2);
0308 end
0309
0310
0311 if(isempty(pos))
0312 bbToPlot=[];
0313 nanPosition=[nanPosition; 1];
0314 else
0315 nanPosition=[nanPosition; 0];
0316
0317
0318 sr = scaleDSKCF_struct.InitialDepth / scaleDSKCF_struct.currDepth;
0319
0320 targ_sz = round(scaleDSKCF_struct.InitialTargetSize * sr);
0321
0322
0323
0324 bbToPlot = [pos([2,1]) - targ_sz([2,1])/2, targ_sz([2,1])];
0325 if(resize_image)
0326 bbToPlot=bbToPlot*2;
0327 end
0328 end
0329
0330 bbOCCToPlot=[];
0331 if(trackerDSKCF_struct.currentTarget.underOcclusion)
0332 widthOCC=trackerDSKCF_struct.currentTarget.occBB(3)-trackerDSKCF_struct.currentTarget.occBB(1);
0333 heightOCC=trackerDSKCF_struct.currentTarget.occBB(4)-trackerDSKCF_struct.currentTarget.occBB(2);
0334 bbOCCToPlot=[trackerDSKCF_struct.currentTarget.occBB(1:2); widthOCC; heightOCC]';
0335 if(resize_image)
0336 bbOCCToPlot=bbOCCToPlot*2;
0337 end
0338 end
0339
0340 if(frame==1)
0341 manualBBdraw_OCC_WithLabelsVisualize(imRGB,bbToPlot,bbOCCToPlot,'r','y',4,'DS-KCF','Occluder',myFigColor);
0342 positionColor=get(gcf,'OuterPosition');
0343 positionColor(1)=positionColor(1)-floor(positionColor(3)/2) -25;
0344 set(gcf,'OuterPosition',positionColor);
0345 manualBBdraw_OCC_WithLabelsVisualize(depth,bbToPlot,bbOCCToPlot,'r','y',4,'DS-KCF','Occluder',myFigDepth);
0346 positionDepth=get(gcf,'OuterPosition');
0347 positionDepth(1)=positionDepth(1)+floor(positionDepth(3)/2) +25;
0348 set(gcf,'OuterPosition',positionDepth);
0349 else
0350
0351
0352 clf(myFigColor);
0353 manualBBdraw_OCC_WithLabelsVisualize(imRGB,bbToPlot,bbOCCToPlot,'r','y',4,'DS-KCF','Occluder',myFigColor);
0354
0355 clf(myFigDepth);
0356 manualBBdraw_OCC_WithLabelsVisualize(depth,bbToPlot,bbOCCToPlot,'r','y',4,'DS-KCF','Occluder',myFigDepth);
0357 drawnow
0358 pause(0.05)
0359 end
0360
0361 end
0362
0363 if (save_Images==true && show_visualization==true)
0364
0365
0366 if(resize_image)
0367 imRGB = imresize(imRGB, 2);
0368 depth = imresize(depth, 2);
0369 end
0370
0371
0372 if(isempty(pos))
0373 bbToPlot=[];
0374 nanPosition=[nanPosition; 1];
0375 else
0376 nanPosition=[nanPosition; 0];
0377
0378
0379 sr = scaleDSKCF_struct.InitialDepth / scaleDSKCF_struct.currDepth;
0380
0381 targ_sz = round(scaleDSKCF_struct.InitialTargetSize * sr);
0382
0383
0384
0385 bbToPlot = [pos([2,1]) - targ_sz([2,1])/2, targ_sz([2,1])];
0386 if(resize_image)
0387 bbToPlot=bbToPlot*2;
0388 end
0389 end
0390
0391 bbOCCToPlot=[];
0392 if(trackerDSKCF_struct.currentTarget.underOcclusion)
0393 widthOCC=trackerDSKCF_struct.currentTarget.occBB(3)-trackerDSKCF_struct.currentTarget.occBB(1);
0394 heightOCC=trackerDSKCF_struct.currentTarget.occBB(4)-trackerDSKCF_struct.currentTarget.occBB(2);
0395 bbOCCToPlot=[trackerDSKCF_struct.currentTarget.occBB(1:2); widthOCC; heightOCC]';
0396 if(resize_image)
0397 bbOCCToPlot=bbOCCToPlot*2;
0398 end
0399 end
0400
0401 if(frame==1)
0402 imRGB_tracked=manualBBdraw_OCC_WithLabelsVisualize(imRGB,bbToPlot,bbOCCToPlot,'r','y',4,'DS-KCF','Occluder',myFigColor);
0403 positionColor=get(gcf,'OuterPosition');
0404 positionColor(1)=positionColor(1)-floor(positionColor(3)/2) -25;
0405 set(gcf,'OuterPosition',positionColor);
0406 dept_tracked=manualBBdraw_OCC_WithLabelsVisualize(depth,bbToPlot,bbOCCToPlot,'r','y',4,'DS-KCF','Occluder',myFigDepth);
0407 positionDepth=get(gcf,'OuterPosition');
0408 positionDepth(1)=positionDepth(1)+floor(positionDepth(3)/2) +25;
0409 set(gcf,'OuterPosition',positionDepth);
0410 else
0411
0412
0413 clf(myFigColor);
0414 imRGB_tracked=manualBBdraw_OCC_WithLabelsVisualize(imRGB,bbToPlot,bbOCCToPlot,'r','y',4,'DS-KCF','Occluder',myFigColor);
0415
0416 clf(myFigDepth);
0417 dept_tracked=manualBBdraw_OCC_WithLabelsVisualize(depth,bbToPlot,bbOCCToPlot,'r','y',4,'DS-KCF','Occluder',myFigDepth);
0418 drawnow
0419 pause(0.05)
0420 end
0421
0422 tmpColorName=[dest_path '/trackedColor_' num2str(frame) '.jpg'];
0423 if(frame==1)
0424 imRGB_trackedMASK=imRGB_tracked(:,:,1)==204;
0425 imRGB_trackedMASK=imRGB_trackedMASK & imRGB_tracked(:,:,2)==204;
0426 imRGB_trackedMASK=imRGB_trackedMASK & imRGB_tracked(:,:,3)==204;
0427 finalMask=imfill(~imRGB_trackedMASK,'holes');
0428 rp=regionprops(finalMask,'boundingbox','Area');
0429
0430 areaList= cat(1, rp.Area);
0431 bbList= cat(1, rp.BoundingBox);
0432 [ddd,areaMax]=max(areaList);
0433 rect=floor(bbList(areaMax,:));
0434
0435 end
0436
0437 imRGB_trackedNEW=imRGB_tracked(rect(2):rect(2)+rect(4),rect(1):rect(1)+rect(3),:);
0438 imwrite(imRGB_trackedNEW,tmpColorName);
0439
0440
0441 tmpDepthName=[dest_path '/trackedDepth_' num2str(frame) '.jpg'];
0442 dept_trackedNEW=dept_tracked(rect(2):rect(2)+rect(4),rect(1):rect(1)+rect(3),:);
0443 imwrite(dept_trackedNEW,tmpDepthName);
0444 end
0445
0446 if (save_Images==true && show_visualization==false)
0447
0448
0449 if(resize_image)
0450 imRGB = imresize(imRGB, 2);
0451 depth = imresize(depth, 2);
0452 segmentedMASK= imresize(segmentedMASK,2);
0453 end
0454
0455 tmpMaskName=[dest_path '/binaryMask_' num2str(frame) '.jpg'];
0456 imwrite(segmentedMASK>0,tmpMaskName);
0457
0458 tmpMaskName=[dest_path '/binaryMaskColored_' num2str(frame) '.jpg'];
0459 segmentedMASKColored = imRGB.*(uint8(repmat(segmentedMASK>0,[1,1,3])));
0460 imwrite(segmentedMASKColored,tmpMaskName);
0461
0462 bbSegToPlot=[1 1 1 1];
0463 if(isempty(trackerDSKCF_struct.currentTarget.segmentedBB)==false)
0464 widthOCC=trackerDSKCF_struct.currentTarget.segmentedBB(3)-trackerDSKCF_struct.currentTarget.segmentedBB(1);
0465 heightOCC=trackerDSKCF_struct.currentTarget.segmentedBB(4)-trackerDSKCF_struct.currentTarget.segmentedBB(2);
0466 bbSegToPlot=[trackerDSKCF_struct.currentTarget.segmentedBB(1:2)'; widthOCC; heightOCC]';
0467 if(resize_image)
0468 bbSegToPlot=bbSegToPlot*2;
0469 end
0470 end
0471
0472
0473
0474 if(isempty(pos))
0475 bbToPlot=[1 1 1 1];
0476 nanPosition=[nanPosition; 1];
0477 else
0478 nanPosition=[nanPosition; 0];
0479
0480
0481 sr = scaleDSKCF_struct.InitialDepth / scaleDSKCF_struct.currDepth;
0482
0483 targ_sz = round(scaleDSKCF_struct.InitialTargetSize * sr);
0484
0485
0486
0487 bbToPlot = [pos([2,1]) - targ_sz([2,1])/2, targ_sz([2,1])];
0488
0489 if(resize_image)
0490 bbToPlot=bbToPlot*2;
0491 end
0492 end
0493
0494 bbOCCToPlot=[1 1 1 1];
0495 if(trackerDSKCF_struct.currentTarget.underOcclusion)
0496 widthOCC=trackerDSKCF_struct.currentTarget.occBB(3)-trackerDSKCF_struct.currentTarget.occBB(1);
0497 heightOCC=trackerDSKCF_struct.currentTarget.occBB(4)-trackerDSKCF_struct.currentTarget.occBB(2);
0498 bbOCCToPlot=[trackerDSKCF_struct.currentTarget.occBB(1:2); widthOCC; heightOCC]';
0499 if(resize_image)
0500 bbOCCToPlot=bbOCCToPlot*2;
0501 end
0502 end
0503
0504 bbSeparate(1,:)=bbToPlot;
0505 bbSeparate(2,:)=bbOCCToPlot;
0506 bbSeparate(3,:)=bbSegToPlot;
0507
0508 colorVector='ryb';
0509 myText{1}='DS-KCF';
0510 myText{2}='Occluder';
0511 myText{3}='DS-KCF+SEG';
0512 myText={};
0513 myTextColor='ryb';
0514
0515
0516 imRGB_tracked=manualBBdraw_MULTIPLE(imRGB,bbSeparate,colorVector,4,myText,myTextColor);
0517 dept_tracked=manualBBdraw_MULTIPLE(depth,bbSeparate,colorVector,4,myText,myTextColor);
0518
0519
0520 tmpColorName=[dest_path '/trackedColor_' num2str(frame) '.jpg'];
0521 if(frame==1)
0522 imRGB_trackedMASK=imRGB_tracked(:,:,1)==204;
0523 imRGB_trackedMASK=imRGB_trackedMASK & imRGB_tracked(:,:,2)==204;
0524 imRGB_trackedMASK=imRGB_trackedMASK & imRGB_tracked(:,:,3)==204;
0525 finalMask=imfill(~imRGB_trackedMASK,'holes');
0526 rp=regionprops(finalMask,'boundingbox','Area');
0527
0528 areaList= cat(1, rp.Area);
0529 bbList= cat(1, rp.BoundingBox);
0530 [ddd,areaMax]=max(areaList);
0531 rect=floor(bbList(areaMax,:));
0532
0533 end
0534
0535 imRGB_trackedNEW=imRGB_tracked(rect(2):rect(2)+rect(4),rect(1):rect(1)+rect(3),:);
0536 imwrite(imRGB_trackedNEW,tmpColorName);
0537
0538
0539 tmpDepthName=[dest_path '/trackedDepth_' num2str(frame) '.jpg'];
0540 dept_trackedNEW=dept_tracked(rect(2):rect(2)+rect(4),rect(1):rect(1)+rect(3),:);
0541 imwrite(dept_trackedNEW,tmpDepthName);
0542 end
0543
0544
0545
0546 if(isempty(pos)==false)
0547
0548 positions(frame,:) = pos;
0549
0550
0551 sqVector(frame,:)= scaleDSKCF_struct.target_sz(scaleDSKCF_struct.i).target_sz([2,1]);
0552
0553
0554 sr = scaleDSKCF_struct.InitialDepth / scaleDSKCF_struct.currDepth;
0555 targ_sz = round(scaleDSKCF_struct.InitialTargetSize * sr);
0556
0557 srVector(frame,:) = targ_sz([2,1]);
0558
0559 else
0560 pos=positions(frame-1,:);
0561 positions(frame,:) = pos;
0562
0563 tmpSize=sqVector(frame-1,:);
0564 sqVector(frame,:)= tmpSize;
0565
0566 tmpSize=srVector(frame-1,:);
0567 srVector(frame,:) = tmpSize;
0568
0569 end
0570
0571
0572 if(frame>1)
0573
0574 trackerDSKCF_struct.previousTarget=trackerDSKCF_struct.currentTarget;
0575 end
0576
0577
0578 end
0579
0580 if resize_image,
0581 positions = positions * 2;
0582 sqVector= sqVector*2;
0583 srVector= srVector*2;
0584 segmentedBB=2*segmentedBB;
0585 end
0586
0587
0588
0589
0590
0591
0592 dsKCFoutputSr=[positions(:,[2,1]) - srVector/2, positions(:,[2,1]) + srVector/2];
0593 dsKCFoutputSq=[positions(:,[2,1]) - sqVector/2, positions(:,[2,1]) + sqVector/2];
0594 dsKCFsegmentationOut=segmentedBB;
0595
0596
0597
0598 dsKCFoutputSr(nanPosition>0,:)=NaN;
0599 dsKCFoutputSq(nanPosition>0,:)=NaN;
0600 dsKCFsegmentationOut(nanPosition>0,:)=NaN;
0601
0602
0603 dsKCFoutputSr=[dsKCFoutputSr, occlusionState];
0604 dsKCFoutputSq=[dsKCFoutputSq, occlusionState];
0605 dsKCFsegmentationOut=[dsKCFsegmentationOut, occlusionState];
0606 end
0607