Difference between revisions of "CUVI by Example"
Line 1: | Line 1: | ||
<p>CUVI library comes with | <p>CUVI library comes with all the image processing essentials that can be used to build countless applications. For example the '''Computer Vision''' module of CUVI can be used for motion and intrusion detection in a live video stream and tracking an object of interest throughout series of cameras installed in a premises. The processing pipeline for motion detection goes as follows:</p> | ||
*Read a frame from the camera stream | *Read a frame from the camera stream | ||
*Select Strong Features in that Frame using CUVI | *Select Strong Features in that Frame using CUVI | ||
*Read next frame | *Read next frame | ||
*Track features of first frame in the second frame using CUVI | *Track features of first frame in the second frame using CUVI | ||
*Set alarm if motion is detected | |||
<p>The CUVI functions used in this example are '''goodFeaturesToTrack()''' and '''trackFeatures()'''. For simplicity we have removed the I/O part on host side from the code</p> | <p>The CUVI functions used in this example are '''goodFeaturesToTrack()''' and '''trackFeatures()'''. For simplicity we have removed the I/O part on host side from the code</p> | ||
Line 34: | Line 35: | ||
} | } | ||
//Smoothing filter | |||
CuviFilter* Gauss = Cuvi_Builtin_Filters::Gaussian(3,0.7f); //3x3 Gaussian Filter with Standard Deviation 0.7 | CuviFilter* Gauss = Cuvi_Builtin_Filters::Gaussian(3,0.7f); //3x3 Gaussian Filter with Standard Deviation 0.7 | ||
void main() | void main() | ||
{ | { | ||
//Buffer Images on GPU | |||
CuviImage* gFrame = new CuviImage(width,height,pitch,8,3); | |||
CuviImage* gFrame = new CuviImage( | |||
CuviImage* gimg1 = new CuviImage(Width,Height,GetOpenCVPitch(Width,Height,8,1),8,1); | CuviImage* gimg1 = new CuviImage(Width,Height,GetOpenCVPitch(Width,Height,8,1),8,1); | ||
CuviImage* gimg2 = new CuviImage(Width,Height,GetOpenCVPitch(Width,Height,8,1),8,1); | CuviImage* gimg2 = new CuviImage(Width,Height,GetOpenCVPitch(Width,Height,8,1),8,1); | ||
CuviROI roi = cuviROI(0,0, | //Region of Interest in the video frame | ||
CuviROI roi = cuviROI(0,0,width,height); | |||
CuviPointValue2D *features1, *features2; | CuviPointValue2D *features1, *features2; | ||
Line 55: | Line 54: | ||
do | do | ||
{ | { | ||
//Read Frame | //Read a Video Frame and populate GPU image with it | ||
gFrame->upload(frame->imageData); | gFrame->upload(frame->imageData); | ||
cuvi:: | |||
//Converting to Gray Image for computations | |||
cuvi::colorOperations::RGB2Gray(gFrame,gimg1); | |||
// | //Do the same with next, adjacent frame | ||
gFrame->upload(frame->imageData); | gFrame->upload(frame->imageData); | ||
cuvi::colorConvert(gFrame,gimg2); | cuvi::colorConvert(gFrame,gimg2); | ||
Line 65: | Line 66: | ||
feature_count = RequestedFeatures; //Reset feature count to original | feature_count = RequestedFeatures; //Reset feature count to original | ||
//Use this option if the adjacent frames are lightening sensitive | |||
if(AdjustImage){ | if(AdjustImage){ | ||
cuvi::colorOperations::adjust(gimg1); | cuvi::colorOperations::adjust(gimg1); | ||
Line 70: | Line 72: | ||
} | } | ||
//Use this option if the images contain fair amount of noise | |||
if(SmoothBeforeSelecting){ | if(SmoothBeforeSelecting){ | ||
//Apply Gaussian Smoothing Filter On Both The Images | //Apply Gaussian Smoothing Filter On Both The Images | ||
Line 77: | Line 79: | ||
} | } | ||
//Call | //Call any Feature Detector on first Frame( KLT | HARRIS | PETER ) | ||
cuvi::computerVision::goodFeaturesToTrack(gimg1,roi,features1,&feature_count,CUVI_FEATURES_HARRIS,FeatureQuality,FeatureMinDistance,3,k); | cuvi::computerVision::goodFeaturesToTrack(gimg1,roi,features1,&feature_count,CUVI_FEATURES_HARRIS,FeatureQuality,FeatureMinDistance,3,k); | ||
//Track Features Using KLT | //Track Features Using of Frame#1 onto Frame#2 using KLT Tracker | ||
cuvi::trackFeatures(gimg1,gimg2,features1,features2,feature_count, | cuvi::trackFeatures(gimg1,gimg2,features1,features2,feature_count,pyramidLevels,trackingWindow,residue,iterations); | ||
//At this point you can indetify whether the selected features in frame one moved in frame two or not | //At this point you can indetify whether the selected features in frame one moved in frame two or not |
Revision as of 19:08, 30 April 2012
CUVI library comes with all the image processing essentials that can be used to build countless applications. For example the Computer Vision module of CUVI can be used for motion and intrusion detection in a live video stream and tracking an object of interest throughout series of cameras installed in a premises. The processing pipeline for motion detection goes as follows:
- Read a frame from the camera stream
- Select Strong Features in that Frame using CUVI
- Read next frame
- Track features of first frame in the second frame using CUVI
- Set alarm if motion is detected
The CUVI functions used in this example are goodFeaturesToTrack() and trackFeatures(). For simplicity we have removed the I/O part on host side from the code
<syntaxhighlight lang="c">
static const int width = 640; //Width of video frame static const int height = 480; //Height of video frame static const int requestedFeatures = 150; //Number of features to look for static const float featureQuality = 0.006f; //Quality of a feature static const int featureMinDistance = 3; //Minimum distance between 2 features static const float k = -2.0f; //k for Harris Corner detector static const int pyramidLevels = 3; //Level Of Scaling static const CuviSize trackingWindow = cuviSize(30,30); //Size of tracking window static const float residue = 20.0f; //Absolute Difference Between Original Location Window & Tracked Location Window static const int iterations = 10; //Maximum number of iterations before a feature is found static const bool smoothBeforeSelecting = false; //Smooth Image Before Feature Selection & Tracking static const bool adjustImage = false; //Adjust Image Light Before Feature Selection static const float movementThreshold = 0.33f; //Mark as motion if a feature moves 0.33 Pixels
if(point2.val != 0.0f) return false; return ((fabsf(point1.x - point2.x)>threshold) || (fabsf(point1.y - point2.y)>threshold)); } //Smoothing filter CuviFilter* Gauss = Cuvi_Builtin_Filters::Gaussian(3,0.7f); //3x3 Gaussian Filter with Standard Deviation 0.7 void main() { //Buffer Images on GPU CuviImage* gFrame = new CuviImage(width,height,pitch,8,3); CuviImage* gimg1 = new CuviImage(Width,Height,GetOpenCVPitch(Width,Height,8,1),8,1); CuviImage* gimg2 = new CuviImage(Width,Height,GetOpenCVPitch(Width,Height,8,1),8,1); //Region of Interest in the video frame CuviROI roi = cuviROI(0,0,width,height); CuviPointValue2D *features1, *features2; int feature_count = 0; do { //Read a Video Frame and populate GPU image with it gFrame->upload(frame->imageData); //Converting to Gray Image for computations cuvi::colorOperations::RGB2Gray(gFrame,gimg1); //Do the same with next, adjacent frame gFrame->upload(frame->imageData); cuvi::colorConvert(gFrame,gimg2); feature_count = RequestedFeatures; //Reset feature count to original //Use this option if the adjacent frames are lightening sensitive if(AdjustImage){ cuvi::colorOperations::adjust(gimg1); cuvi::colorOperations::adjust(gimg2); } //Use this option if the images contain fair amount of noise if(SmoothBeforeSelecting){ //Apply Gaussian Smoothing Filter On Both The Images cuvi::imageFiltering::imageFilter(gimg1,roi,Gauss); cuvi::imageFiltering::imageFilter(gimg2,roi,Gauss); } //Call any Feature Detector on first Frame( KLT | HARRIS | PETER ) cuvi::computerVision::goodFeaturesToTrack(gimg1,roi,features1,&feature_count,CUVI_FEATURES_HARRIS,FeatureQuality,FeatureMinDistance,3,k); //Track Features Using of Frame#1 onto Frame#2 using KLT Tracker cuvi::trackFeatures(gimg1,gimg2,features1,features2,feature_count,pyramidLevels,trackingWindow,residue,iterations);
if(FeatureHasMoved(features1[i],features2[i],MovementThreshold)) //Plot Only If The Feature Has Moved From Its Location //You can also plot the tracked features on the screen
//Freeing GPU Memory gFrame->release(); gimg1->release(); gimg2->release(); } |