การรวม OpenCV v3.1.0 เข้ากับ Android Studio v1.4.1 , คำแนะนำพร้อมรายละเอียดเพิ่มเติมและภาพหน้าจอชนิดนี้คือสิ่งที่คุณควรได้รับ
เครดิตส่วนใหญ่ไปที่ Kiran, Kool, 1 ", และ SteveLiles ที่ opencv.org สำหรับคำอธิบายฉันกำลังเพิ่มคำตอบนี้เพราะฉันเชื่อว่าอินเทอร์เฟซของ Android Studio ตอนนี้มีเสถียรภาพเพียงพอที่จะทำงานกับสิ่งต่างๆ ฉันต้องเขียนคำแนะนำเหล่านี้สำหรับโครงการของเราด้วย
ผู้พัฒนาที่มีประสบการณ์จะพบกับความรู้เรื่องนี้ คำตอบนี้มีเป้าหมายสำหรับผู้ที่มีประสบการณ์ จำกัด ใน Android Studio
สร้างโครงการ Android Studio ใหม่โดยใช้ตัวช่วยสร้างโครงการ (เมนู: / ไฟล์ / โครงการใหม่):
ตรวจสอบว่าแอปของคุณทำงานอย่างถูกต้อง ลองเปลี่ยนบางอย่างเช่นข้อความ "Hello World" เพื่อยืนยันว่ารอบการสร้าง / ทดสอบนั้นใช้ได้สำหรับคุณ (ฉันกำลังทดสอบด้วยตัวจำลองอุปกรณ์ API 19)
ดาวน์โหลดแพคเกจ OpenCV สำหรับ Android v3.1.0 และแตกไฟล์ในบางไดเร็กทอรีชั่วคราว (ตรวจสอบให้แน่ใจว่าเป็นแพคเกจเฉพาะสำหรับ Android และไม่ใช่เฉพาะ OpenCV สำหรับ Java package) ฉันจะเรียกไดเรกทอรีนี้ว่า " unzip-dir " ด้านล่างunzip-dirคุณควรมีไดเรกทอรีsdk / native / libs ที่มีไดเรกทอรีย่อยที่ขึ้นต้นด้วย สิ่งต่าง ๆ เช่นแขน ... , mips ... และx86 ... (หนึ่งสำหรับ "สถาปัตยกรรม" Android แต่ละประเภททำงานบน)
จาก Android Studio นำเข้า OpenCV ในโครงการของคุณเป็นโมดูล: เมนู: / ไฟล์ / ใหม่ / Import_Module :
- ไดเรกทอรีต้นทาง: {unzip-dir} / sdk / java
- ชื่อโมดูล: สตูดิโอ Android เติมข้อมูลในฟิลด์นี้โดยอัตโนมัติด้วยopenCVLibrary310 (ชื่อที่แน่นอนอาจไม่สำคัญ แต่เราจะไปกับเรื่องนี้)
คลิกที่ต่อไป คุณจะได้รับหน้าจอพร้อมช่องทำเครื่องหมายสามช่องและคำถามเกี่ยวกับตัวเลือกตัวเลือกต่างๆ ควรตรวจสอบทั้งสามข้อ คลิกที่เสร็จสิ้น
Android Studio เริ่มนำเข้าโมดูลและคุณจะเห็นไฟล์import-summary.txtที่มีรายการของสิ่งที่ไม่ได้นำเข้า (ส่วนใหญ่เป็นไฟล์ javadoc) และข้อมูลอื่น ๆ
แต่คุณยังได้รับข้อความผิดพลาดว่าล้มเหลวในการค้นหาเป้าหมายด้วยสตริงกัญชา 'หุ่นยนต์-14' ... สิ่งนี้เกิดขึ้นเพราะไฟล์ build.gradle ในไฟล์ซิป OpenCV ที่คุณดาวน์โหลดบอกว่าจะรวบรวมโดยใช้ Android API เวอร์ชัน 14 ซึ่งโดยค่าเริ่มต้นคุณไม่มีกับ Android Studio v1.4.1
เปิดไดอะล็อกโครงสร้างโครงการ ( เมนู: / ไฟล์ / Project_Struct ) เลือกโมดูล "แอพ" คลิกที่แท็บการอ้างอิงและเพิ่ม: openCVLibrary310เป็นโมดูลการพึ่งพา เมื่อคุณเลือกเพิ่ม / Module_Dependencyมันควรจะปรากฏในรายการของโมดูลที่คุณสามารถเพิ่ม ตอนนี้มันจะแสดงว่าขึ้นอยู่กับการพึ่งพา แต่คุณจะได้รับข้อผิดพลาดที่ไม่สามารถหา - android-14อีกสองสามรายการในบันทึกเหตุการณ์
ค้นหาในไฟล์build.gradleสำหรับโมดูลแอปของคุณ มีไฟล์ build.gradle หลายไฟล์ในโครงการ Android หนึ่งที่คุณต้องการอยู่ในcvtest1 / แอปไดเรกทอรีและจากมุมมองโครงการดูเหมือนbuild.gradle (Module: แอป) บันทึกค่าของสี่ฟิลด์เหล่านี้:
- compileSDKVersion (ของฉันบอกว่า 23)
- buildToolsVersion (ของฉันบอกว่า 23.0.2)
- minSdkVersion (ของฉันบอกว่า 19)
- targetSdkVersion (ฉันพูดว่า 23)
ตอนนี้โปรเจ็กต์ของคุณมีไดเร็กทอรี cvtest1 / OpenCVLibrary310แต่ไม่สามารถมองเห็นได้จากมุมมองโปรเจ็กต์:
ใช้เครื่องมืออื่นเช่นเครื่องมือจัดการไฟล์และไปที่ไดเรกทอรีนี้ คุณยังสามารถสลับมุมมองโครงการจากAndroidเป็นไฟล์โครงการและคุณสามารถค้นหาไดเรกทอรีนี้ตามที่แสดงในภาพหน้าจอนี้:
ข้างในมีไฟล์build.gradleอีกอัน (มันถูกไฮไลต์ในภาพหน้าจอด้านบน) อัปเดตไฟล์นี้ด้วยค่าสี่ค่าจากขั้นตอนที่ 6
Resynch โครงการของคุณแล้วทำความสะอาด / สร้างใหม่ (เมนู: / สร้าง / Clean_Project ) มันควรทำความสะอาดและสร้างโดยไม่มีข้อผิดพลาดและคุณควรเห็นการอ้างอิงหลายอย่างไปที่: openCVLibrary310ในหน้าจอ0: ข้อความ
ณ จุดนี้โมดูลควรปรากฏในลำดับชั้นของโครงการเป็นopenCVLibrary310เหมือนแอพ (หมายเหตุว่าในเมนูแบบเลื่อนลงที่เล็ก ๆ น้อย ๆ ผมเปลี่ยนกลับมาจากโครงการดูเพื่อAndroid ดู ) คุณควรเห็นไฟล์build.gradleเพิ่มเติมภายใต้ "Gradle Scripts" แต่ฉันพบว่าอินเทอร์เฟซของ Android Studio นั้นมีความผิดพลาดเล็กน้อยและบางครั้งมันก็ไม่ได้ทำแบบนี้ทันที ดังนั้นลอง resynching ทำความสะอาดหรือแม้แต่เริ่ม Android Studio ใหม่
คุณควรเห็นโมดูล openCVLibrary310 พร้อมกับฟังก์ชั่น OpenCV ทั้งหมดภายใต้ java เช่นในภาพหน้าจอนี้:
คัดลอก{เครื่องรูด-dir} / SDK / / พื้นเมือง libsไดเรกทอรี (และทุกอย่างภายใต้มัน) กับโครงการ Android ของคุณเพื่อcvtest1 / OpenCVLibrary310 / src / main /แล้วเปลี่ยนชื่อสำเนาของคุณจากlibsจะjniLibs ตอนนี้คุณควรจะมีcvtest1 / OpenCVLibrary310 / src / main / jniLibsไดเรกทอรี resynch โครงการของคุณและไดเรกทอรีนี้ควรจะปรากฏขึ้นในมุมมองของโครงการภายใต้openCVLibrary310
ไปที่เมธอด onCreate ของMainActivity.javaและต่อท้ายโค้ดนี้:
if (!OpenCVLoader.initDebug()) {
Log.e(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), not working.");
} else {
Log.d(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), working.");
}
จากนั้นเรียกใช้แอปพลิเคชันของคุณ คุณควรเห็นบรรทัดเช่นนี้ใน Android Monitor:
(ฉันไม่รู้ว่าทำไมบรรทัดนั้นพร้อมกับข้อความแสดงข้อผิดพลาดอยู่ที่นั่น)
ตอนนี้ลองใช้รหัส openCV จริง ๆ ในตัวอย่างด้านล่างฉันคัดลอกไฟล์. jpg ไปยังไดเรกทอรีแคชของแอปพลิเคชัน cvtest1 ในโปรแกรมจำลอง android โค้ดด้านล่างโหลดอิมเมจนี้รันอัลกอริธึมการตรวจจับขอบแสนรู้แล้วเขียนผลลัพธ์กลับไปยังไฟล์. png ในไดเรกทอรีเดียวกัน
ใส่รหัสนี้ใต้รหัสจากขั้นตอนก่อนหน้าและแก้ไขให้ตรงกับไฟล์ / ไดเรกทอรีของคุณ
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);
เรียกใช้แอปพลิเคชันของคุณ ตัวจำลองของคุณควรสร้างภาพ "ขอบ" สีดำและสีขาว คุณสามารถใช้การตรวจสอบอุปกรณ์ Android เพื่อดึงเอาท์พุทหรือเขียนกิจกรรมเพื่อแสดง
The Gotchas :
- หากคุณลดแพลตฟอร์มเป้าหมายของคุณลงด้านล่าง KitKat บางไลบรารี OpenCV จะไม่ทำงานอีกต่อไปโดยเฉพาะคลาสที่เกี่ยวข้องกับorg.opencv.android.Camera2Rendererและคลาสอื่น ๆ ที่เกี่ยวข้อง คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยเพียงแค่ลบไฟล์ OpenCV .java apprpriate
- หากคุณยกแพลตฟอร์มเป้าหมายของคุณเป็น Lollipop หรือสูงกว่าตัวอย่างของฉันในการโหลดไฟล์อาจใช้งานไม่ได้เนื่องจากการใช้พา ธ ของไฟล์แบบสัมบูรณ์ ดังนั้นคุณอาจต้องเปลี่ยนตัวอย่างเพื่อโหลดไฟล์จากแกลเลอรี่หรือที่อื่น มีตัวอย่างมากมายลอยอยู่รอบ ๆ