OpenCV trong Studio Android


140

Tôi muốn sử dụng thư viện OpenCV trong ứng dụng của mình với Android Studio. Tôi đã làm theo hướng dẫn được tìm thấy ở đây nhưng tôi gặp lỗi

Không tìm thấy cấu hình có tên 'mặc định'

Điều gì có thể sai?

Tôi sử dụng Android Studio 1.0 với lớp 2.2.1.


1
Bây giờ chúng tôi có thể nhập các mô-đun với studio Android và các bước có thể đơn giản hơn nhiều. Bạn có thể thử stackoverflow.com/a/27356635/1180117
Kiran

Cảm ơn bạn, nó hoạt động. Viết nó như một câu trả lời sau đó tôi có thể chấp nhận nó.
Bartosz Bialecki

@BartoszBialecki @Kiran, tôi đã theo dõi nó đến bước 4, tôi không thể tìm thấy nativethư mục trong thư mục của mình. sdk Tôi thiếu thứ gì?
Electron lãng mạn

1
@RomanticElectron bạn phải thêm thư mục natvie từ sdk của thư viện OpenCV, không phải sdk Android.
Bartosz Bialecki

@BartoszBialecki cảm ơn
Electron lãng mạn

Câu trả lời:


312

Các bước dưới đây để sử dụng sdk Android OpenCV trong Android Studio. Đây là phiên bản đơn giản hóa của câu trả lời ( 1 ) SO này.

  1. Tải xuống sdk OpenCV mới nhất cho Android từ OpenCV.org và giải nén tệp zip.
  2. Nhập OpenCV vào Android Studio , Từ tệp -> Mới -> Nhập mô-đun , chọn thư mục sdk / java trong kho lưu trữ opencv đã giải nén.
  3. Cập nhật build.gradle trong mô-đun OpenCV đã nhập để cập nhật 4 trường để khớp với dự án build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion và d) targetSdkVersion.
  4. Thêm phụ thuộc mô-đun bằng Ứng dụng -> Cài đặt mô-đun và chọn tab Phụ thuộc . Nhấp vào biểu tượng + ở dưới cùng, chọn Phụ thuộc mô-đun và chọn mô-đun OpenCV đã nhập.
    • Đối với Android Studio v1.2.2, để truy cập Cài đặt mô-đun: trong chế độ xem dự án, nhấp chuột phải vào mô-đun phụ thuộc -> Mở Cài đặt mô-đun
  5. Sao chép thư mục libs trong sdk / tự nhiên sang Android Studio trong ứng dụng / src / main .
  6. Trong Android Studio, đổi tên thư mục libs đã sao chép thành jniLibs và chúng ta đã hoàn thành.

Bước (6) là do studio Android mong đợi các lib gốc app/src/main/jniLibsthay vì libsthư mục cũ hơn . Đối với những người mới sử dụng Android OpenCV, đừng bỏ lỡ các bước bên dưới

  • bao gồm static{ System.loadLibrary("opencv_java"); }(Lưu ý: đối với OpenCV phiên bản 3 ở bước này, bạn nên tải thư viện opencv_java3.)
  • Đối với bước (5), nếu bạn bỏ qua bất kỳ lib nền tảng nào như x86, hãy đảm bảo thiết bị / trình giả lập của bạn không nằm trên nền tảng đó.

OpenCV được viết bằng C / C ++. Các hàm bao Java là

  1. Android OpenCV SDK - OpenCV.org duy trì trình bao bọc Android Java. Tôi đề nghị cái này
  2. OpenCV Java - OpenCV.org duy trì trình bao bọc Java để bàn được tạo tự động.
  3. JavaCV - Trình bao bọc Java phổ biến được duy trì bởi (các) nhà phát triển độc lập. Không cụ thể Android. Thư viện này có thể không đồng bộ với các phiên bản mới hơn của OpenCV.

1
Tôi đang gặp lỗi sau bước thứ hai, Tôi có nên xóa javadocsthư mục không ?. Nó cũng đang yêu cầu tôi cài đặt android sdk 14mặc dù tôi đang nhắm mục tiêu các thiết bị hỗ trợandroid sdk 15
Lãng mạn điện tử

1
@RomanticElectron Hy vọng bạn đã tải xuống OpenCV4Android 2.4.10 từ liên kết sourceforge.net/projects/opencvl Library / files / opencv-android / và không phải là phiên bản máy tính để bàn java?
Kiran

2
Ok tôi hiểu rồi, tôi nghĩ bạn đang nói về sdkthư mục cài đặt trên hệ thống của tôi trong khi bạn đang nói về thư mục đi kèm. Android Open CV SDKTôi đã hoàn thành bước 6. Tôi phải bao gồm ở static{ System.loadLibrary("opencv_java"); }đâu?
Electron lãng mạn

5
@RomanticElectron, nơi bạn bao gồm tĩnh {System.loadL Library ("opencv_java"); }? Bạn nói "Cảm ơn tôi đã hiểu" nhưng dường như không có tin nhắn nào ở giữa. Sau đó, bạn nói rằng nó không cần thiết. Bạn có thể giải thích thêm một chút? Cảm ơn.
puntofisso

8
Đối với bất kỳ ai gặp android-14lỗi sau khi nhập mô-đun ở bước 2, bạn cần chỉnh sửa thủ công build.gradletrong thư mục openCV trong dự án của bạn như trong bước 3.
paradite

144

Tích hợp OpenCV v3.1.0 vào Android Studio v1.4.1 , hướng dẫn với chi tiết bổ sung và đây là những gì bạn nên có trong ảnh chụp màn hình.

Hầu hết các khoản tín dụng dành cho Kiran, Kool, 1 "và SteveLiles tại opencv.org vì những lời giải thích của họ. Tôi thêm câu trả lời này vì tôi tin rằng giao diện của Android Studio đủ ổn định để hoạt động với loại công cụ tích hợp này Ngoài ra tôi phải viết những hướng dẫn này cho dự án của chúng tôi.

Các nhà phát triển AS có kinh nghiệm sẽ tìm thấy một số phạm vi này. Câu trả lời này nhắm vào những người có kinh nghiệm hạn chế trong Android Studio.

  1. Tạo dự án Android Studio mới bằng trình hướng dẫn dự án (Menu: / Tệp / Dự án mới):

    • Gọi nó là " cvtest1 "
    • Yếu tố hình thức: API 19, Android 4.4 (KitKat)
    • Hoạt động trống có tên MainActivity

      Bạn nên có một thư mục cvtest1 nơi dự án này được lưu trữ. (thanh tiêu đề của studio Android cho bạn biết cvtest1 ở đâu khi bạn mở dự án)

  2. Xác minh rằng ứng dụng của bạn chạy chính xác. Hãy thử thay đổi một cái gì đó như văn bản "Hello World" để xác nhận rằng chu trình xây dựng / kiểm tra là phù hợp với bạn. (Tôi đang thử nghiệm với trình giả lập thiết bị API 19).

  3. Tải xuống gói OpenCV cho Android v3.1.0 và giải nén nó trong một số thư mục tạm thời ở đâu đó. (Hãy chắc chắn rằng đó là gói dành riêng cho Android chứ không chỉ gói OpenCV cho Java.) Tôi sẽ gọi thư mục này là " unzip-dir " Bên dưới unzip-dir, bạn nên có thư mục sdk / local / libs với các thư mục con bắt đầu bằng những thứ như arm ..., mips ... và x86 ... (một cho mỗi loại "kiến trúc" Android chạy trên)

  4. Từ Android Studio, nhập OpenCV vào dự án của bạn dưới dạng mô-đun: Menu: / File / New / Import_Module :

    • Thư mục nguồn: {unzip-dir} / sdk / java
    • Tên mô-đun: Studio Android tự động điền vào trường này bằng openCVL Library 310 (tên chính xác có thể không quan trọng nhưng chúng tôi sẽ sử dụng cái này).
    • Bấm vào tiếp theo . Bạn nhận được một màn hình với ba hộp kiểm và câu hỏi về bình, thư viện và tùy chọn nhập. Cả ba nên được kiểm tra. Nhấp vào Kết thúc.

      Android Studio bắt đầu nhập mô-đun và bạn được hiển thị tệp nhập-tóm tắt.txt có danh sách những gì không được nhập (chủ yếu là tệp javadoc) và các thông tin khác. nhập mô tả hình ảnh ở đây

      Nhưng bạn cũng nhận được một thông báo lỗi nói rằng thất bại trong việc tìm mục tiêu với chuỗi băm 'android-14' ... . Điều này xảy ra vì tệp build.gradle trong tệp zip OpenCV mà bạn đã tải xuống nói sẽ biên dịch bằng API Android phiên bản 14, theo mặc định bạn không có với Android Studio v1.4.1. nhập mô tả hình ảnh ở đây

  5. Mở hộp thoại cấu trúc dự án ( Menu: / File / Project_Str struct ). Chọn mô-đun "ứng dụng", nhấp vào tab Phụ thuộc và thêm : openCVL Library 310 làm Phụ thuộc mô-đun. Khi bạn chọn Thêm / Module_Dependency, nó sẽ xuất hiện trong danh sách các mô-đun bạn có thể thêm. Bây giờ nó sẽ hiển thị như một phần phụ thuộc nhưng bạn sẽ nhận được thêm một vài lỗi không thể tìm thấy android-14 trong nhật ký sự kiện.

  6. Tìm trong tệp build.gradle cho mô-đun ứng dụng của bạn. Có nhiều tệp build.gradle trong một dự án Android. Cái bạn muốn nằm trong thư mục cvtest1 / app và từ chế độ xem dự án, nó trông giống như build.gradle (Module: app) . Lưu ý các giá trị của bốn trường này:

    • compileSDKVersion (của tôi nói 23)
    • buildToolsVersion (của tôi nói 23.0.2)
    • minSdkVersion (của tôi nói 19)
    • targetSdkVersion (của tôi nói 23)
  7. Dự án của bạn hiện có thư mục cvtest1 / OpenCVL Library 310 nhưng nó không hiển thị từ chế độ xem dự án:

nhập mô tả hình ảnh ở đây

Sử dụng một số công cụ khác, chẳng hạn như bất kỳ trình quản lý tệp nào và đi đến thư mục này. Bạn cũng có thể chuyển chế độ xem dự án từ Android sang Project Files và bạn có thể tìm thấy thư mục này như trong ảnh chụp màn hình này: nhập mô tả hình ảnh ở đây

Bên trong có một tệp build.gradle khác (được tô sáng trong ảnh chụp màn hình ở trên). Cập nhật tệp này với bốn giá trị từ bước 6.

  1. Resynch dự án của bạn và sau đó làm sạch / xây dựng lại nó. (Menu: / Build / Clean_Project ) Nó sẽ dọn dẹp và xây dựng không có lỗi và bạn sẽ thấy nhiều tài liệu tham khảo đến : openCVL Library 310 trong màn hình 0: Tin nhắn .

    nhập mô tả hình ảnh ở đây

    Tại thời điểm này, mô-đun sẽ xuất hiện trong hệ thống phân cấp dự án dưới dạng openCVL Library 310 , giống như ứng dụng . (Lưu ý rằng trong menu thả xuống nhỏ đó, tôi đã chuyển từ Chế độ xem dự án sang Chế độ xem Android ). Bạn cũng sẽ thấy một tệp build.gradle bổ sung trong "Tập lệnh Gradle" nhưng tôi thấy giao diện Android Studio hơi rắc rối và đôi khi nó không thực hiện được điều này ngay lập tức. Vì vậy, hãy thử đồng bộ lại, làm sạch, thậm chí khởi động lại Android Studio.

    Bạn sẽ thấy mô-đun openCVL Library 310 với tất cả các chức năng OpenCV trong java như trong ảnh chụp màn hình này:

    nhập mô tả hình ảnh ở đây

  2. Sao chép thư mục {unzip-dir} / sdk / igen / libs (và mọi thứ trong đó) vào dự án Android của bạn, vào cvtest1 / OpenCVL Library 310 / src / main / , sau đó đổi tên bản sao của bạn từ libs thành jniLibs . Bây giờ bạn sẽ có một thư mục cvtest1 / OpenCVL Library 310 / src / main / jniLibs . Xác định lại dự án của bạn và thư mục này bây giờ sẽ xuất hiện trong chế độ xem dự án trong openCVL Library 310 .

    nhập mô tả hình ảnh ở đây

  3. Chuyển đến phương thức onCreate của MainActivity.java và nối thêm mã này:

    if (!OpenCVLoader.initDebug()) {
        Log.e(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), not working.");
    } else {
        Log.d(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), working.");
    }

    Sau đó chạy ứng dụng của bạn. Bạn sẽ thấy các dòng như thế này trong Màn hình Android: nhập mô tả hình ảnh ở đây (Tôi không biết tại sao dòng đó có thông báo lỗi ở đó)

  4. Bây giờ hãy thử thực sự sử dụng một số mã openCV. Trong ví dụ dưới đây, tôi đã sao chép tệp .jpg vào thư mục bộ đệm của ứng dụng cvtest1 trên trình giả lập Android. Đoạn mã dưới đây tải hình ảnh này, chạy thuật toán phát hiện cạnh canny và sau đó ghi kết quả trở lại vào tệp .png trong cùng thư mục.

    Đặt mã này ngay bên dưới mã từ bước trước và thay đổi mã để khớp với các tệp / thư mục của riêng bạn.

    String inputFileName="simm_01";
    String inputExtension = "jpg";
    String inputDir = getCacheDir().getAbsolutePath();  // use the cache directory for i/o
    String outputDir = getCacheDir().getAbsolutePath();
    String outputExtension = "png";
    String inputFilePath = inputDir + File.separator + inputFileName + "." + inputExtension;
    
    
    Log.d (this.getClass().getSimpleName(), "loading " + inputFilePath + "...");
    Mat image = Imgcodecs.imread(inputFilePath);  
    Log.d (this.getClass().getSimpleName(), "width of " + inputFileName + ": " + image.width());
    // if width is 0 then it did not read your image.
    
    
    // for the canny edge detection algorithm, play with these to see different results
    int threshold1 = 70;
    int threshold2 = 100;
    
    Mat im_canny = new Mat();  // you have to initialize output image before giving it to the Canny method
    Imgproc.Canny(image, im_canny, threshold1, threshold2);
    String cannyFilename = outputDir + File.separator + inputFileName + "_canny-" + threshold1 + "-" + threshold2 + "." + outputExtension;
    Log.d (this.getClass().getSimpleName(), "Writing " + cannyFilename);
    Imgcodecs.imwrite(cannyFilename, im_canny);
  5. Chạy ứng dụng của bạn. Trình giả lập của bạn sẽ tạo ra một hình ảnh "cạnh" đen và trắng. Bạn có thể sử dụng Trình giám sát thiết bị Android để truy xuất đầu ra hoặc viết một hoạt động để hiển thị nó.

Các Gotchas :

  • Nếu bạn hạ thấp nền tảng mục tiêu của mình xuống dưới KitKat, một số thư viện OpenCV sẽ không còn hoạt động, cụ thể là các lớp liên quan đến org.opencv.android.Camera2Renderer và các lớp liên quan khác. Bạn có thể có thể khắc phục điều này bằng cách xóa các tệp .Cava OpenCV thích hợp.
  • Nếu bạn nâng nền tảng mục tiêu của mình lên Lollipop hoặc cao hơn ví dụ về việc tải tệp của tôi có thể không hoạt động vì việc sử dụng đường dẫn tệp tuyệt đối sẽ không được chấp nhận. Vì vậy, bạn có thể phải thay đổi ví dụ để tải tệp từ thư viện hoặc ở nơi khác. Có rất nhiều ví dụ nổi xung quanh.

2
Chỉnh sửa 16 tháng 2: jniLibs hiện trong thư mục openCVL Library 310, không phải thư mục ứng dụng chính. Hoặc là hoạt động nhưng nó có vẻ sạch hơn đối với tôi để giữ chúng trong phần opencv. Cộng thêm nhiều ảnh chụp màn hình và phần "Gotchas".
ssimm

Tôi nghĩ rằng một số báo cáo nhập khẩu bị thiếu, nếu không công việc rất tốt! +1
Allan Nørgaard

1
Tôi đã làm theo câu trả lời của bạn nhưng không thành công. 1 tôi đã nhận được lỗi OpenCV error: Cannot load info library for OpenCV 2 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/www.deven.com.opencv-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libopencv_java3.so Những lỗi này về tôi đã làm từng bước như bạn đã viết.
Devendra Singh

2
@DevendraSingh Tôi gặp lỗi tương tự như bạn mắc phải nhưng tôi nhận ra mình đã bỏ lỡ bước 9.
aasu

2
Điều gì xảy ra nếu chúng ta muốn viết mã trong c ++ cho opencv trên studio android?
dùng8663682

37

Đối với tất cả những người cảm thấy họ muốn chạy trốn với tất cả các bước và ảnh chụp màn hình cho câu trả lời (tuyệt vời!) Ở trên, điều này hiệu quả với tôi android studio 2.2.1:

  1. Tạo một dự án mới, đặt tên theo ý muốn và lấy mặc định (minSdkVersion 15 là ổn).
  2. Tải xuống tệp zip từ đây: https://sourceforge.net/projects/opencvl Library / files / opencv-android / (Tôi đã tải xuống phiên bản 3.1.0, nhưng có thể có phiên bản mới hơn).
  3. Giải nén tệp zip, vị trí tốt nhất là trong thư mục không gian làm việc của bạn, nhưng nó không thực sự quan trọng.
  4. Bên trong Android Studio, nhấp File->New-> Import Modulevà điều hướng đến \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\javavà nhấn Ok, sau đó chấp nhận tất cả các hộp thoại mặc định.
  5. Trong gradletệp app mô-đun của bạn , thêm phần này vào khối phụ thuộc:

    dependencies {
        compile project(':openCVLibraryXYZ')
        //rest of code
    }

Trong đó XYZ là phiên bản chính xác mà bạn tải xuống, ví dụ trong trường hợp của tôi:

    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }

1
Đẹp và đơn giản, thnx ;-) Hoạt động cho phiên bản 3.2.0.
blacharnia

2
Cảm ơn bạn, đó thực sự là giải pháp dễ dàng hơn. Một điểm từ tôi. Mô-đun OpenCV mới không thể được biên dịch. Câu trả lời ở đây đã giúp tôi khắc phục sự cố này stackoverflow.com/a/40302788
408780

chỉ để thêm vào những gì @blacharnia đã nói, chỉ cần đảm bảo bạn sử dụng 'dự án biên dịch (': openCVL Library320 ')' trong phần phụ thuộc cái nôi thay vì 310
Abraham Philip

Có thể nói chung, để thêm vào các nhận xét trên, hãy sử dụng "dự án biên dịch (': openCVL LibraryXYZ')" trong đó XYZ là số phiên bản của SDK Android openCV không có 'dấu chấm' - hiện tại nó cũng hoạt động cho phiên bản 3.4.0 -> tức là sử dụng "dự án biên dịch (': openCVL Library340')"
Mick

@ Xin cảm ơn, tôi đã chỉnh sửa câu trả lời theo đề nghị của bạn.
yshahak

9

Android Studio 3.4 + OpenCV 4.1

  1. Tải xuống tệp zip OpenCV mới nhất từ đây (phiên bản mới nhất hiện tại là 4.1.0) và giải nén nó trong không gian làm việc của bạn hoặc trong một thư mục khác.

  2. Tạo dự án Android Studio mới bình thường. Nhấp File->New->Import Module, điều hướng đến /path_to_unzipped_files/OpenCV-android-sdk/sdk/java, đặt tên Mô-đun là opencv, nhấp Nextvà bỏ chọn tất cả các tùy chọn trong màn hình.

  3. Kích hoạt Projectchế độ xem tập tin (chế độ mặc định là Android). Trong opencv/build.gradlesự thay đổi tập tin apply plugin: 'com.android.application'để apply plugin: 'com.android.library'và thay thế application ID "org.opencv"với

    minSdkVersion 21
    targetSdkVersion 28

    (theo các giá trị trong app/build.gradle). Dự án đồng bộ hóa với các tập tin Gradle.

  4. Thêm chuỗi này vào khối phụ thuộc trong app/build.gradletệp

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
  5. Chọn lại Androidchế độ xem tập tin. Nhấp chuột phải vào appmô-đun và goto New->Folder->JNI Folder. Chọn thay đổi vị trí thư mục và thiết lập src/main/jniLibs/.

  6. Chọn lại Projectchế độ xem tệp và sao chép tất cả các thư mục từ /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libssang app/src/main/jniLibs.

  7. Một lần nữa trong Androidchế độ xem tập tin nhấp chuột phải vào appmô-đun và chọn Link C++ Project with Gradle. Chọn Build System ndk-buildvà đường dẫn đến OpenCV.mktập tin /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files không được chứa bất kỳ khoảng trắng nào, nếu không bạn sẽ gặp lỗi!

Để kiểm tra khởi tạo OpenCV, thêm thông báo Toast trong onCreate()phương thức MainActivity :

Toast.makeText(MainActivity.this, String.valueOf(OpenCVLoader.initDebug()), Toast.LENGTH_LONG).show();

Nếu khởi tạo thành công, bạn sẽ thấy truetrong thông báo Toast khác mà bạn sẽ thấy false.


Ở trên bạn nói "thay thế ID ứng dụng" org.opencv "bằng ....." nhưng không có gì theo sau "bằng". Bạn có thể vui lòng làm rõ? Bạn có nghĩa là nói "xóa mục nhập applicationId và thêm hai mục như sau:"
Dale

@Dale Có, bạn nên thay thế application ID "org.opencv"chuỗi bằng hai chuỗi: minSdkVersion 21targetSdkVersion 28(theo các giá trị trong tệp app / build.gradle)
Plo_Koon

Tôi làm theo tất cả các bước như bạn mô tả. Nhưng gặp lỗi E / art: dlopen ("/ data / app / com.example.objectsibutionation-1 / lib / arm64 / libopencv_java4.so", RTLD_LAZY) không thành công: không tìm thấy thư viện "libc ++ _ shared.so"
Masthan

0

Bất kỳ ai phải đối mặt với vấn đề trong khi tạo cpp jniLibs được hiển thị .. chỉ cần thêm ndk ..


0

Điều này làm việc cho tôi và dễ dàng như thêm một phụ thuộc lớp:

https://bintray.com/seesaa/maven/opencv#

https://github.com/seesaa/opencv-android

Một điều lưu ý là tôi phải sử dụng thiết bị gỡ lỗi phần cứng vì trình giả lập cánh tay đang chạy quá chậm đối với tôi (như AVD Manager nói rằng họ sẽ làm như vậy), và như được mô tả tại repo README, phiên bản này không hỗ trợ x86 hoặc x86_64.

Nó dường như để xây dựng và thử nghiệm đề xuất:

static {
    OpenCVLoader.initDebug();
}

phun ra một loạt các đầu ra có vẻ đúng với tôi.


Đây là từ một dự án mới trong studio android. Tôi không nhập bất cứ thứ gì, không tải xuống bất cứ thứ gì, v.v. Chỉ cần thêm phụ thuộc lớp và đồng bộ hóa.
Naumdev

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.