安卓JNI使用OpenCV

本文详细介绍在安卓项目中集成并优化OpenCV的过程,包括使用NDK和JNI提高调用效率,添加头文件和库引用的步骤,以及使用OpenCV解决多点透视问题的实例。

         OpenCV也有Java数据结构的包,不过计算速度还是很慢,非不得已不使用此种方式调用OpenCV。使用NDK编写底层OpenCv的调用代码,使用JNI对代码进行封装,可以稍微提高一点效率。

        参考链接:http://www.tuicool.com/articles/yaeeuu

        安卓使用OpenCV注意事项:

        注意事项: 包含OpenCV的工程最好放置在 OpenCV-2.4.10-android-sdk\samples 目录下,省却很多 莫名其妙配置的麻烦


一、 添加头文件包含:

       对自己建立的SO包里面的JNI源文件,添加即将使用到的头文件包含:

#include <jni.h>

#include <string.h>
#include <stdio.h>
#include <android/log.h>

<u>#include "rec3D.h"</u>

#ifndef _Included_org_opencv_samples_fd_DetectionBasedTracker
#define _Included_org_opencv_samples_fd_DetectionBasedTracker
#ifdef __cplusplus
extern "C" {
#endif

//JNIEnv* jniEnv;
extern "C" jstring Java_com_example_feeljulygpsmap_FeelJulyActivity_careJuly(JNIEnv *env, jobject thiz) ;
extern "C" jint Java_com_example_feeljulygpsmap_FeelJulyActivity_careJulyIn(JNIEnv *env, jobject thiz,jint showCode) ;
extern "C" jintArray Java_com_example_feeljulygpsmap_FeelJulyActivity_careJulyArray(JNIEnv *env, jobject thiz,jintArray InCode) ;


#ifdef __cplusplus
}
#endif
#endif

        使用到OpenCV的源文件:

#pragma once

#ifndef _REC3D_H
#define _REC3D_H

<u>#include <opencv2/core/core.hpp>
#include <opencv2/video/video.hpp>
#include <opencv2/calib3d/calib3d.hpp></u>

#include <iostream>
#include <vector>

#include <stdlib.h>

using namespace  cv;
using namespace std;

class MyCamera{

public:
	cv::Mat intrinsic_Mat;
	cv::Mat disCoeff;


二、在工程中添加OpenCV的目录包含和库引用

文件:Android.mk

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)
LOCAL_C_INCLUDES := C:\QT\OpenCV-3.0-android-sdk\sdk\native\jni\include

OPENCV_LIB_TYPE   := static

ifeq ("$(wildcard $(OPENCV_MK_PATH))","")  
#try to load OpenCV.mk from default install location  
include C:\QT\OpenCV-3.0-android-sdk\sdk\native\jni\OpenCV.mk 
else  
include $(OPENCV_MK_PATH)  
endif  

#include $(CLEAR_VARS)

LOCAL_MODULE    := feelJulyGpsMap
LOCAL_SRC_FILES := feelJulyGpsMap.cpp \
                   rec3D.cpp

#LOCAL_LDLIBS    := -landroid

LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
include $(BUILD_SHARED_LIBRARY)

在此注意事项:

LOCAL_C_INCLUDES := C:\QT\OpenCV-3.0-android-sdk\sdk\native\jni\include
为OpenCV的C++ 头文件包含目录

include C:\QT\OpenCV-3.0-android-sdk\sdk\native\jni\OpenCV.mk 
为OpenCV的库文件包含目录


三、使用OpenCV编译程序

snip..............................................



四、使用Android Native模式调试C++代码部分

snip.............................




备注:cv::solvePnP使用OpenCv解决多点透视问题!




     

          

转载于:https://www.cnblogs.com/wishchin/p/9200141.html

Android平台上通过JNI调用OpenCV库进行开发,主要涉及环境配置、CMakeLists.txt设置、Java与C++代码编写等步骤。以下是详细的配置与开发指南: ### 1. 环境准备 - **安装Android Studio**:确保你已经安装了最新版本的Android Studio,并且熟悉基本的Android项目构建流程。 - **下载OpenCV Android SDK**:前往[OpenCV官网](https://opencv.org/releases/)下载适用于Android的SDK包(例如`opencv-4.x-android-sdk.zip`),解压后你会得到一个包含`.jar`文件和本地库(`.so`文件)的目录。 - **配置OpenCV到项目中**: - 将解压后的`opencv`文件夹复制到你的Android项目根目录下的`app/src/main/jniLibs/`目录中(如果没有该目录,请手动创建)。 - 同时将`opencv-java4xx.jar`添加到项目的`libs`目录中,并在`build.gradle`中引入它。 ### 2. 配置CMakeLists.txt 为了能够在C++代码中使用OpenCV的功能,需要正确配置`CMakeLists.txt`文件以链接OpenCV库。 ```cmake # 设置OpenCV路径 set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../jniLibs) find_package(OpenCV REQUIRED PATHS ${OpenCV_DIR} NO_DEFAULT_PATH) # 添加OpenCV头文件路径 include_directories(${OpenCV_INCLUDE_DIRS}) # 定义你的native库名称 add_library(native-lib SHARED src/main/cpp/native-lib.cpp) # 链接OpenCV核心模块 target_link_libraries(native-lib ${OpenCV_LIBS}) ``` ### 3. Java端定义JNI方法 在Java类中声明本地方法,用于从Java层调用C++函数。 ```java public class MainActivity extends AppCompatActivity { static { System.loadLibrary("native-lib"); // 加载.so库 } // 声明本地方法 public native void opencvTest(Bitmap bitmap); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imageView = findViewById(R.id.imageView); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test_image); imageView.setImageBitmap(bitmap); opencvTest(bitmap); // 调用OpenCV处理图像 imageView.invalidate(); } } ``` ### 4. C++端实现图像处理逻辑 在`native-lib.cpp`中编写C++代码来处理传入的Bitmap对象并应用OpenCV操作。 ```cpp #include <jni.h> #include <string> #include <android/bitmap.h> #include <opencv2/opencv.hpp> using namespace cv; extern "C" JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_opencv_1test(JNIEnv *env, jobject /* this */, jobject bitmap) { AndroidBitmapInfo info; void* pixels; if (AndroidBitmap_getInfo(env, bitmap, &info) < 0) { return; } if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888 && info.format != ANDROID_BITMAP_FORMAT_RGB_565) { return; } if (AndroidBitmap_lockPixels(env, bitmap, &pixels) < 0) { return; } Mat image(info.height, info.width, CV_8UC4, pixels); // 示例:高斯模糊 GaussianBlur(image, image, Size(101, 101), 0); AndroidBitmap_unlockPixels(env, bitmap); } ``` ### 5. 构建和运行 - 在Android Studio中选择“Build > Make Project”或点击Sync Now同步Gradle。 - 运行你的应用到设备或模拟器上,确保`libnative-lib.so`文件被正确打包进APK,并且可以在`Logcat`中看到相关的日志输出。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值