this post uses OPENCV 2.2 and a simple change of the extract feature will allow use on version 2.3
to run from the main function
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:
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),
{
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;
};
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;
}
{
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
cv::Exception at memory location xxxxxxx
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?
ReplyDeleteHi,
ReplyDeleteyes 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.