Tuesday, January 10, 2012

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

2 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