当前位置: 首页 > 面试题库 >

通过OpenCV在Android中使用本机功能

车峻熙
2023-03-14
问题内容

我想使用本机函数使用OpenCV + Android。但是,我有点困惑如何使用位图作为参数以及如何返回已编辑位图(或Mat)的值。

因此,例如,我有一个本机函数:

#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>


JNIEXPORT ??? JNICALL Java_com_my_package_name_and_javaclass_myFunction(JNIEnv* env, jobject javaThis, cv::Mat mat1){
    //here will be code to perform filtering, blurring, canny edge detection or similar things.
        //so I want to input a bitmap, edit it and send it back to the Android class.

return ???
    }

所以这里我使用cv ::
Mat作为参数。我知道这是错误的,但是我不确定应该是什么,以及对应的java类中应该是什么。应该是ByteArray吗?然后在上述本地函数中,参数将为jByteArray(或类似参数)?

对于返回对象,我应该放什么呢?应该是数组吗?

基本上,我要寻找的是Java类中的Mat(或位图),将其发送给本机函数进行编辑并返回经过良好编辑的位图。


问题答案:

这是Android的OpenCV教程代码。我记得我花了一段时间才了解JNI约定。只需先研究JNI代码

#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <vector>

using namespace std;
using namespace cv;

extern "C" {
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial3_Sample3View_FindFeatures(JNIEnv* env, jobject thiz, jint width, jint height, jbyteArray yuv, jintArray bgra)
{
    jbyte* _yuv  = env->GetByteArrayElements(yuv, 0);
    jint*  _bgra = env->GetIntArrayElements(bgra, 0);

    Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv);
    Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra);
    Mat mgray(height, width, CV_8UC1, (unsigned char *)_yuv);

    //Please make attention about BGRA byte order
    //ARGB stored in java as int array becomes BGRA at native level
    cvtColor(myuv, mbgra, CV_YUV420sp2BGR, 4);

    vector<KeyPoint> v;

    FastFeatureDetector detector(50);
    detector.detect(mgray, v);
    for( size_t i = 0; i < v.size(); i++ )
        circle(mbgra, Point(v[i].pt.x, v[i].pt.y), 10, Scalar(0,0,255,255));

    env->ReleaseIntArrayElements(bgra, _bgra, 0);
    env->ReleaseByteArrayElements(yuv, _yuv, 0);
}
}

然后是Java代码

package org.opencv.samples.tutorial3;

import android.content.Context;
import android.graphics.Bitmap;

class Sample3View extends SampleViewBase {

    public Sample3View(Context context) {
        super(context);
    }

    @Override
    protected Bitmap processFrame(byte[] data) {
        int frameSize = getFrameWidth() * getFrameHeight();
        int[] rgba = new int[frameSize];

        FindFeatures(getFrameWidth(), getFrameHeight(), data, rgba);

        Bitmap bmp = Bitmap.createBitmap(getFrameWidth(), getFrameHeight(), Bitmap.Config.ARGB_8888);
        bmp.setPixels(rgba, 0/* offset */, getFrameWidth() /* stride */, 0, 0, getFrameWidth(), getFrameHeight());
        return bmp;
    }

    public native void FindFeatures(int width, int height, byte yuv[], int[] rgba);

    static {
        System.loadLibrary("native_sample");
    }
}


 类似资料:
  • null 但是,当我使用ndk-build运行Android.mk时,会出现以下错误: 这是Android.mk的内容: 我在建图书馆,有什么帮助吗? 向jni添加application.mk文件 APP_ABI:=armeabi APP_PLATFORM:=android-9 将Android.mk文件添加到jni(更改LOCAL_SRC_FILES和LOCAL_MODULE值) 将此代码添加到

  • 问题内容: 我想在Eclipse上完成Opencv 2.3的源代码完成工作。我怎样才能做到这一点?程序可以正常运行,但是显示完成[ctrl + space]:“无默认建议”。 问题答案: 对于C / C ++: 在Eclipse中使用CDT 在项目的根目录中,创建项目的Makefile: cmake -G’Eclipse CDT4-Unix Makefiles’ 使用 Eclipse- > Fil

  • 问题内容: 我正在使用 SQL Server 2012 ,我有一个脚本,通过该脚本我将值插入表中,在该脚本中,我必须根据两个参数转换某些变量的格式。 我可以使用或条件来做到这一点。我不能做任何或在数据库中,我可以参考。 还有其他方法,例如在 脚本中 创建或在 脚本 中应用条件以更改值的格式吗? 问题答案: 是的你可以:

  • 您可以使用移动设备的 GPS 追踪 A370的户外训练的路线、速度和距离。需要在您手机上安装 Polar Flow 手机应用程式,并与 A370 配对使用配对,并允许使用手机的位置。 当您在训练下开始户外训练课时,带静态圆圈的 GPS 图标会在您的位置固定时显示,您可以开始追踪训练课。 您需要在训练期间保持您的移动设备。

  • 本文向大家介绍Android 中使用 dlib+opencv 实现动态人脸检测功能,包括了Android 中使用 dlib+opencv 实现动态人脸检测功能的使用技巧和注意事项,需要的朋友参考一下 1 概述 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo。该 demo 在相机预览过程中对人脸进行实时检测,并将检测到的人脸用

  • 问题内容: 我正在编写一个程序,该程序需要在Tkinter窗口中显示视频流。由于还将有用于执行各种功能的按钮,因此我使用网格来组织一切。 以下代码是从“显示”网络摄像头序列TkInter修改而来的,在我的Raspberry Pi上可以正常工作: 但是,将其与Tkinter结合使用是行不通的。(在下面的内容中,我尝试注释掉Display 1,Display 2和都不显示。) 如何显示视频? 问题答案