Difference between revisions of "Function:TrackFeatures"

From CUVI Wiki
Line 5: Line 5:
|style="font-size:150%;"|
|style="font-size:150%;"|
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
CuviStatus trackFeatures(CuviImage* previousImage,
CuviStatus trackFeatures(const CuviImage& previous,
                         CuviImage* nextImage,
                         const CuviImage& next,
                         CuviPointValue2D* inputFeatures,
                         CuviPointValue2D<Cuvi32f,Cuvi32f>* inputFeatures,
                         CuviPointValue2D** trackedFeatures,
                         CuviPointValue2D<Cuvi32f,Cuvi32f>*& trackedFeatures,
                         Cuvi32s featureCount,
                         const Cuvi32s featureCount,
                         CuviTrackingCriteria criteria,
                         CuviTrackingCriteria criteria,
                         CuviStream* stream = NULL);
                         const CuviStream& stream = CuviStream());
</syntaxhighlight>
</syntaxhighlight>
|}
|}
Line 22: Line 22:
! Description
! Description
|-
|-
| previousImage
| previous
| CuviImage*
| const CuviImage&
| The first image whose features are to be tracked
| The first image whose features are to be tracked
|-
|-
| nextImage
| next
| CuviImage*
| const CuviImage&
| Second image, in which to look for features of first image
| Second image, in which to look for features of first image
|-
|-
| inputFeatures
| inputFeatures
| CuviPointValue2D*
| CuviPointValue2D<Cuvi32f,Cuvi32f>*
| Feature of first image
| Feature of first image
|-
|-
| trackedFeatures
| trackedFeatures
| CuviPointValue2D**
| CuviPointValue2D<Cuvi32f,Cuvi32f>*&
| Output feature list containing the location of tracked features from first image onto second image
| Output feature list containing the location of tracked features from first image onto second image
|-
|-
| featureCount
| featureCount
| Cuvi32s
| const Cuvi32s
| Number of features to track
| Number of features to track
|-
|-
Line 47: Line 47:
|-
|-
| stream
| stream
| CuviStream*
| const CuviStream&
| GPU stream ID for execution
| GPU stream ID for execution


Line 85: Line 85:


//Create two 8-bit Grays-scale CuviImage objects
//Create two 8-bit Grays-scale CuviImage objects
CuviImage* gimg1 = new CuviImage(size,img1->depth,img1->nChannels);
CuviImage gimg1 = cuvi::io::loadImage(path, CUVI_LOAD_IMAGE_GRAYSCALE);
CuviImage* gimg2 = new CuviImage(size,img1->depth,img1->nChannels);
CuviImage gimg2 = cuvi::io::loadImage(path, CUVI_LOAD_IMAGE_GRAYSCALE);
 
//Populate the GPU Images
gimg1->upload(img1->imageData,img1->widthStep);
gimg2->upload(img2->imageData,img2->widthStep);


CuviPointValue2D* features1, *features2;
CuviPointValue2D* features1, *features2;


//selection and tracking criteria
//selection and tracking criteria
CuviFeaturesCriteria fc = cuviFeaturesCriteria(CUVI_FEATURES_HARRIS,0.006f,22);
CuviFeaturesCriteria fc(CUVI_FEATURES_HARRIS,0.006f,22);
CuviTrackingCriteria tc = cuviTrackingCriteria(2,cuviSize(12,12),15,10.0f);
CuviTrackingCriteria tc(2,CuviSize(12,12),15,10.0f);


//ROI for selection
//ROI for selection
CuviROI roi = cuviROI(0,0,img1->width,img1->height);
CuviRect roi(0,0,gimg1.width(),gimg1.height());


int featureCount = 50;
int featureCount = 50;


//Select Features
//Select Features
cuvi::computerVision::goodFeaturesToTrack(gimg1,roi,&features1,&featureCount,fc);
cuvi::computerVision::goodFeaturesToTrack(gimg1,roi,features1,featureCount,fc);


//Track the selected features from first frame onto second frame
//Track the selected features from first frame onto second frame
cuvi::computerVision::trackFeatures(gimg1,gimg2,features1,&features2,featureCount,tc);
cuvi::computerVision::trackFeatures(gimg1,gimg2,features1,features2,featureCount,tc);




</syntaxhighlight>
</syntaxhighlight>
|}
|}

Revision as of 14:50, 16 June 2014

CUVI Feature tracker tracks input features from frame 1 onto frame 2. The function is ideal for tracking selected number of features through an image sequence or a video stream. This is a custom algorithm and does not use optical flows to estimate motion. Check out Motion Estimate section for more details on Optical Flow based motion tracking.

Function

CuviStatus trackFeatures(const CuviImage& previous,
                         const CuviImage& next,
                         CuviPointValue2D<Cuvi32f,Cuvi32f>* inputFeatures,
                         CuviPointValue2D<Cuvi32f,Cuvi32f>*& trackedFeatures,
                         const Cuvi32s featureCount,
                         CuviTrackingCriteria criteria,
                         const CuviStream& stream = CuviStream());

Parameters

Name Type Description
previous const CuviImage& The first image whose features are to be tracked
next const CuviImage& Second image, in which to look for features of first image
inputFeatures CuviPointValue2D<Cuvi32f,Cuvi32f>* Feature of first image
trackedFeatures CuviPointValue2D<Cuvi32f,Cuvi32f>*& Output feature list containing the location of tracked features from first image onto second image
featureCount const Cuvi32s Number of features to track
criteria CuviFeaturesCriteria A structure containing various parameters that affect feature tracking behavior
stream const CuviStream& GPU stream ID for execution


Image Type Support

Input Output
8uC1 CuviPointValue2D


Samples

Error creating thumbnail: Unable to save thumbnail to destination
Error creating thumbnail: Unable to save thumbnail to destination


Example

//Image size
CuviSize size = cuviSize(img1->width,img1->height);

//Create two 8-bit Grays-scale CuviImage objects
CuviImage gimg1 = cuvi::io::loadImage(path, CUVI_LOAD_IMAGE_GRAYSCALE);
CuviImage gimg2 = cuvi::io::loadImage(path, CUVI_LOAD_IMAGE_GRAYSCALE);

CuviPointValue2D* features1, *features2;

//selection and tracking criteria
CuviFeaturesCriteria fc(CUVI_FEATURES_HARRIS,0.006f,22);
CuviTrackingCriteria tc(2,CuviSize(12,12),15,10.0f);

//ROI for selection
CuviRect roi(0,0,gimg1.width(),gimg1.height());

int featureCount = 50;

//Select Features
cuvi::computerVision::goodFeaturesToTrack(gimg1,roi,features1,featureCount,fc);

//Track the selected features from first frame onto second frame
cuvi::computerVision::trackFeatures(gimg1,gimg2,features1,features2,featureCount,tc);