Skip to main content

getting SURF points of any image

this post uses OPENCV 2.2 and a simple change of the extract feature will allow use on version 2.3

class atsSURF
{
public:
    cv::Mat extractPoints(cv::Mat img)
    {
        int minHessian = 500;
        cv::SurfFeatureDetector detector(minHessian);
        std::vector<cv::KeyPoint> keypoints;
        detector.detect(img,keypoints,img); //opencv 2.2
        //detector.detect(img,keypoints); //opencv 2.3

        cv::SurfDescriptorExtractor extractor;
        cv::Mat descriptor;
        extractor.compute(img,keypoints,descriptor);
        thisDescriptor = descriptor;
        thisKeypoints = keypoints;

        cv::Mat outim = img;
        cv::drawKeypoints(img,keypoints,outim,Scalar::all(-1),
                               cv::DrawMatchesFlags::DEFAULT);
        return outim;
    }
private:
    cv::Mat thisDescriptor;
    std::vector<cv::KeyPoint> thisKeypoints;
};

to run from the main function

int main(int argc, char* argv[])
{
char code = (char)-1;
atsImages im("C:/Users/Aresh/Documents/Visual Studio 2010/Projects/opencvTest/Debug/test_connectedComponent_sameColor_sameShape.jpg");
Mat img = im.read("gray");

atsSURF mypoints;


//cv::Mat ima_gray; //in case in RGB
//cv::cvtColor(img,ima_gray,CV_BGR2GRAY); //convert to gray scale
//cv::Mat outim = mypoints.extractPoints(ima_gray);
 
cv::Mat outim = mypoints.extractPoints(img);
cv::imshow("SURF points", outim);
code = (char)waitKey();
 return 0;
}

and thats all. dont forget the SURF descriptor only accepts GRAY level images. if you feed it a colored image, it will give you the following error:

Unhandled exception at xxxxxx in opencv.exe: Microsoft C++ exception:
cv::Exception at memory location xxxxxxx

Comments

  1. Hi,thank you for the example.Could you clarify certain doubts I have in order to use your code on Opencv2.3 and VS2010.(A) Can I read image by Mat Im=imread("filename.jpg") instead of astImages?Why have you used this?(B)In order to extend your code using videos for object detection,do I have to save the video as gray scale, frame it in gray scale?How to do this for video?(C) When I use your program it exits by saying "Native has exited code" whenever any Surf class is used.Are there specific libraried that I need to import?

    ReplyDelete
  2. Hi,
    yes you can use imread. im using a class so i dont need to rewrite all the imread in different parts.

    no you dont need to save in gray scale. you just need to have a video compatible and extract the frame/Image and convert that to gray scale.

    if you have all the libraries and linkage correct you shouldnt have any trouble.

    ReplyDelete

Post a Comment

Popular posts from this blog

Computing Entropy of an image (CORRECTED)

entropy is a measure of the uncertainty associated with a random variable. basically i want to get a single value representing the entropy of an image. 1. Assign 255 bins for the range of values between 0-255 2. separate the image into its 3 channels 3. compute histogram for each channel 4. normalize all 3 channels unifirmely 5. for each channel get the bin value (Hc) and use its absolute value (negative log is infinity) 6. compute Hc*log10(Hc) 7. add to entropy and continue with 5 until a single value converges 5. get the frequency of each channel - add all the values of the bin 6. for each bin get a probability - if bin 1 = 20 bin 2 = 30 then frequency is 50 and probability is 20/50 and 30/50 then compute using shannon formula  REFERENCE: http://people.revoledu.com/kardi/tutorial/DecisionTree/how-to-measure-impurity.htm class atsHistogram { public:     cv::Mat DrawHistogram(Mat src)     {      ...

Blob Detection, Connected Component (Pure Opencv)

Connected-component labeling (alternatively connected-component analysis, blob extraction, region labeling, blob discovery, or region extraction) is an algorithmic application of graph theory, where subsets of connected components are uniquely labeled based on a given heuristic. Connected-component labeling is not to be confused with segmentation. i got the initial code from this URL: http://nghiaho.com/?p=1102 However the code did not compile with my setup of OpenCV 2.2, im guessing it was an older version. so a refactored and corrected the errors to come up with this Class class atsBlobFinder     {     public:         atsBlobFinder()         {         }         ///Original Code by http://nghiaho.com/?p=1102         ///Changed and added commments. Removed Errors     ...

Region of interest selection ROI

#include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include<opencv2\opencv.hpp> #include <opencv2\highgui\highgui.hpp> int main(int argc, char *argv[]) { CvCapture *capture = 0; IplImage *frame = 0; int key = 0; /* initialize camera */ capture = cvCaptureFromCAM( 0 ); /* always check */ if ( !capture ) { printf("Cannot open initialize webcam!\n" ); exit(0); } /* create a window for the video */ cvNamedWindow( "result", CV_WINDOW_AUTOSIZE ); while( key != 'q' ) { /* get a frame */ frame = cvQueryFrame( capture ); /* always check */ if( !frame ) break; /* sets the Region of Interest*/ cvSetImageROI(frame, cvRect(150, 50, 150, 250)); /* create destination image */ IplImage *img2 = cvCreateImage(cvGetSize(frame), frame->depth, frame->nChannels); /* * do the main processing with subimage here. * in this example, we simply invert the subimage ...