From 9d454fed93477f39e42d855f4097d982d36d988c Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Tue, 28 Nov 2023 13:30:46 +0300 Subject: [PATCH] Fix build for Android sample mobilenet-ssd detector. --- samples/android/CMakeLists.txt | 1 + .../mobilenet-objdetect/CMakeLists.txt | 20 ++++ .../gradle/AndroidManifest.xml | 10 +- .../mobilenet-objdetect/res/drawable/icon.png | Bin 0 -> 1997 bytes .../res/values/strings.xml | 3 +- .../opencv_mobilenet/MainActivity.java | 92 ++++++++++++------ 6 files changed, 86 insertions(+), 40 deletions(-) create mode 100644 samples/android/mobilenet-objdetect/res/drawable/icon.png diff --git a/samples/android/CMakeLists.txt b/samples/android/CMakeLists.txt index 360a2189b8..f4fe882447 100644 --- a/samples/android/CMakeLists.txt +++ b/samples/android/CMakeLists.txt @@ -12,6 +12,7 @@ add_subdirectory(qr-detection) add_subdirectory(image-manipulations) add_subdirectory(camera-calibration) add_subdirectory(color-blob-detection) +add_subdirectory(mobilenet-objdetect) add_subdirectory(tutorial-1-camerapreview) add_subdirectory(tutorial-2-mixedprocessing) add_subdirectory(tutorial-3-cameracontrol) diff --git a/samples/android/mobilenet-objdetect/CMakeLists.txt b/samples/android/mobilenet-objdetect/CMakeLists.txt index 4e41ebfb28..85abfae6a7 100644 --- a/samples/android/mobilenet-objdetect/CMakeLists.txt +++ b/samples/android/mobilenet-objdetect/CMakeLists.txt @@ -1,5 +1,25 @@ set(sample example-mobilenet-objdetect) +ocv_download(FILENAME "mobilenet_iter_73000.caffemodel" + HASH "bbcb3b6a0afe1ec89e1288096b5b8c66" + URL + "${OPENCV_MOBILENET_SSD_WEIGHTS_URL}" + "$ENV{OPENCV_MOBILENET_SSD_WEIGHTS_URL}" + "https://raw.githubusercontent.com/chuanqi305/MobileNet-SSD/97406996b1eee2d40eb0a00ae567cf41e23369f9/mobilenet_iter_73000.caffemodel" + DESTINATION_DIR "${CMAKE_CURRENT_LIST_DIR}/res/raw" + ID OPENCV_MOBILENET_SSD_WEIGHTS + STATUS res) + +ocv_download(FILENAME "deploy.prototxt" + HASH "f1978dc4fe20c680e850ce99830c5945" + URL + "${OPENCV_MOBILENET_SSD_CONFIG_URL}" + "$ENV{OPENCV_MOBILENET_SSD_CONFIG_URL}" + "https://raw.githubusercontent.com/chuanqi305/MobileNet-SSD/97406996b1eee2d40eb0a00ae567cf41e23369f9/deploy.prototxt" + DESTINATION_DIR "${CMAKE_CURRENT_LIST_DIR}/res/raw" + ID OPENCV_MOBILENET_SSD_CONFIG + STATUS res) + add_android_project(${sample} "${CMAKE_CURRENT_SOURCE_DIR}" LIBRARY_DEPS "${OPENCV_ANDROID_LIB_DIR}" SDK_TARGET 11 "${ANDROID_SDK_TARGET}") if(TARGET ${sample}) add_dependencies(opencv_android_examples ${sample}) diff --git a/samples/android/mobilenet-objdetect/gradle/AndroidManifest.xml b/samples/android/mobilenet-objdetect/gradle/AndroidManifest.xml index 473a5db3d0..ef50659a2d 100644 --- a/samples/android/mobilenet-objdetect/gradle/AndroidManifest.xml +++ b/samples/android/mobilenet-objdetect/gradle/AndroidManifest.xml @@ -1,15 +1,11 @@ + package="org.opencv.samples.opencv_mobilenet"> + android:icon="@drawable/icon"> + Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2iyk& z2s4Z(uWcvB1k+?B|HcZ5+p(*;Q^&-8AtzSnVCK7?)^Xiwf0*7z0ZN;t#z9i`sgtpqdV3hDNF*c2bKc!qcQaX zUny)Tz}^_l!dPca%!U9i64N>!i~1_h=?F58~*Mqs?aUag-wNp3eJ zaArHlobMV1PMO^yg*noOAUz|E0i{}8`nIiHOW|~F4mjoR_GH_vZVKN?bHNdXe;To> zxdyn_TnD>62p5lGlR~e9qrf7C+ui6sX@;J1@Mx>Yo=qMBRs~*)bDAoXUZYSHTab?f z_PACCXF@bcF}lW`X>mi~9D%@SGZ2{F%CTpbhLf>?v)%*vE3D~)z{*wz=t^t3pfEGA zffL(4AU5DX%yUkKoB_Jb(8oFW!NI-`j{z#&Z&^_sT-34vIXFYp`=GEPgYAu)4n9D4 z%K`*+8v7m2z|O!Kz|Xto?PB|!;VL`0G=ur`jDlQ$D=+i6dSt)j#Si?i#3rh3ZDkkx z+9TWVDcFEP;8fsZmts4LZyQ^=NS&&oMq^DBPd9*r!p~~YrdwMdQuxcK)CgcvlC7iQ z6m}XDL=_ke!d;S<2IvOy5aI>4B-sk!6i-qAqn6i#qR%}BH;aqaE~#zv6|u2ViZHn? z1hW8E8rkz`nyn$2WU0dhK4^p<)W{{jH|2^S^#FZ&jV&V)7;HC58VOgls*{S?bCuB! zgJG~P)&TrE+Oa9jPq^~G`MQI^ISDar1?}7f7D?&qi-Zc{Oivqep0%xlm22B7?$lt? zRDoZ$&ZSsjO2nE0ft%CR$aVrKp5WRX7^zue>Cw3+QGx=M@MFBYs{CEWmLZ zN*9hpz)s*B96QRjjj`Qi_;Vb>Z73h0DK9}$-axr}l%1BFSp9)x9Ky;`(^n%*$`F!V zkY*oPaAK+6&unXUeSit`5c;F3iU&9)kOVILi%-C3#za9jc>jUr;Wvs~#jZ#FaZ!2fi34Sb1N@BsFCj&@J zs;eb(o@Ffe=D?d6qPKGdXKQjn9~5j94Pu>ge`)`61V~3frX{l7>dTEi%6<8;N9K*(u}%^bWomltk*Vp@k|^lo)yA?qH}(jBlCHBo51XA|gNf(* zoeh<>k{r9Y4)pw$!k7FX&+PyB(?mq~(*^;K7{UQF&X#s!ILS zHX&7zhmyZ|_z=x$C7sRWW=r7+&daHU&gPWWQt)uC*X>tEFZ6J;H6WaAcCCQRo2VjP z>v8^kmJJ*U_eqdHY-p9+xixW&Umgf^mpLS>_nMj zvaJlD2pv8o7#@|SuT=D$XZ)5=GJyZFvEPhNoO#NE^Nc>q2{?8F#Z+({^MQk9zw9zH z=)VjA4HzfT(Fq(eDSwVGl!7_^3!$70OgHG7MYIxpx7Q{~Cgnag|7WoceAizs@IKwlGBBq*Ioi0qby4ylKkgqvR5BcLR&Vy39?8 - opencv_mobilenet + OCV Mobilenet Objdetect diff --git a/samples/android/mobilenet-objdetect/src/org/opencv/samples/opencv_mobilenet/MainActivity.java b/samples/android/mobilenet-objdetect/src/org/opencv/samples/opencv_mobilenet/MainActivity.java index f14cf1737c..e2add816c6 100644 --- a/samples/android/mobilenet-objdetect/src/org/opencv/samples/opencv_mobilenet/MainActivity.java +++ b/samples/android/mobilenet-objdetect/src/org/opencv/samples/opencv_mobilenet/MainActivity.java @@ -3,15 +3,17 @@ package org.opencv.samples.opencv_mobilenet; import android.content.Context; import android.content.res.AssetManager; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.util.Log; +import android.widget.Toast; +import org.opencv.android.CameraActivity; import org.opencv.android.CameraBridgeViewBase; import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame; import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import org.opencv.android.OpenCVLoader; import org.opencv.core.Core; import org.opencv.core.Mat; +import org.opencv.core.MatOfByte; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.core.Size; @@ -19,13 +21,12 @@ import org.opencv.dnn.Net; import org.opencv.dnn.Dnn; import org.opencv.imgproc.Imgproc; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileOutputStream; +import java.io.InputStream; import java.io.IOException; -import android.widget.Toast; +import java.util.Collections; +import java.util.List; -public class MainActivity extends AppCompatActivity implements CvCameraViewListener2 { +public class MainActivity extends CameraActivity implements CvCameraViewListener2 { @Override public void onResume() { @@ -46,6 +47,17 @@ public class MainActivity extends AppCompatActivity implements CvCameraViewListe return; } + mModelBuffer = loadFileFromResource(R.raw.mobilenet_iter_73000); + mConfigBuffer = loadFileFromResource(R.raw.deploy); + if (mModelBuffer == null || mConfigBuffer == null) { + Log.e(TAG, "Failed to load model from resources"); + } else + Log.i(TAG, "Model files loaded successfully"); + + + net = Dnn.readNet("caffe", mModelBuffer, mConfigBuffer); + Log.i(TAG, "Network loaded successfully"); + setContentView(R.layout.activity_main); // Set up camera listener. @@ -54,12 +66,30 @@ public class MainActivity extends AppCompatActivity implements CvCameraViewListe mOpenCvCameraView.setCvCameraViewListener(this); } + @Override + public void onPause() + { + super.onPause(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); + } + + @Override + protected List getCameraViewList() { + return Collections.singletonList(mOpenCvCameraView); + } + + public void onDestroy() { + super.onDestroy(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); + + mModelBuffer.release(); + mConfigBuffer.release(); + } + // Load a network. public void onCameraViewStarted(int width, int height) { - String proto = getPath("MobileNetSSD_deploy.prototxt", this); - String weights = getPath("MobileNetSSD_deploy.caffemodel", this); - net = Dnn.readNetFromCaffe(proto, weights); - Log.i(TAG, "Network loaded successfully"); } public Mat onCameraFrame(CvCameraViewFrame inputFrame) { @@ -71,6 +101,7 @@ public class MainActivity extends AppCompatActivity implements CvCameraViewListe final double THRESHOLD = 0.2; // Get a new frame + Log.d(TAG, "handle new frame!"); Mat frame = inputFrame.rgba(); Imgproc.cvtColor(frame, frame, Imgproc.COLOR_RGBA2RGB); @@ -117,32 +148,27 @@ public class MainActivity extends AppCompatActivity implements CvCameraViewListe public void onCameraViewStopped() {} - // Upload file to storage and return a path. - private static String getPath(String file, Context context) { - AssetManager assetManager = context.getAssets(); - - BufferedInputStream inputStream = null; + private MatOfByte loadFileFromResource(int id) { + byte[] buffer; try { - // Read data from assets. - inputStream = new BufferedInputStream(assetManager.open(file)); - byte[] data = new byte[inputStream.available()]; - inputStream.read(data); - inputStream.close(); + // load cascade file from application resources + InputStream is = getResources().openRawResource(id); - // Create copy file in storage. - File outFile = new File(context.getFilesDir(), file); - FileOutputStream os = new FileOutputStream(outFile); - os.write(data); - os.close(); - // Return a path to file which may be read in common way. - return outFile.getAbsolutePath(); - } catch (IOException ex) { - Log.i(TAG, "Failed to upload a file"); + int size = is.available(); + buffer = new byte[size]; + int bytesRead = is.read(buffer); + is.close(); + } catch (IOException e) { + e.printStackTrace(); + Log.e(TAG, "Failed to ONNX model from resources! Exception thrown: " + e); + (Toast.makeText(this, "Failed to ONNX model from resources!", Toast.LENGTH_LONG)).show(); + return null; } - return ""; + + return new MatOfByte(buffer); } - private static final String TAG = "OpenCV/Sample/MobileNet"; + private static final String TAG = "OpenCV-MobileNet"; private static final String[] classNames = {"background", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", @@ -150,6 +176,8 @@ public class MainActivity extends AppCompatActivity implements CvCameraViewListe "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"}; - private Net net; + private MatOfByte mConfigBuffer; + private MatOfByte mModelBuffer; + private Net net; private CameraBridgeViewBase mOpenCvCameraView; }