Difference between revisions of "Function:TrackFeatures"

From CUVI Wiki
 
(5 intermediate revisions by 2 users not shown)
Line 1: Line 1:
__NOTOC__
__NOTOC__
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.
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===
====Function====
{|
{|
|style="font-size:150%;"|
|style="font-size:100%;"|
<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>
|}
|}


===Parameters===
====Parameters====
{|
|style="font-size:75%;"|
{|class="wikitable"
{|class="wikitable"
|-
|-
Line 22: Line 24:
! 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 49:
|-
|-
| stream
| stream
| CuviStream*
| const CuviStream&
| GPU stream ID for execution
| GPU stream ID for execution
 
|}
|}
|}


 
====Image Type Support====
===Image Type Support===
{|
 
|style="font-size:75%;"|
{| class="wikitable"
{| class="wikitable"
|-
|-
Line 63: Line 65:
| CuviPointValue2D
| CuviPointValue2D
|}
|}
===Samples===
{|
|-
|[[File:Frame0.jpg|frame]]
|[[File:Frame1.jpg|frame|]]
|}
|}


====Samples====
[[File:Frame0.jpg|none|frame]]
<br/>
[[File:Frame1.jpg|none|frame|]]
<br/>


 
====Code Example====
===Example===
{|
{|
|style="font-size:150%;"|
|style="font-size:100%;"|
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">


Line 85: Line 83:


//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>
|}
|}

Latest revision as of 22:19, 18 October 2022

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


Code 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);