opencv 特征点提取算法 SIFT SURF ORB FAST LBP学习(二)

来源:互联网 发布:python自动化测试虫师 编辑:程序博客网 时间:2024/05/21 17:50

demo: http://download.csdn.net/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):
这里写图片描述

阅读全文
0 0
原创粉丝点击