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

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

基于Android studio3.6的JNI教程之ncnn之語(yǔ)義分割ENet

瀏覽:158日期:2022-09-25 10:31:39

代碼鏈接:

https://github.com/watersink/enet-as-linux

本代碼可以在模擬器下進(jìn)行跑。

環(huán)境:

Android studio 3.6

Sdk:android10 api 29

Ndk:r15c

Ncnn:20200226

Opencv:Opencv3.4.1 android sdk

Linux下的代碼測(cè)試:

mkdir buildcd buildcmake ..make./enet

運(yùn)行效果,

基于Android studio3.6的JNI教程之ncnn之語(yǔ)義分割ENet

Android開始:

(1)新建工程,

New->New Project->選擇Native c++ ->工程名enet->c++11

(2)app/src/cpp下面增加opencv和ncnn的頭文件,include

基于Android studio3.6的JNI教程之ncnn之語(yǔ)義分割ENet

(3)app/src/main下面增加ncnn 和opencv的靜態(tài)庫(kù)文件和動(dòng)態(tài)庫(kù)文件,

基于Android studio3.6的JNI教程之ncnn之語(yǔ)義分割ENet

(4)app/src/main下面增加模型文件assets

基于Android studio3.6的JNI教程之ncnn之語(yǔ)義分割ENet

(5)修改布局文件,app/src/main/res/layout/ activity_main.xml

<?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' tools:context='.MainActivity'> <LinearLayout android: android:layout_alignParentBottom='true' android:layout_width='match_parent' android:layout_height='wrap_content' android:orientation='horizontal'> <Button android: android:layout_weight='1' android:layout_width='0dp' android:layout_height='wrap_content' android:text='選圖'/> <Button android: android:layout_weight='1' android:layout_width='0dp' android:layout_height='wrap_content' android:text='分割'/> </LinearLayout> <ImageView android: android:layout_width='match_parent' android:layout_height='match_parent' android:layout_above='@id/btn_ll' android:layout_alignParentTop='true' android:layout_marginTop='1dp' android:layout_marginBottom='-1dp' /></RelativeLayout>

(6) app/src/main/java/com/example/enet增加ENET類,

public class ENET { public native boolean Init(byte[] param, byte[] bin); public native float[] Process(Bitmap bitmap); // Used to load the ’native-lib’ library on application startup. static { System.loadLibrary('ENET'); }}

(7) app/src/main/cpp/enet-jni.cpp實(shí)現(xiàn)其jni方法,

extern 'C'JNIEXPORT jboolean JNICALLJava_com_example_enet_ENET_Init(JNIEnv *env, jobject thiz, jbyteArray param, jbyteArray bin) { // TODO: implement Init() ncnn::Mat ncnn_param; ncnn::Mat ncnn_bin; // init param { int len = env->GetArrayLength(param); ncnn_param.create(len, (size_t) 1u); env->GetByteArrayRegion(param, 0, len, (jbyte *) ncnn_param); } // init bin { int len = env->GetArrayLength(bin); ncnn_bin.create(len, (size_t) 1u); env->GetByteArrayRegion(bin, 0, len, (jbyte *) ncnn_bin); } ncnn_net = new ENET(ncnn_param,ncnn_bin); return JNI_TRUE;}extern 'C'JNIEXPORT jfloatArray JNICALLJava_com_example_enet_ENET_Process(JNIEnv *env, jobject thiz, jobject bitmap) { // TODO: implement Process() // ncnn from bitmap ncnn::Mat in; { AndroidBitmapInfo info; AndroidBitmap_getInfo(env, bitmap, &info); int width = info.width; int height = info.height; if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) return NULL; void* indata; AndroidBitmap_lockPixels(env, bitmap, &indata); // 把像素轉(zhuǎn)換成data,并指定通道順序 // 因?yàn)閳D像預(yù)處理每個(gè)網(wǎng)絡(luò)層輸入的數(shù)據(jù)格式不一樣一般為300*300 128*128等等所以這類需要一個(gè)resize的操作可以在cpp中寫,也可以是java讀入圖片時(shí)有個(gè)resize操作 //in = ncnn::Mat::from_pixels_resize((const unsigned char*)indata, ncnn::Mat::PIXEL_RGBA2RGB, width, height,300,300); in = ncnn::Mat::from_pixels(static_cast<const unsigned char *>(indata), ncnn::Mat::PIXEL_RGBA2BGR, width, height); // 下面一行為debug代碼 __android_log_print(ANDROID_LOG_DEBUG, 'ENetJniIn', 'enet_process_has_input1, in.w: %d; in.h: %d in.c:%d ', in.w, in.h,in.c); //AndroidBitmap_unlockPixels(env, bitmap); } { ncnn::Mat out = ncnn_net->process(in); __android_log_print(ANDROID_LOG_DEBUG, 'ENetJniIn', 'enet_process_has_output, in.w: %d; in.h: %d in.c:%d ', out.w, out.h,out.c); int output_wsize = out.w; int output_hsize = out.h; //輸出整理 float *output[output_wsize * output_hsize]; // float類型 for(int i = 0; i< out.h; i++) { for (int j = 0; j < out.w; j++) { output[i*output_wsize + j] = &out.row( i)[j]; } } //建立float數(shù)組 長(zhǎng)度為 output_wsize * output_hsize,如果只是ouput_size相當(dāng)于只有一行的out的數(shù)據(jù)那就是一個(gè)object檢測(cè)數(shù)據(jù) jfloatArray jOutputData = env->NewFloatArray(output_wsize * output_hsize); if (jOutputData == nullptr) return nullptr; env->SetFloatArrayRegion(jOutputData, 0, output_wsize * output_hsize,reinterpret_cast<const jfloat *>(*output)); return jOutputData; }}

(8) app/src/main/java/com/example/enet中MainActivity做具體的調(diào)用實(shí)現(xiàn),

public class MainActivity extends AppCompatActivity { private ENET enet = new ENET(); //java接口實(shí)例化 下面直接利用java函數(shù)調(diào)用NDK c++函數(shù) private Bitmap yourSelectedImage = null; private static final int SELECT_IMAGE = 1; private static final String TAG = MainActivity.class.getName(); private ImageView show_image; private boolean load_result = false; private int[] ddims = {1, 3, 512, 288}; //這里的維度的值要和train model的input 一一對(duì)應(yīng) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { initENet();//初始化模型 Log.e('MainActivity', 'initENet ok'); } catch (IOException e) { Log.e('MainActivity', 'initENet error'); } init_view();//檢測(cè)+view畫圖 } // initialize view private void init_view() { show_image = (ImageView) findViewById(R.id.show_image); Button use_photo = (Button) findViewById(R.id.use_photo); use_photo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { Intent i = new Intent(Intent.ACTION_PICK); i.setType('image/*'); startActivityForResult(i, SELECT_IMAGE); } }); Button detect_photo = (Button) findViewById(R.id.detect_photo); detect_photo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { if (yourSelectedImage == null) return; predict_image(yourSelectedImage); } }); } private void initENet() throws IOException { byte[] param = null; byte[] bin = null; { //用io流讀取二進(jìn)制文件,最后存入到byte[]數(shù)組中 InputStream assetsInputStream = getAssets().open('enet_512288.param.bin');// param: 網(wǎng)絡(luò)結(jié)構(gòu)文件 int available = assetsInputStream.available(); param = new byte[available]; int byteCode = assetsInputStream.read(param); assetsInputStream.close(); } { //用io流讀取二進(jìn)制文件,最后存入到byte上,轉(zhuǎn)換為int型 InputStream assetsInputStream = getAssets().open('enet_512288.bin');//bin: model文件 int available = assetsInputStream.available(); bin = new byte[available]; int byteCode = assetsInputStream.read(bin); assetsInputStream.close(); } load_result = enet.Init(param, bin);// 再將文件傳入java的NDK接口(c++ 代碼中的init接口 ) Log.d('load model', 'ENet_load_model_result:' + load_result); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && null != data) { Uri selectedImage = data.getData(); try { if (requestCode == SELECT_IMAGE) { Bitmap bitmap = decodeUri(selectedImage); Bitmap rgba = bitmap.copy(Bitmap.Config.ARGB_8888, true); // resize to 512x288 yourSelectedImage = Bitmap.createScaledBitmap(rgba, ddims[2], ddims[3], false); show_image.setImageBitmap(yourSelectedImage); } } catch (FileNotFoundException e) { Log.e('MainActivity', 'FileNotFoundException'); return; } } } private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException { // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o); // The new size we want to scale to final int REQUIRED_SIZE = 600; // Find the correct scale value. It should be the power of 2. int width_tmp = o.outWidth, height_tmp = o.outHeight; int scale = 1; while (true) { if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) { break; } width_tmp /= 2; height_tmp /= 2; scale *= 2; } // Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; return BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o2); } // predict image private void predict_image(Bitmap bmp) { // picture to float array Bitmap rgba = bmp.copy(Bitmap.Config.ARGB_8888, true); // resize Bitmap input_bmp = Bitmap.createScaledBitmap(rgba, ddims[2], ddims[3], false); try { // Data format conversion takes too long // Log.d('inputData', Arrays.toString(inputData)); long start = System.currentTimeMillis(); // get predict result float[] result = enet.Process(input_bmp); // time end long end = System.currentTimeMillis(); Log.d(TAG, 'origin predict result:' + Arrays.toString(result)); long time = end - start; Log.d('result length', 'length of result: ' + String.valueOf(result.length)); // 畫布配置 Canvas canvas = new Canvas(input_bmp); //圖像上畫矩形 Paint paint = new Paint(); //continue to draw rect Log.d(TAG, 'result :' + result.length); Log.d(TAG, 'result :' + Arrays.toString(result)); for(int num = 0; num < result.length; num++){ // 畫框 int row =num%ddims[2]; int col = num/ddims[2]; if (result[num]==1){ paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE);//不填充 canvas.drawCircle(row, col, 1, paint); } if (result[num]==2){ paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.STROKE);//不填充 canvas.drawCircle(row, col, 1, paint); } if (result[num]==3){ paint.setColor(Color.GREEN); paint.setStyle(Paint.Style.STROKE);//不填充 canvas.drawCircle(row, col, 1, paint); } } show_image.setImageBitmap(input_bmp); } catch (Exception e) { e.printStackTrace(); } }}

(9) app/src/main/cpp下面修改CMakeLists

cmake_minimum_required(VERSION 3.4.1)include_directories(include)file(GLOB ENET_SRC *.h *.cpp)set(ENET_COMPILE_CODE ${ENET_SRC})add_library(libopencv_java3 SHARED IMPORTED)set_target_properties(libopencv_java3 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libopencv_java3.so) add_library(libncnn STATIC IMPORTED )set_target_properties(libncnn PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libncnn.a)add_library( # Sets the name of the library. ENET ## 為生成.so的文字最好直接和.c名字一樣,需要更改 # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). ${ENET_COMPILE_CODE})##cpp文件的namefind_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. ENET libncnn libopencv_java3 jnigraphics android # Links the target library to the log library # included in the NDK. ${log-lib} )

(10) app/src/下面修改build.gradle,增加下面的設(shè)置,

externalNativeBuild { cmake { arguments '-DANDROID_TOOLCHAIN=clang' cFlags '-fopenmp -O2 -fvisibility=hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math ' cppFlags '-fopenmp -O2 -fvisibility=hidden -fvisibility-inlines-hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math ' arguments '-DANDROID_STL=c++_shared', '-DANDROID_CPP_FEATURES=rtti exceptions' cppFlags '' cppFlags '-std=c++11' cppFlags '-frtti' cppFlags '-fexceptions' } } ndk { abiFilters ’armeabi-v7a’// , ’arm64-v8a’ //,’x86’, ’x86_64’, ’armeabi’ stl 'gnustl_static' }

整體目錄結(jié)構(gòu):

基于Android studio3.6的JNI教程之ncnn之語(yǔ)義分割ENet

最終效果:

基于Android studio3.6的JNI教程之ncnn之語(yǔ)義分割ENet

總結(jié)

到此這篇關(guān)于基于Android studio3.6的JNI教程之ncnn之語(yǔ)義分割ENet的文章就介紹到這了,更多相關(guān)android studio 語(yǔ)義分割enet內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久91麻豆精品国产一区| 久久国产麻豆精品| 午夜久久久久| 国产成人精品一区二区免费看京 | 激情欧美一区二区三区| 日韩国产一区二区| 国产精品自在| 国产乱码精品一区二区三区四区 | 91成人在线网站| av资源中文在线天堂| 国产高清不卡| 日韩中文字幕1| 国产精品一区二区三区www| 国产suv精品一区二区四区视频| 亚洲成人精品| 免费在线观看一区| 石原莉奈在线亚洲二区| 国产欧美日韩一级| 中文一区二区| 欧美少妇精品| 日本天堂一区| 国产麻豆综合| 色综合www| 麻豆一区二区在线| 亚洲一区二区小说| 丝袜诱惑一区二区| 国产欧美一区二区三区精品酒店| 亚洲+小说+欧美+激情+另类| 欧美在线亚洲| 国产精品porn| 91超碰国产精品| 97精品国产福利一区二区三区| 粉嫩av一区二区三区四区五区 | 久久精品一区二区国产| 欧美一区久久久| 亚洲精品国模| 99久久夜色精品国产亚洲1000部| 国产区精品区| 999久久久国产精品| 国产精品久久久一区二区| 欧美日韩一二三四| 亚州av日韩av| 国产精品试看| 免费观看久久av| 亚洲啊v在线| 国产精品毛片久久久| 午夜亚洲福利| 久久精品国语| 国产一区二区三区网| 久久激五月天综合精品| 石原莉奈在线亚洲三区| 极品日韩av| 久久久久.com| 欧美午夜精品一区二区三区电影| 精品中文字幕一区二区三区| 欧美日韩一区二区高清| 亚洲成人日韩| 久久av在线| 亚洲一区不卡| 日韩一区欧美二区| 亚洲欧美日韩国产一区| 91久久黄色| 亚洲精品综合| 亚洲三级观看| 欧美一区91| 国产免费av一区二区三区| 国产日韩欧美三区| 国产精品白浆| 久久不卡国产精品一区二区| 麻豆精品新av中文字幕| 亚洲va中文在线播放免费| 精品不卡一区| 精品成人免费一区二区在线播放| 欧美日韩一二三四| 免费精品视频在线| 国产精品男女| 在线一区视频观看| 免费观看不卡av| 一二三区精品| 欧美激情亚洲| 女人天堂亚洲aⅴ在线观看| 日本成人在线网站| 麻豆网站免费在线观看| 亚洲aa在线| 日韩理论片av| 最新国产精品久久久| 亚洲v天堂v手机在线| 久久99伊人| 日韩av在线中文字幕| 久久网站免费观看| 日韩av有码| 久久精品99久久无色码中文字幕| 蜜臀久久久99精品久久久久久| 香蕉久久一区| 国产亚洲一区| 美女av一区| 日本大胆欧美人术艺术动态| 99国产精品99久久久久久粉嫩| av中文字幕在线观看第一页| 日韩视频网站在线观看| 精品中文字幕一区二区三区四区| 精品久久福利| 青青青免费在线视频| 久久久久久亚洲精品美女| 亚洲精品在线二区| 一区二区小说| 久久一区二区三区喷水| 国产精品色在线网站| 蜜臀a∨国产成人精品| 欧美日韩少妇| 一区免费在线| 视频一区欧美精品| 日韩高清不卡一区| 欧美日本不卡| 日韩一区免费| 欧美日韩va| 日本在线不卡视频| 蜜桃视频一区二区三区在线观看| 亚洲欧美日韩国产一区| 激情久久久久久久| 丝袜美腿诱惑一区二区三区| www.51av欧美视频| 久久精品主播| 夜夜嗨网站十八久久| 图片区亚洲欧美小说区| 男人的天堂久久精品| 免播放器亚洲一区| 日韩综合一区二区| 美女精品久久| 欧美日韩免费看片| 国产精品97| 尤物tv在线精品| 视频一区国产视频| 日韩av中文字幕一区二区三区| 国产精久久一区二区| 亚洲日本网址| 久久国产日韩| 日本伊人久久| sm久久捆绑调教精品一区| 在线亚洲成人| 日本在线成人| 风间由美中文字幕在线看视频国产欧美| 久久久夜精品| 亚洲精品高潮| 国产欧美大片| 国产一区二区三区久久| 久久美女性网| 欧美搞黄网站| 欧美韩一区二区| 久久九九国产| 国产精品最新| 日本精品不卡| 日韩精品免费观看视频| 亚洲风情在线资源| 国产丝袜一区| 免费日韩av片| 九九综合在线| 欧美天堂视频| 国产成人1区| 国产精品嫩模av在线| 亚洲小说春色综合另类电影| 国产欧美大片| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩一区二区中文| 国产成人精品一区二区三区视频| 91成人小视频| 日本成人在线视频网站| 伊人精品久久| 亚洲一区二区三区四区电影 | 老牛国内精品亚洲成av人片| 日韩一区二区三区精品 | 青草国产精品| 亚洲免费福利一区| 亚洲一区二区网站| 午夜精品成人av| 美女网站一区| 99国产精品视频免费观看一公开| 91综合网人人| 亚洲伦乱视频| 日韩欧美精品一区| 欧产日产国产精品视频| 午夜影院一区| 黄色成人91| 亚洲开心激情| 久久av导航| 日本а中文在线天堂| 久久亚洲精品中文字幕蜜潮电影| 欧美黄色一区| 黄毛片在线观看| 99精品网站| 亚洲免费婷婷| 日本午夜精品视频在线观看| 国产精品自拍区| 亚洲三级欧美| av不卡在线看| 日本特黄久久久高潮| 91亚洲国产| 亚洲欧洲国产精品一区| 欧美激情aⅴ一区二区三区| 久久久777|