电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

簡述

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

接入步驟

1、新建jni項目

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

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

2、導(dǎo)入so庫

在項目app/src/main目錄下新建jniLibs,并將解壓后的opencv sdk 目錄下對應(yīng)的路徑 sdk/native/libs 中的文件復(fù)制到j(luò)niLibs中。

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

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

2、導(dǎo)入cpp文件

將opencv sdk 目錄下對應(yīng)的路徑 sdk/native/jni/include 中的文件復(fù)制到cpp目錄中。

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

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

3、修改CMakeLists

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

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

2.修改CMakeLists中的內(nèi)容

# For more information about using CMake with Android Studio, read the# documentation: https://d.android.com/studio/projects/add-native-code.html# 設(shè)置CMAKE的版本號cmake_minimum_required(VERSION 3.4.1)# 設(shè)置include文件夾的地址include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)# 設(shè)置opencv的動態(tài)庫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相關(guān)

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、編寫處理照片的代碼。

創(chuàng)建native代碼

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

創(chuàng)建 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;}

調(diào)用 native 代碼來實現(xiàn)彩色圖片轉(zhuǎn)換成灰色圖片

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)}

完整轉(zhuǎn)換的代碼

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

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

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 心得体会网_心得体会格式范文模板| 机器视觉检测系统-视觉检测系统-机器视觉系统-ccd检测系统-视觉控制器-视控一体机 -海克易邦 | 校服厂家,英伦校服定做工厂,园服生产定制厂商-东莞市艾咪天使校服 | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | 模具ERP_模具管理系统_模具mes_模具进度管理_东莞市精纬软件有限公司 | 铸铝门厂家,别墅大门庭院大门,别墅铸铝门铜门[十大品牌厂家]军强门业 | SMC-ASCO-CKD气缸-FESTO-MAC电磁阀-上海天筹自动化设备官网 | 兰州牛肉面加盟,兰州牛肉拉面加盟-京穆兰牛肉面 | 光伏支架成型设备-光伏钢边框设备-光伏设备厂家 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 | 股指期货-期货开户-交易手续费佣金加1分-保证金低-期货公司排名靠前-万利信息开户 | 学习安徽网| 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 国资灵活用工平台_全国灵活用工平台前十名-灵活用工结算小帮手 | 雷达液位计_超声波风速风向仪_雨量传感器_辐射传感器-山东风途物联网 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 厚壁钢管-厚壁无缝钢管-小口径厚壁钢管-大口径厚壁钢管 - 聊城宽达钢管有限公司 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | 钢格栅板_钢格板网_格栅板-做专业的热镀锌钢格栅板厂家-安平县迎瑞丝网制造有限公司 | 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | 中药超微粉碎机(中药细胞级微粉碎)-百科 | 移动机器人产业联盟官网 | 丹佛斯变频器-Danfoss战略代理经销商-上海津信变频器有限公司 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-沼河浸过滤器 | 德国进口电锅炉_商用电热水器_壁挂炉_电采暖器_电热锅炉[德国宝] | 温州在线网| 快速门厂家批发_PVC快速卷帘门_高速门_高速卷帘门-广州万盛门业 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 冰晶石|碱性嫩黄闪蒸干燥机-有机垃圾烘干设备-草酸钙盘式干燥机-常州市宝康干燥 | 湖南自考_湖南自学考试| 南京欧陆电气股份有限公司-风力发电机官网 | 影视模板素材_原创专业影视实拍视频素材-8k像素素材网 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 艺术涂料_进口艺术涂料_艺术涂料加盟_艺术涂料十大品牌 -英国蒙太奇艺术涂料 | 高通量组织研磨仪-多样品组织研磨仪-全自动组织研磨仪-研磨者科技(广州)有限公司 | 天津市能谱科技有限公司-专业的红外光谱仪_红外测油仪_紫外测油仪_红外制样附件_傅里叶红外光谱技术生产服务厂商 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | 手持式3d激光扫描仪-便携式三维立体扫描仪-北京福禄克斯 | 中医治疗皮肤病_潍坊银康医院「山东」重症皮肤病救治平台 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 |