欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android端OpenCV的ORB特征点检测

程序员文章站 2022-06-11 11:19:29
...

不知道android调用opencv的可以看这里.

1、Java代码

private Mat mIntermediateMat;
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
        mIntermediateMat = inputFrame.rgba();
        Orbcreate(mIntermediateMat.nativeObj);
        FAST_num=getOrbnum();
        match_num=getMatchnum();
        num_FAST.setText("ORB角点数量:" + FAST_num" );
        return mIntermediateMat;
    }
public native void Orbcreate(long rgba);
public native int getOrbnum();

2、布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Main2Activity">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
    <TextView
        android:id="@+id/num_FAST"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="null"
        android:textSize="15sp"/>

    <org.opencv.android.JavaCameraView
        android:id="@+id/image_manipulations_activity_surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
var foo = 'bar';

3、jni的c++代码

#include <jni.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <android/log.h>
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int Orbnum=0;
extern "C"
JNIEXPORT void JNICALL
Java_com_example_camerasensor_Main2Activity_Orbcreate(JNIEnv *env, jobject thiz, jlong jrgba) {
    // TODO: implement Orbcreate()
    Mat img=*(Mat *) jrgba;
    Mat &rgba = *(Mat *) jrgba;
    vector<KeyPoint> keypoints1,keypoints2;
    Mat descriptors1,descriptors2;
    Ptr<ORB> orb = ORB::create(500, 1.2f, 8, 31, 0, 2, ORB::HARRIS_SCORE,31,20 );
    /*
 * ORB算法
 *  nfeatures - 最多提取的特征点的数量;
 *  scaleFactor - 金字塔图像之间的尺度参数,类似于SIFT中的kk;
 *  nlevels – 高斯金字塔的层数;
 *  edgeThreshold – 边缘阈值,这个值主要是根据后面的patchSize来定的,靠近边缘
 *  edgeThreshold以内的像素是不检测特征点的。
 * firstLevel - 看过SIFT都知道,我们可以指定第一层的索引值,这里默认为0。
 * scoreType - 用于对特征点进行排序的算法,你可以选择HARRIS_SCORE,也可以选择
 * FAST_SCORE,但是它也只是比前者快一点点而已。
 * patchSize – 用于计算BIREF描述子的特征点邻域大小。
 * fastThreshold 没解释
 * */

    //检测角点位置
    orb->detect(img,keypoints1);

    //根据角点位置计算brief描述子
    orb->compute(img,keypoints1,descriptors1);

//    rgba = Scalar::all(0);
    drawKeypoints(img,keypoints1,rgba, Scalar::all(-1),DrawMatchesFlags::DEFAULT);

    Orbnum=descriptors1.rows;
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_camerasensor_Main2Activity_getOrbnum(JNIEnv *env, jobject thiz) {
    // TODO: implement getOrbnum()
    return Orbnum;
}

4、效果

Android端OpenCV的ORB特征点检测