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.
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):
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).
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)
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ư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.
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.
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)
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:
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:
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 .
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:
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 .
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:
(Tôi không biết tại sao dòng đó có thông báo lỗi ở đó)
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);
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ó.