日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android 通過cmake的方式接入opencv的方法步驟

瀏覽:286日期:2022-09-24 18:29:06

簡述

上篇 我們通過Java sdk的方式已經將opencv接入到項目中了,如果想使用opencv sdk 提供的 C++ 頭文件與 .so動態庫,自己封裝jni這樣使用上篇的方式顯然是不能實現的。所以本篇我們介紹通過cmake的方式接入opencv。

接入步驟

1、新建jni項目

Android 通過cmake的方式接入opencv的方法步驟

具體創建過程參考上篇:通過Java sdk方式接入opencv 。

2、導入so庫

在項目app/src/main目錄下新建jniLibs,并將解壓后的opencv sdk 目錄下對應的路徑 sdk/native/libs 中的文件復制到jniLibs中。

Android 通過cmake的方式接入opencv的方法步驟

Android 通過cmake的方式接入opencv的方法步驟

2、導入cpp文件

將opencv sdk 目錄下對應的路徑 sdk/native/jni/include 中的文件復制到cpp目錄中。

Android 通過cmake的方式接入opencv的方法步驟

Android 通過cmake的方式接入opencv的方法步驟

3、修改CMakeLists

將src/main/cpp 中的CMakeLists移動到app目錄下。

Android 通過cmake的方式接入opencv的方法步驟

2.修改CMakeLists中的內容

# For more information about using CMake with Android Studio, read the# documentation: https://d.android.com/studio/projects/add-native-code.html# 設置CMAKE的版本號cmake_minimum_required(VERSION 3.4.1)# 設置include文件夾的地址include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)# 設置opencv的動態庫add_library(libopencv_java4 SHARED IMPORTED)set_target_properties(libopencv_java4 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_java4.so)add_library( # Sets the name of the library. native-lib #.so庫名 可自定義 # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/native-lib.cpp)find_library( # Sets the name of the path variable. log-lib # Specifies the name of the NDK library that # you want CMake to locate. log)target_link_libraries( # Specifies the target library. native-lib libopencv_java4 # Links the target library to the log library # included in the NDK. ${log-lib})

修改app 中的build.gradle文件 defaultConfig 中配置cmake和ndk

externalNativeBuild { cmake { cppFlags '-std=c++11' arguments '-DANDROID_STL=c++_shared' }}ndk{ abiFilters 'armeabi-v7a','arm64-v8a'}

android 中配置jniLibs

sourceSets{ main{ jniLibs.srcDirs = [’src/main/jniLibs’] }}

android 中配置cmake和ndk相關

externalNativeBuild { cmake { path file(’CMakeLists.txt’) version '3.10.2' } }splits { abi { enable true reset() include ’x86’, ’x86_64’, ’armeabi-v7a’, ’arm64-v8a’ //select ABIs to build APKs for universalApk true //generate an additional APK that contains all the ABIs }}

如果是老項目則不必配置splits否則會報錯,只需要干掉下面的代碼

splits { abi { enable true reset() include ’x86’, ’x86_64’, ’armeabi-v7a’, ’arm64-v8a’ //select ABIs to build APKs for universalApk true //generate an additional APK that contains all the ABIs }}

最終配置完的代碼為:

apply plugin: ’com.android.application’apply plugin: ’kotlin-android’apply plugin: ’kotlin-android-extensions’android { compileSdkVersion 29 defaultConfig { applicationId 'com.jd.opencv' minSdkVersion 23 targetSdkVersion 29 versionCode 1 versionName '1.0' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' externalNativeBuild { cmake {cppFlags '-std=c++11'arguments '-DANDROID_STL=c++_shared' } } ndk{ abiFilters 'armeabi-v7a','arm64-v8a' } } sourceSets{ main{ jniLibs.srcDirs = [’src/main/jniLibs’] } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(’proguard-android-optimize.txt’), ’proguard-rules.pro’ } } externalNativeBuild { cmake { path file(’CMakeLists.txt’) version '3.10.2' } } splits { abi { enable true reset() include ’x86’, ’x86_64’, ’armeabi-v7a’, ’arm64-v8a’ //select ABIs to build APKs for universalApk true //generate an additional APK that contains all the ABIs } } project.ext.versionCodes = [’armeabi’: 1, ’armeabi-v7a’: 2, ’arm64-v8a’: 3, ’mips’: 5, ’mips64’: 6, ’x86’: 8, ’x86_64’: 9] android.applicationVariants.all { variant -> variant.outputs.each { output -> output.versionCodeOverride = project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) * 1000000 + android.defaultConfig.versionCode } }}dependencies { implementation fileTree(dir: ’libs’, include: [’*.jar’]) implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version' implementation ’androidx.appcompat:appcompat:1.1.0’ implementation ’androidx.core:core-ktx:1.2.0’ implementation ’androidx.constraintlayout:constraintlayout:1.1.3’ testImplementation ’junit:junit:4.12’ androidTestImplementation ’androidx.test.ext:junit:1.1.1’ androidTestImplementation ’androidx.test.espresso:espresso-core:3.2.0’}

使用

我們將一張彩色圖片通過 opencv 處理成一張灰色的照片。

1、編寫處理照片的代碼。

創建native代碼

object NativeLibUtils{ init { System.loadLibrary('native-lib') } external fun bitmap2Grey(pixels: IntArray, w: Int, h: Int): IntArray}

創建 jni 代碼

#include <jni.h>#include <jni.h>#include <string>#include<opencv2/opencv.hpp>#include<iostream>#include <opencv2/imgproc/types_c.h>#include <unistd.h>using namespace cv;using namespace std;extern 'C'JNIEXPORT jintArray JNICALLJava_com_mp5a5_opencv_NativeLibUtils_bitmap2Gray(JNIEnv *env, jobject instance, jintArray pixels, jint w, jint h) { jint *cur_array; jboolean isCopy = static_cast<jboolean>(false); cur_array = env->GetIntArrayElements(pixels, &isCopy); if (cur_array == NULL) { return 0; } Mat img(h, w, CV_8UC4, (unsigned char *) cur_array); cvtColor(img, img, CV_BGRA2GRAY); cvtColor(img, img, CV_GRAY2BGRA); int size = w * h; jintArray result = env->NewIntArray(size); env->SetIntArrayRegion(result, 0, size, (jint *) img.data); env->ReleaseIntArrayElements(pixels, cur_array, 0); return result;}

調用 native 代碼來實現彩色圖片轉換成灰色圖片

private fun showGrayImg() { val w = bitmap.width val h = bitmap.height val pixels = IntArray(w * h) bitmap.getPixels(pixels, 0, w, 0, 0, w, h) val resultData: IntArray = NativeLibUtils.bitmap2Gray(pixels, w, h) val resultImage = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888) resultImage.setPixels(resultData, 0, w, 0, 0, w, h) iv_image.setImageBitmap(resultImage)}

完整轉換的代碼

class OpenCvActivity : AppCompatActivity(), View.OnClickListener { private lateinit var bitmap: Bitmap override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_opencv) bitmap = BitmapFactory.decodeResource(resources, R.mipmap.person) iv_image.setImageBitmap(bitmap) btn_btn1.setOnClickListener(this) btn_btn2.setOnClickListener(this) } override fun onClick(v: View?) { v?.id?.let { when (it) {R.id.btn_btn1 -> { showGrayImg()}R.id.btn_btn2 -> { showRgbImg()} } } } private fun showRgbImg() { bitmap = BitmapFactory.decodeResource(resources, R.mipmap.person) iv_image.setImageBitmap(bitmap) } private fun showGrayImg() { val w = bitmap.width val h = bitmap.height val pixels = IntArray(w * h) bitmap.getPixels(pixels, 0, w, 0, 0, w, h) val resultData: IntArray = NativeLibUtils.bitmap2Gray(pixels, w, h) val resultImage = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888) resultImage.setPixels(resultData, 0, w, 0, 0, w, h) iv_image.setImageBitmap(resultImage) }}

<?xml version='1.0' encoding='utf-8'?><RelativeLayout 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' android:orientation='vertical' tools:context='.MainActivity'> <ImageView android: android:layout_width='match_parent' android:layout_height='match_parent' android:layout_above='@id/ll_location' app:srcCompat='@mipmap/person' /> <LinearLayout android: android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_alignParentBottom='true' android:orientation='horizontal'> <Button android: android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_weight='1' android:text='灰度圖' /> <Button android: android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_weight='1' android:text='色圖' /> </LinearLayout></RelativeLayout>

顯示效果:

Android 通過cmake的方式接入opencv的方法步驟

效果圖

Demo 的 Github 地址 https://github.com/Mp5A5/AndroidOpenCv

到此這篇關于Android 通過cmake的方式接入opencv的方法步驟的文章就介紹到這了,更多相關Android cmake接入opencv內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美专区一区| 亚洲毛片在线| 日韩精品一页| 青青伊人久久| 国产精品久久777777毛茸茸| 国产亚洲第一伦理第一区| 91成人精品在线| 国产美女亚洲精品7777| 国产免费播放一区二区| 久久99精品久久久野外观看| 精品国产精品久久一区免费式| 狠狠久久伊人| 中文字幕成在线观看| 激情久久婷婷| 国产精品99免费看| 久久国产精品毛片| 国产福利资源一区| 久久香蕉国产| 日韩高清一区二区| 国产不卡一区| 亚洲黄页一区| 国产精品sm| 91精品91| 免费看久久久| 午夜精品婷婷| 麻豆精品视频在线观看| 91精品亚洲| 国产精品欧美大片| 午夜一级久久| 国产精品成人3p一区二区三区| 在线天堂资源www在线污| 夜夜嗨网站十八久久| 美女久久久精品| 日韩专区欧美专区| 色网在线免费观看| 久久精品xxxxx| 91久久国产| 国产一区二区三区免费在线 | 欧美国产亚洲精品| 欧美福利专区| 精品理论电影在线| 亚洲成人精品| 国产日产精品一区二区三区四区的观看方式 | 国产日韩欧美一区在线| 神马午夜久久| 久久99精品久久久野外观看| 亚洲一区久久| 一区二区三区四区在线看| 国产午夜精品一区在线观看| 免费欧美日韩| 国产一区欧美| 久久久久久久久99精品大| 开心激情综合| 日韩欧美中文字幕在线视频| 久久一区二区三区喷水| 欧美三级网址| 国产成人精品亚洲日本在线观看| 欧美激情久久久久久久久久久| 亚洲开心激情| 日本亚洲不卡| 日韩一区二区三区四区五区| 综合激情五月婷婷| 中文字幕日韩亚洲| 男女男精品视频网| 在线精品观看| 欧美自拍一区| 国产一区二区三区久久| 国产一区二区久久久久| 国产精品羞羞答答在线观看| 免费精品一区| 久久狠狠婷婷| 蜜臀久久久久久久| 欧美日韩18| 成人精品动漫一区二区三区| 久久精品国内一区二区三区水蜜桃| 久久精品观看| 免费看黄色91| 国产精品欧美三级在线观看| 国产中文字幕一区二区三区| 日韩久久精品| 国产精品毛片在线看| 欧美日韩一区二区三区四区在线观看| 国产精品成人**免费视频| 久久精品国产99| 国产91精品对白在线播放| 亚洲少妇自拍| 精品一区二区三区视频在线播放| 国产精品久久久久av电视剧| 一区视频在线| 欧美黑人巨大videos精品| 亚洲高清毛片| 久久丁香四色| 午夜日韩av| 国产精品欧美一区二区三区不卡| 伊人久久大香线蕉av不卡| 日韩有码av| 国产综合欧美| 国产剧情一区| 影视先锋久久| 国产精品视频一区二区三区| 亚洲精品99| 国产激情精品一区二区三区| 合欧美一区二区三区| 精品视频在线观看网站| 亚洲精品一级| 亚洲香蕉网站| 精品一区二区三区视频在线播放 | 久久久久国产| 你懂的亚洲视频| 日韩一区二区三区在线看| 精品美女在线视频| 欧美日韩va| 亚洲一区二区日韩| 亚洲二区三区不卡| 91精品一区二区三区综合| 色婷婷色综合| 欧美国产极品| 精品一区二区三区中文字幕视频 | 欧美久久亚洲| 中文在线日韩| 亚洲欧美日韩国产一区| 激情五月综合网| 日韩中文影院| 日韩在线播放一区二区| 欧美+亚洲+精品+三区| 91av亚洲| 久久久精品久久久久久96 | 亚洲有吗中文字幕| 亚洲精一区二区三区| 久久国产精品毛片| 日韩专区欧美专区| 亚洲tv在线| 亚洲人成高清| 黑丝一区二区三区| 在线看片日韩| 7777精品| 久久精品免费看| 亚洲天堂免费电影| 亚洲国内精品| 一区二区国产精品| 国产一卡不卡| 人人草在线视频| 午夜久久免费观看| 91成人在线网站| 日本久久精品| 亚洲永久字幕| 久久精品99国产精品| 日本在线高清| 天堂网在线观看国产精品| 四虎成人精品一区二区免费网站| 国产精品欧美在线观看| 欧美黄色网页| 中文一区一区三区免费在线观| 国产麻豆一区二区三区| 99久久www免费| 亚洲综合激情在线| 精品伊人久久久| 首页国产欧美日韩丝袜| 美女尤物国产一区| 狠狠色综合网| 免费亚洲婷婷| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品分类| 欧美福利在线| 精品国产精品久久一区免费式| 国产精品视区| 麻豆成全视频免费观看在线看| 色8久久久久| 久久亚洲在线| 丰满少妇一区| 91成人精品在线| 日韩午夜在线| 色老板在线视频一区二区| 国产精品免费精品自在线观看| 亚洲一区黄色| 亚洲成人国产| 黄色欧美在线| 国产精品115| 亚洲尤物av| 99国产精品99久久久久久粉嫩| 日本一二区不卡| 国际精品欧美精品| 国产精品成人自拍| 国产亚洲一区| 日本成人在线一区| 久久国产精品99国产| 一区在线观看| 国产午夜精品一区二区三区欧美| 另类中文字幕国产精品| 超级白嫩亚洲国产第一| 久久精品理论片| 精品福利久久久| 国产中文欧美日韩在线| 国产伦精品一区二区三区在线播放 | 日韩精品a在线观看91| 首页欧美精品中文字幕| 中文字幕av亚洲精品一部二部| 亚洲欧美日本国产| 少妇精品久久久一区二区| 日本综合精品一区|