demo: http://download.youkuaiyun.com/detail/keen_zuxwang/9852587
MainActivity.java:
...
public int doFeatureDetect(int detect_type)
{
int length0, length1;
Mat img_object = new Mat();
Mat img_scene = new Mat();
Utils.bitmapToMat(bt1, img_object);
Utils.bitmapToMat(bt2, img_scene);
/*
FAST = 1,
STAR = 2,
SIFT = 3,
SURF = 4,
ORB = 5,
MSER = 6,
GFTT = 7,
HARRIS = 8,
SIMPLEBLOB = 9,
DENSE = 10,
BRISK = 11,
GRIDRETECTOR = 1000,
*/
//-- Step 1: Detect the keypoints using SURF Detector
FeatureDetector detector;
String str_detect;
Log.i("Feature", " detect_type = "+detect_type);
switch(detect_type){
case 1:
detector = FeatureDetector.create(FeatureDetector.FAST); // ok
str_detect = "FAST";
break;
case 2:
detector = FeatureDetector.create(FeatureDetector.STAR); // ok
str_detect = "STAR";
break;
case 3:
detector = FeatureDetector.create(FeatureDetector.SIFT);
str_detect = "SIFT";
break;
case 4:
detector = FeatureDetector.create(FeatureDetector.SURF);
str_detect = "SURF";
break;
case 5:
detector = FeatureDetector.create(FeatureDetector.ORB); // ok
str_detect = "ORB";
break;
case 6:
detector = FeatureDetector.create(FeatureDetector.MSER);
str_detect = "MSER";
break;
case 7:
detector = FeatureDetector.create(FeatureDetector.GFTT);
str_detect = "GFTT";
break;
case 8:
detector = FeatureDetector.create(FeatureDetector.HARRIS); // ok
str_detect = "HARRIS";
break;
case 9:
detector = FeatureDetector.create(FeatureDetector.SIMPLEBLOB);
str_detect = "SIMPLEBLOB";
break;
case 10:
detector = FeatureDetector.create(FeatureDetector.DENSE);
str_detect = "DENSE";
break;
case 11:
detector = FeatureDetector.create(FeatureDetector.BRISK);
str_detect = "BRISK";
break;
case 12:
detector = FeatureDetector.create(FeatureDetector.GRIDRETECTOR);
str_detect = "GRIDRETECTOR";
break;
default:
detector = FeatureDetector.create(FeatureDetector.FAST);
str_detect = "FAST";
break;
}
MatOfKeyPoint keypoints_object = new MatOfKeyPoint();
MatOfKeyPoint keypoints_scene = new MatOfKeyPoint();
detector.detect(img_object, keypoints_object);
detector.detect(img_scene, keypoints_scene);
KeyPoint[] obj_item0 = keypoints_object.toArray();
KeyPoint[] obj_item1 = keypoints_scene.toArray();
length0 = obj_item0.length;
length1 = obj_item1.length;
Log.i("Feature", " length0 = "+length0+", length1 = "+length1);
for( int i = 0; i < length0; i++ ) {
//-- Get the keypoints
Point pts = obj_item0[i].pt;
Core.rectangle(img_object,
new Point(pts.x-5, pts.y-5),
new Point(pts.x+5, pts.y+5),
new Scalar(0, 255, detect_type*20),
2);
}
for( int i = 0; i < length1; i++ ) {
//-- Get the keypoints
Point pts = obj_item1[i].pt;
Core.rectangle(img_scene,
new Point(pts.x-5, pts.y-5),
new Point(pts.x+5, pts.y+5),
new Scalar(0, 255, detect_type*20),
2);
}
bt3 = Bitmap.createBitmap(img_object.cols(), img_object.rows(), Config.RGB_565);
Utils.matToBitmap(img_object, bt3);
iv0.setImageBitmap(bt3);
bt4 = Bitmap.createBitmap(img_scene.cols(), img_scene.rows(), Config.RGB_565);
Utils.matToBitmap(img_scene, bt4);
iv1.setImageBitmap(bt4);
Log.w("Feature"," FeatureDetector \n");
return 1;
}
..
JNI:
orbhog.cpp
JNIEXPORT jlong JNICALL Java_com_example_orbhog_MainActivity_doHarris(JNIEnv *env, jclass clz, jlong imageGray)
{
int win_size=15;//10;
int r=3;
int count=0;
const int MAX_COUNT=500; // 500
double quality=0.01;
double min_distance= 15;//10;
CvPoint2D32f *points[2]={0,0};
points[1]=(CvPoint2D32f*)cvAlloc(MAX_COUNT*sizeof(points[0][0]));
Mat pImg = Mat(*(Mat*)imageGray);
IplImage temp_src = pImg;
IplImage* imageg = &temp_src;
IplImage* grey=cvCreateImage(cvSize(imageg->width, imageg->height), IPL_DEPTH_8U, 1);
cvCvtColor(imageg, grey, CV_BGR2GRAY); // 1、灰度图
//goodFeaturesToTrack(pGray, features, maxCount, qLevel, minDist);
//automatic initialization
IplImage* eig=cvCreateImage(cvGetSize(grey),32,1);
IplImage* temp=cvCreateImage(cvGetSize(grey),32,1);
count=MAX_COUNT;
cvGoodFeaturesToTrack(grey, eig, temp,
points[1],
&count,
quality,
min_distance,
0,
3,
0,
0.04); //读取第一帧影像
//能够将角点位置精确到亚像素级精度,提取易于跟踪的特征点,特征点精确描述
cvFindCornerSubPix(grey, points[1], count,
cvSize(win_size,win_size),
cvSize(-1,-1), // cvSize(1,1)就表示成忽略掉相邻1个像素
cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03)); //迭代次数iteration最小精度epsilon
for(int i=0;i<count;i++){
cvRectangle(imageg, cvPoint(points[1][i].x-r,points[1][i].y-r),cvPoint(points[1][i].x+r, points[1][i].y+r), cvScalar(0,0,255), 2);
}
cvReleaseImage(&eig);
cvReleaseImage(&temp);
Mat *hist = new Mat(imageg);
return (jlong) hist;
}
Harris:
Orb:
Fast:
Harris (cvGoodFeaturesToTrack):