Open CV Tutorial Itseez Victor Eruhimov Itseez CTO

  • Slides: 82
Download presentation
Open. CV Tutorial Itseez Victor Eruhimov Itseez, CTO http: //opencv. willowgarage. com www. itseez.

Open. CV Tutorial Itseez Victor Eruhimov Itseez, CTO http: //opencv. willowgarage. com www. itseez. com

Outline • • • Open. CV Overview Cheatsheet Simple Programs Tour Features 2 D

Outline • • • Open. CV Overview Cheatsheet Simple Programs Tour Features 2 D Applications 2

Open. CV Czar

Open. CV Czar

Open. CV Overview: opencv. willowgarage. com Robot support > 500 algorithms General Image Processing

Open. CV Overview: opencv. willowgarage. com Robot support > 500 algorithms General Image Processing Functions Image Pyramids Geometric descriptors Camera calibration, Stereo, 3 D Segmentation Features Utilities and Data Structures Transforms Tracking Machine Learning: Fitting • Detection, • Recognition Matrix Math Gary Bradski 4

Machine Learning Library (MLL) CLASSIFICATION / REGRESSION (new) Fast Approximate NN (FLANN) (new) Extremely

Machine Learning Library (MLL) CLASSIFICATION / REGRESSION (new) Fast Approximate NN (FLANN) (new) Extremely Random Trees CART Naïve Bayes MLP (Back propagation) Statistical Boosting, 4 flavors Random Forests SVM Face Detector (Histogram matching) (Correlation) CLUSTERING K-Means EM (Mahalanobis distance) AACBAABBCBCC AACACB CC CBABBC AAA B CB C ABBC B A BBC BB C TUNING/VALIDATION Cross validation Bootstrapping Variable importance Sampling methods http: //opencv. willowgarage. com 5 5

Open. CV History • Original goal: • Accelerate the field by lowering the bar

Open. CV History • Original goal: • Accelerate the field by lowering the bar to computer vision • Find compelling uses for the increasing MIPS out in the market • Timeline: Beta 1 Release, support for Linux Alpha Release at CVPR’ 00 Beta 2 Release Beta 3 Release Beta 4 Release Beta 5 Release Open. CV Started Release 1. 0 Willow Release 1. 1 2. 0 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 • Staffing: • Climbed in 1999 to average 7 first couple of years • Starting 2003 support declined between zero and one with exception 10 of transferring the machine learning from manufacturing work I led (equivalent of 3 people). 5 • Support to zero the couple of years before Willow. 0 6 • 5 people over the last year Gary Bradski 6

New Directory Structure • Re-Organized in terms of processing pipelines • Code site: https:

New Directory Structure • Re-Organized in terms of processing pipelines • Code site: https: //code. ros. org/gf/project/opencv/ – Core – Calibration, features, I/O, img processing – Machine Learning, Obj. Rec – Python • ~2. 5 M downloads

Open. CV Conceptual Structure Modules User Contrib Other Languages Java (TBD) Python C++ C

Open. CV Conceptual Structure Modules User Contrib Other Languages Java (TBD) Python C++ C Object Detection Features 2 d Calib 3 d Stereo VO SLAM (TBD) Machine learning imgproc High. GUI CORE Operating system Stitching (TBD) SSE TBB GPU MPU

Open. CV Tends Towards Real Time http: //opencv. willowgarage. com

Open. CV Tends Towards Real Time http: //opencv. willowgarage. com

Software Engineering • Works on: – Linux, Windows, Mac OS • Languages: – C++,

Software Engineering • Works on: – Linux, Windows, Mac OS • Languages: – C++, Python, C • Online documentation: – Online reference manuals: C++, C and Python. • We’ve been expanding Unit test code • Will soon standardize on cxx or Google’s test system. • TEST COVERAGE:

License • Based on BSD license • Free for commercial or research use –

License • Based on BSD license • Free for commercial or research use – In whole or in part – Does not force your code to be open – You need not contribute back • We hope you will contribute back, recent contribution, C++ wrapper class used for Google Street Maps* * Thanks to Daniel Filip Gary Bradski, 2009 Gary Bradski (c) 2008 11 11

What’s added in December 2010 Open. CV 2. 2? • Detector/Descriptor pipeline (Features 2

What’s added in December 2010 Open. CV 2. 2? • Detector/Descriptor pipeline (Features 2 D) – Many supporting detectors and descriptor features • • Easy interface to Pascal VOC BOW and Latent SVM classification engines Experimental User Contrib Focus detector? Visualization (“High. GUI”) will be based on Qt Official support of Android OS Updated FLANN library Limited Cuda support (stereo)

What’s in Progress? • GPU support throughout the library • More functionality in features

What’s in Progress? • GPU support throughout the library • More functionality in features 2 d • Better pose estimation algorithms – e. Pn. P – Stereo pose estimation • Circles pattern detector • Better support of Android • Support for google test

Where is Open. CV Used? • • • Google Maps, Google street view, Google

Where is Open. CV Used? • • • Google Maps, Google street view, Google Earth, Books Academic and Industry Research Safety monitoring (Dam sites, mines, swimming pools) Security systems Image retrieval • Well over 2 M downloads Video search Structure from motion in movies Machine vision factory production inspection systems Robotics 2 M downloads Screen shots by Gary Bradski, 2005

Useful Open. CV Links Open. CV Wiki: http: //opencv. willowgarage. com/wiki User Group (39717

Useful Open. CV Links Open. CV Wiki: http: //opencv. willowgarage. com/wiki User Group (39717 members): http: //tech. groups. yahoo. com/group /Open. CV/join Open. CV Code Repository: svn co https: //code. ros. org/svn/opencv/trunk/opencv New Book on Open. CV: http: //oreilly. com/catalog/9780596516130/ Or, direct from Amazon: http: //www. amazon. com/Learning-Open. CV-Computer-Vision. Library/dp/0596516134 Code examples from the book: http: //examples. oreilly. com/9780596516130/ Documentation http: //opencv. willowgarage. com/documentation/index. html Gary Bradski, 2009 15 15

Outline • • • Open. CV Overview Cheatsheet Simple Programs Tour Features 2 D

Outline • • • Open. CV Overview Cheatsheet Simple Programs Tour Features 2 D Applications Gary Bradski, 2009 16

Main Structures

Main Structures

New “Image”: cv: : Mat does reference counting, so it does the right thing

New “Image”: cv: : Mat does reference counting, so it does the right thing when it goes out of scope you can also easily make stl vectorts or maps out of Mat.

Mat are Simple Mat M(480, 640, CV_8 UC 3); // Make a 640 x

Mat are Simple Mat M(480, 640, CV_8 UC 3); // Make a 640 x 480 img Rect roi(100, 20, 40); // Make a region of int Mat sub. M = M(roi); // Take a sub region, // no copy is done Mat_<Vec 3 b>: : iterator it= sub. M. begin<Vec 3 b>(), it. End = sub. M. end<Vec 3 b>(); //0 out places in sub. M where blue > red for(; it != it. End; ++it) if( (*it)[0] > (*it)[2]) (*it)[0] = 0;

Matrix Manipulation

Matrix Manipulation

Simple Matrix Operations

Simple Matrix Operations

Simple Image Processing

Simple Image Processing

Image Conversions

Image Conversions

Histogram

Histogram

I/O

I/O

Serialization I/O

Serialization I/O

Serialization I/O

Serialization I/O

GUI (“High. GUI”)

GUI (“High. GUI”)

Camera Calibration, Pose, Stereo

Camera Calibration, Pose, Stereo

Object Recognition

Object Recognition

In. . . opencvsamplesc bgfg_codebook. cpp bgfg_segm. cpp blobtrack. cpp calibration. cpp camshiftdemo. c

In. . . opencvsamplesc bgfg_codebook. cpp bgfg_segm. cpp blobtrack. cpp calibration. cpp camshiftdemo. c contours. c convert_cascade. c convexhull. c delaunay. c demhist. c dft. c distrans. c drawing. c edge. c facedetect. c ffilldemo. c find_obj. cpp fitellipse. c houghlines. c image. cpp inpaint. cpp kalman. c kmeans. c laplace. c samples/c - Use of a image value codebook for background detection for collecting objects - Use of a background learning engine - Engine for blob tracking in images - Camera Calibration - Use of meanshift in simple color tracking - Demonstrates how to compute and use object contours - Change the window size in a recognition cascade - Find the convex hull of an object - Triangulate a 2 D point cloud - Show to use histograms for recognition - Discrete fourier transform - distance map from edges in an image - Various drawing functions - Edge detection - Face detection by classifier cascade - Flood filling demo - Demo use of SURF features - Robust elipse fitting - Line detection - Shows use of new image class, Cv. Image(); - Texture infill to repair imagery - Kalman filter for trackign - K-Means - Convolve image with laplacian. letter_recog. cpp lkdemo. c minarea. c morphology. c motempl. c mushroom. cpp pyramid_segmentation. c squares. c stereo_calib. cpp watershed. cpp - Example of using machine learning Boosting, Backpropagation (MLP) and Random forests - Lukas-Canada optical flow - For a cloud of points in 2 D, find min bounding box and circle. Shows use of Cv_SEQ - Demonstrates Erode, Dilate, Open, Close - Demonstrates motion templates (orthogonal optical flow given silhouettes) - Demonstrates use of decision trees (CART) for recognition - Color segmentation in pyramid - Uses contour processing to find squares in an image - Stereo calibration, recognition and disparity map computation - Watershed transform demo. 31

samples/C++ 32

samples/C++ 32

Samples/python

Samples/python

ch 2_ex 2_1. cpp ch 2_ex 2_2. cpp ch 2_ex 2_3. cpp ch 2_ex

ch 2_ex 2_1. cpp ch 2_ex 2_2. cpp ch 2_ex 2_3. cpp ch 2_ex 2_4. cpp ch 2_ex 2_5. cpp ch 2_ex 2_6. cpp ch 2_ex 2_7. cpp ch 2_ex 2_8. cpp ch 2_ex 2_9. cpp ch 2_ex 2_10. cpp Book Examples Load image from disk Play video from disk Add a slider control Load, smooth and dsiplay image Pyramid down sampling Cv. Canny edge detection Pyramid down and Canny edge Above program simplified Play video from camera or file Read and write video, do Logpolar ch 3_ex 3_1. txt ch 3_ex 3_2. txt ch 3_ex 3_3. cpp ch 3_ex 3_4. cpp ch 3_ex 3_5. cpp ch 3_ex 3_6. txt Matrix structure Matrix creation and release Create matrix from data list Accessing matrix data CV_MAT_ELEM() Setting matrix CV_MAT_ELEM_PTR() Pointer access to matrix data ch 3_ex 3_7. txt ch 3_ex 3_8. txt ch 3_ex 3_9. cpp ch 3_ex 3_10. txt ch 3_ex 3_11. cpp ch 3_ex 3_12. cpp ch 3_ex 3_13. cpp ch 3_ex 3_14. cpp ch 3_ex 3_15. cpp ch 3_ex 3_16. txt ch 3_ex 3_17. cpp ch 3_ex 3_19. cpp ch 3_ex 3_20. cpp Image and Matrix Element access functions Setting matrix or image elements Summing all elements in 3 channel matrix Ipl. Image Header Use of widthstep Use of image ROI Implementing an ROI using widthstep Alpha blending example Saving and loading a Cv. Mat File storage demo Writing configuration files as XML Reading an XML file How to check if IPP acceleration is on Gary Bradski, 2009 34

Book Examples ch 4_ex 4_1. cpp ch 4_ex 4_2. cpp ch 4_ex 4_3. cpp

Book Examples ch 4_ex 4_1. cpp ch 4_ex 4_2. cpp ch 4_ex 4_3. cpp Use a mouse to draw boxes Use a trackbar as a button Finding the video codec ch 5_ex 5_1. cpp ch 5_ex 5_2. cpp ch 5_ex 5_3. cpp ch 5_ex 5_4. cpp Using Cv. Seq cv. Threshold example Combining image planes Adaptive threshiolding ch 6_ex 6_1. cpp ch 6_ex 6_2. cpp ch 6_ex 6_3. cpp ch 6_ex 6_4. cpp ch 6_ex 6_5. cpp cv. Hough. Circles example Affine transform Perspective transform Log-Polar conversion 2 D Fourier Transform ch 7_ex 7_1. cpp ch 7_ex 7_2. txt ch 7_ex 7_3_expanded. cpp ch 7_ex 7_4. txt ch 7_ex 7_5. cpp ch 7_ex 7_5_Hist. Back. Proj. cpp Using histograms Earth Mover’s Distance interface Earth Mover’s Distance set up Using Earth Mover’s Distance Template matching /Cross Corr. Back projection of histograms ch 8_ex 8_1. txt ch 8_ex 2. cpp ch 8_ex 8_3. cpp Cv. Seq structure Contour structure Finding contours Drawing contours Gary Bradski, 2009 35

Book Examples ch 9_ex 9_1. cpp ch 9_watershed. cpp ch 9_Avg. Background. cpp ch

Book Examples ch 9_ex 9_1. cpp ch 9_watershed. cpp ch 9_Avg. Background. cpp ch 9_background. AVG. cpp average ch 9_background. Diff. cpp ch 9_Clear. Stale. CB_Entries. cpp cv_yuv_codebook. cpp Sampling from a line in an image Image segmentation using Watershed transform Background model using an average image Background averaging using a codebook compared to just an ch 10_ex 10_1. cpp ch 10_ex 10_1 b_Horn_Schunck. cpp ch 10_ex 10_2. cpp ch 10_motempl. cpp Optical flow using Lucas-Kanade in an image pyramid Optical flow based on Horn-Schunck block matching Kalman filter example code Using motion templates for segmenting motion. ch 11_ex 11_1. cpp camera ch 11_ex 11_1_fromdisk. cpp ch 11_chessboards. txt Camera calibration using automatic chessboard finding using a ch 12_ex 12_1. cpp ch 12_ex 12_2. cpp ch 12_ex 12_3. cpp ch 12_ex 12_4. cpp ch 12_list. txt Creating a bird’s eye view of a scene using homography Computing the Fundamental matrix using RANSAC Stereo calibration, rectification and correspondence 2 D robust line fitting List of included stereo L+R image pair data ch 13_dtree. cpp ch 13_ex 13_1. cpp ch 13_ex 13_2. cpp ch 13_ex 13_3. cpp ch 13_ex 13_4. cpp cvx_defs. cpp Example of using a decision tree Using k-means Creating and training a decision tree Training using statistical boosting Face detection using Viola-Jones Some defines for use with codebook segmentatio Use the codebook method for doing background differencing Refine codebook to eliminate stale entries Core code used to design Open. CV codebook Doing the same, but read from disk List of included chessboards for calibration from disk example Gary Bradski, 2009 36

Python Face Detector Node: 1 The Setup #!/usr/bin/python """ This program is demonstration python

Python Face Detector Node: 1 The Setup #!/usr/bin/python """ This program is demonstration python ROS Node for face and object detection using haar-like features. The program finds faces in a camera image or video stream and displays a red box around them. Python implementation by: Roman Stanchak, James Bowman """ import roslib. load_manifest('opencv_tests') import sys import os from optparse import Option. Parser import rospy import sensor_msgs. msg from cv_bridge import Cv. Bridge import cv # Parameters for haar detection # From the API: # The default parameters (scale_factor=2, min_neighbors=3, flags=0) are tuned # for accurate yet slow object detection. For a faster operation on real video # images the settings are: # scale_factor=1. 2, min_neighbors=2, flags=CV_HAAR_DO_CANNY_PRUNING, # min_size=<minimum possible face size min_size = (20, 20) image_scale = 2 haar_scale = 1. 2 min_neighbors = 2 haar_flags = 0 37

Python Face Detector Node: 2 The Core if __name__ == '__main__': pkgdir = roslib.

Python Face Detector Node: 2 The Core if __name__ == '__main__': pkgdir = roslib. packages. get_pkg_dir("opencv 2") haarfile = os. path. join(pkgdir, "opencv/share/opencv/haarcascades/haarcascade_frontalface_alt. xml") parser = Option. Parser(usage = "usage: %prog [options] [filename|camera_index]") parser. add_option("-c", "--cascade", action="store", dest="cascade", type="str", help="Haar cascade file, default %default", default = haarfile) (options, args) = parser. parse_args() cascade = cv. Load(options. cascade) br = Cv. Bridge() if(cascade): faces = cv. Haar. Detect. Objects(small_img, cascade, cv. Create. Mem. Storage(0), haar_scale, min_neighbors, haar_flags, min_size) def detect_and_draw(imgmsg): if faces: img = br. imgmsg_to_cv(imgmsg, "bgr 8") for ((x, y, w, h), n) in faces: # allocate temporary images # the input to cv. Haar. Detect. Objects was resized, so scale the gray = cv. Create. Image((img. width, img. height), 8, 1) # bounding box of each face and convert it to two Cv. Points small_img = cv. Create. Image((cv. Round(img. width / image_scale), pt 1 = (int(x * image_scale), int(y * image_scale)) cv. Round (img. height / image_scale)), 8, 1) pt 2 = (int((x + w) * image_scale), int((y + h) * image_scale)) cv. Rectangle(img, pt 1, pt 2, cv. RGB(255, 0, 0), 3, 8, 0) # convert color input image to grayscale cv. Cvt. Color(img, gray, cv. CV_BGR 2 GRAY) cv. Show. Image("result", img) # scale input image for faster processing cv. Resize(gray, small_img, cv. CV_INTER_LINEAR) cv. Equalize. Hist(small_img, small_img) cv. Wait. Key(6) rospy. init_node('rosfacedetect') image_topic = rospy. resolve_name("image") rospy. Subscriber(image_topic, sensor_msgs. msg. Image, detect_and_draw) rospy. spin() 38

Outline • • • Open. CV Overview Cheatsheet Simple Programs Tour Features 2 D

Outline • • • Open. CV Overview Cheatsheet Simple Programs Tour Features 2 D Applications Gary Bradski, 2009 39

New C++ API: Usage Example Focus Detector C: double calc. Gradients(const Ipl. Image *src,

New C++ API: Usage Example Focus Detector C: double calc. Gradients(const Ipl. Image *src, int aperture_size = 7) { Cv. Size sz = cv. Get. Size(src); Ipl. Image* img 16_x = cv. Create. Image( sz, IPL_DEPTH_16 S, 1); Ipl. Image* img 16_y = cv. Create. Image( sz, IPL_DEPTH_16 S, 1); cv. Sobel( src, img 16_x, 1, 0, aperture_size); cv. Sobel( src, img 16_y, 0, 1, aperture_size); Ipl. Image* img. F_x = cv. Create. Image( sz, IPL_DEPTH_32 F, 1); Ipl. Image* img. F_y = cv. Create. Image( sz, IPL_DEPTH_32 F, 1); cv. Scale(img 16_x, img. F_x); cv. Scale(img 16_y, img. F_y); Ipl. Image* magnitude = cv. Create. Image( sz, IPL_DEPTH_32 F, 1); cv. Cart. To. Polar(img. F_x, img. F_y, magnitude); double res = cv. Sum(magnitude). val[0]; cv. Release. Image( &magnitude ); cv. Release. Image(&img. F_x); cv. Release. Image(&img. F_y); cv. Release. Image(&img 16_x); cv. Release. Image(&img 16_y); return res; } C++: double contrast_measure(const Mat& img) { Mat dx, dy; Sobel(img, dx, 1, 0, 3, CV_32 F); Sobel(img, dy, 0, 1, 3, CV_32 F); magnitude(dx, dy, dx); return sum(dx)[0]; } 40

Pyramid /* * Make an image pyramid with levels of arbitrary scale reduction (0,

Pyramid /* * Make an image pyramid with levels of arbitrary scale reduction (0, 1) * M Input image * reduction Scaling factor 1>reduction>0 * levels How many levels of pyramid * pyr std vector containing the pyramid * sz The width and height of blurring kernel, DEFAULT 3 * sigma The standard deviation of the blurring Gaussian DEFAULT 0. 5 * RETURNS Number of levels achieved */ int build. Gaussian. Pyramid(const Mat &M, double reduction, int levels, vector<Mat> &pyr, int sz = 3, float sigma = 0. 5) { if(M. empty()) return 0; pyr. clear(); //Clear it up if((reduction <= 0. 0)||(reduction >=1. 0)) return 0; Mat Mblur, Mdown = M; pyr. push_back(Mdown); Size ksize = Size(sz, sz); int L=1; for(; L<=levels; ++L) { if((reduction*Mdown. rows) <= 1. 0 || (reduction*Mdown. cols) <= 1. 0) break; Gaussian. Blur(Mdown, Mblur, ksize, sigma); resize(Mblur, Mdown, Size(), reduction); pyr. push_back(Mdown); } return L; }

Outline • • • Open. CV Overview Cheatsheet Simple Programs Tour Features 2 D

Outline • • • Open. CV Overview Cheatsheet Simple Programs Tour Features 2 D Applications Gary Bradski, 2009 42

Canny Edge Detector 43

Canny Edge Detector 43

Distance Transform • Distance field from edges of objects Flood Filling 44

Distance Transform • Distance field from edges of objects Flood Filling 44

Hough Transform Gary Bradski, Adrian Kahler 2008 45

Hough Transform Gary Bradski, Adrian Kahler 2008 45

Space Variant vision: Log-Polar Transform Screen shots by Gary Bradski, 2005 46

Space Variant vision: Log-Polar Transform Screen shots by Gary Bradski, 2005 46

Scale Space Chart by Gary Bradski, 2005 void cv. Pyr. Down( Ipl. Image* src,

Scale Space Chart by Gary Bradski, 2005 void cv. Pyr. Down( Ipl. Image* src, Ipl. Image* dst, Ipl. Filter filter = IPL_GAUSSIAN_5 x 5); void cv. Pyr. Up( Ipl. Image* src, Ipl. Image* dst, Ipl. Filter filter = IPL_GAUSSIAN_5 x 5); 47

Thresholds Screen shots by Gary Bradski, 2005 48

Thresholds Screen shots by Gary Bradski, 2005 48

Histogram Equalization Screen shots by Gary Bradski, 2005 49

Histogram Equalization Screen shots by Gary Bradski, 2005 49

Contours 50

Contours 50

Morphological Operations Examples • Morphology - applying Min-Max. Filters and its combinations Image I

Morphological Operations Examples • Morphology - applying Min-Max. Filters and its combinations Image I Erosion I B Closing I • B= (I B) B Grad(I)= (I B)-(I B) Dilatation I B Opening Io. B= (I B) B Top. Hat(I)= I - (I B) Black. Hat(I)= (I B) - I

Image textures • • Inpainting: Removes damage to images, in this case, it removes

Image textures • • Inpainting: Removes damage to images, in this case, it removes the text.

Segmentation • Pyramid, mean-shift, graph-cut • Here: Watershed Screen shots by Gary Bradski, 2005

Segmentation • Pyramid, mean-shift, graph-cut • Here: Watershed Screen shots by Gary Bradski, 2005 53 53

Recent Algorithms: Grab. Cut Algorithms: • Graph Cut based segmentation Images by Gary Bradski,

Recent Algorithms: Grab. Cut Algorithms: • Graph Cut based segmentation Images by Gary Bradski, © 2010 54

Motion Templates (work with James Davies) • • Object silhouette Motion history images Motion

Motion Templates (work with James Davies) • • Object silhouette Motion history images Motion history gradients Motion segmentation algorithm silhouette MHI MHG Charts by Gary Bradski, 2005 55

Segmentation, Motion Tracking and Gesture Recognition Motion Segmentation Pose Recognition Gesture Recognition Screen shots

Segmentation, Motion Tracking and Gesture Recognition Motion Segmentation Pose Recognition Gesture Recognition Screen shots by Gary Bradski, 2005

New Optical Flow Algorithms // opencv/samples/c/lkdemo. c int main(…){ … Cv. Capture* capture =

New Optical Flow Algorithms // opencv/samples/c/lkdemo. c int main(…){ … Cv. Capture* capture = <…> ? cv. Capture. From. CAM(camera_id) : cv. Capture. From. File(path); lkdemo. c, 190 lines if( !capture ) return -1; (needs camera to run) for(; ; ) { Ipl. Image* frame=cv. Query. Frame(capture); if(!frame) break; // … copy and process image cv. Calc. Optical. Flow. Pyr. LK( …) cv. Show. Image( “Lk. Demo”, result ); c=cv. Wait. Key(30); // run at ~20 -30 fps speed if(c >= 0) { // process key }} cv. Release. Capture(&capture); }

Tracking with CAMSHIFT • Control game with head Screen shots by Gary Bradski, 2005

Tracking with CAMSHIFT • Control game with head Screen shots by Gary Bradski, 2005

Projections Screen shots by Gary Bradski, 2005

Projections Screen shots by Gary Bradski, 2005

Stereo … Depth from Triangulation • Involved topic, here we will just skim the

Stereo … Depth from Triangulation • Involved topic, here we will just skim the basic geometry. • Imagine two perfectly aligned image planes: Depth “Z” and disparity “d” are inversly related: 60

Stereo • In aligned stereo, depth is from similar triangles: • Problem: Cameras are

Stereo • In aligned stereo, depth is from similar triangles: • Problem: Cameras are almost impossible to align • Solution: Mathematically align them: 61 All: Gary Bradski and Adrian Kaehler: Learning Open. CV

Stereo Rectification • Algorithm steps are shown at right: • Goal: – Each row

Stereo Rectification • Algorithm steps are shown at right: • Goal: – Each row of the image contains the same world points – “Epipolar constraint” Result: Epipolar alignment of features: All: Gary Bradski and Adrian Kaehler: Learning Open. CV 62

Outline • • • Open. CV Overview Cheatsheet Simple Programs Tour Features 2 D

Outline • • • Open. CV Overview Cheatsheet Simple Programs Tour Features 2 D Applications Gary Bradski, 2009 63

Features 2 d contents Detection Description Matching Matchers available • • • Detectors available

Features 2 d contents Detection Description Matching Matchers available • • • Detectors available • • SIFT SURF FAST STAR MSER HARRIS GFTT (Good Features To Track) Descriptors available • • • SIFT SURF Calonder Ferns One way Brute. Force Flann. Based BOW Matches filters (under construction) • Cross check • Ratio check

Detector interfaces class Feature. Detector { public: virtual ~Feature. Detector() {} // Detect keypoints

Detector interfaces class Feature. Detector { public: virtual ~Feature. Detector() {} // Detect keypoints in an image. virtual void detect( const Mat& image, vector<Key. Point>& keypoints, const Mat& mask=Mat() ) const = 0; // Detect keypoints in an image set. void detect( const vector<Mat>& image. Collection, vector<Key. Point> >& point. Collection, const vector<Mat>& masks=vector<Mat>() ) const; virtual void read( const File. Node& fn ) {} virtual void write( File. Storage& fs ) const {} protected: … };

Creating a detector • Statically Surf. Feature. Detector detector; • Using class factory cv:

Creating a detector • Statically Surf. Feature. Detector detector; • Using class factory cv: : Ptr<Feature. Detector> detector = create. Feature. Detector(“SURF”);

Running detector Mat img = imread( "test. png" ); vector<Key. Point> keypoints; Surf. Feature.

Running detector Mat img = imread( "test. png" ); vector<Key. Point> keypoints; Surf. Feature. Detector detector; detector. detect( img, keypoints );

Descriptor interfaces • For descriptors that can be represented as vectors in multidimensional space:

Descriptor interfaces • For descriptors that can be represented as vectors in multidimensional space: Descriptor. Extractor and Descriptor. Matcher • More general interface (one way, decisiontree-based descriptors): Generic. Descriptor. Matcher

Descriptor. Extractor interfaces class CV_EXPORTS Descriptor. Extractor { public: virtual ~Descriptor. Extractor() {} //

Descriptor. Extractor interfaces class CV_EXPORTS Descriptor. Extractor { public: virtual ~Descriptor. Extractor() {} // Compute the descriptors for a set of keypoints in an image. virtual void compute( const Mat& image, vector<Key. Point>& keypoints, Mat& descriptors ) const = 0; // Compute the descriptors for a keypoints collection detected in image collection. void compute( const vector<Mat>& image. Collection, vector<Key. Point> >& point. Collection, vector<Mat>& desc. Collection ) const; virtual void read( const File. Node& ) {} virtual void write( File. Storage& ) const {} virtual int descriptor. Size() const = 0; virtual int descriptor. Type() const = 0; protected: … };

Descriptor. Extractor creating • Statically Surf. Descriptor. Extractor descriptor. Extractor; • Using class factory

Descriptor. Extractor creating • Statically Surf. Descriptor. Extractor descriptor. Extractor; • Using class factory cv: : Ptr<Descriptor. Extractor> descriptor. Extractor = create. Descriptor. Extractor("SURF");

Descriptor. Extractor running Ptr<Feature. Detector> detector = create. Feature. Detector("FAST"); Ptr<Descriptor. Extractor> descriptor. Extractor

Descriptor. Extractor running Ptr<Feature. Detector> detector = create. Feature. Detector("FAST"); Ptr<Descriptor. Extractor> descriptor. Extractor = create. Descriptor. Extractor("SURF"); vector<Key. Point> keypoints; detector->detect( img, keypoints ); Mat descriptors; descriptor. Extractor->compute( img, keypoints, descriptors );

Descriptor. Matcher interfaces • Two groups of match methods – to match descriptors of

Descriptor. Matcher interfaces • Two groups of match methods – to match descriptors of image pair – to match descriptors of one image to image set • Each group consists from tree type methods – match() – knn. Match() – radius. Match()

Matching of image pair // detecting keypoints Surf. Feature. Detector detector; vector<Key. Point> keypoints

Matching of image pair // detecting keypoints Surf. Feature. Detector detector; vector<Key. Point> keypoints 1, keypoints 2; detector. detect( img 1, keypoints 1 ); detector. detect( img 2, keypoints 2 ); // computing descriptors Surf. Descriptor. Extractor extractor; Mat descriptors 1, descriptors 2; extractor. compute( img 1, keypoints 1, descriptors 1 ); extractor. compute( img 2, keypoints 2, descriptors 2 ); // matching descriptors Brute. Force. Matcher<L 2<float> > matcher; vector<DMatch> matches; matcher. match( descriptors 1, descriptors 2, matches );

Visualize keypoints Mat img_points; draw. Keypoints( img, keypoints, img_points ); named. Window( “keypoints”, 1

Visualize keypoints Mat img_points; draw. Keypoints( img, keypoints, img_points ); named. Window( “keypoints”, 1 ); imshow( “keypoints”, img_points ); wait. Key(); Visualize matches Mat img_matches; draw. Matches( img 1, keypoints 1, img 2, keypoints 2, img_matches); named. Window( “matches”, 1 ); imshow( “matches”, img_matches ); wait. Key();

Running the sample • Download Open. CV • Compile • Run matcher_simple: bin/matcher_simple. .

Running the sample • Download Open. CV • Compile • Run matcher_simple: bin/matcher_simple. . /opencv/samples/c/box. png . . /opencv/samples/c/box_in_scene. png • Select a detector that gives the maximum number of keypoints • Switch SIFT and SURF descriptors

Cross-check outlier match filtering Brute. Force. Matcher<L 2<float> > descriptor. Matcher; vector<DMatch> filtered. Matches

Cross-check outlier match filtering Brute. Force. Matcher<L 2<float> > descriptor. Matcher; vector<DMatch> filtered. Matches 12, matches 21; descriptor. Matcher. match( descriptors 1, descriptors 2, matches 12 ); descriptor. Matcher. match( descriptors 2, descriptors 1, matches 21 ); for( size_t i = 0; i < matches 12. size(); i++ ) { DMatch forward = matches 12[i]; DMatch backward = matches 21[forward. train. Idx]; if( backward. train. Idx == forward. query. Idx ) filtered. Matches 12. push_back( forward ); }

Ratio test to filter matches (less is better)

Ratio test to filter matches (less is better)

Calculating inliers (planar objects case) • • • Detect keypoints Find matches using descriptors

Calculating inliers (planar objects case) • • • Detect keypoints Find matches using descriptors Filter matches using cross-check Calculate best homography Filter outliers Run bin/descriptor_extractor_matcher SURF . . /opencv/samples/c/box. png . . /opencv/samples/c/box_in_scene. png 3 The last parameter is the reprojection threshold for RANSAC

Detector testbench • Measures of detector repeatability are taken from – K. Mikolajczyk, Cordelia

Detector testbench • Measures of detector repeatability are taken from – K. Mikolajczyk, Cordelia Schmid, “Scale & Affine Invariant Interest Point Detectors”, IJCV 60(1), 63– 86, 2004. – K. Mikolajczyk et al, A Comparison of Affine Region Detectors, IJCV 65(1/2): 43 -72, 2005. • Test images are taken from http: //www. robots. ox. ac. uk/~vgg/data-aff. html • Testbench is located in opencv_extra/testdata/cv/detectors_descriptors_evaluation/ detectors

Descriptor testbench • Measures of descriptor matching accuracy are taken from http: //www. robots.

Descriptor testbench • Measures of descriptor matching accuracy are taken from http: //www. robots. ox. ac. uk/~vgg/research/affine/det_eval_files/mikolaj czyk_pami 2004. pdf • Test images are taken from http: //www. robots. ox. ac. uk/~vgg/data-aff. html • Testbench is located in opencv_extra/testdata/cv/detectors_descriptors_evaluation/ descriptors

Open. CV and ROS • Opencv 2 package to fetch and compile opencv •

Open. CV and ROS • Opencv 2 package to fetch and compile opencv • Messages: – sensor_msgs: : Image – sensor_msgs: : Camera. Info • cv_bridge to convert between messages and images • image_geometry: : Pinhole. Camera. Model and image_geometry: : Stereo. Camera. Model to manage 2 d <-> 3 d conversions

Q&A • Foils will be available at http: //itseez. com

Q&A • Foils will be available at http: //itseez. com