ก่อนที่จะเริ่มกระบวนการติดตั้งต่างๆ คงต้องบอกข้อจำกัดของการใช้ OpenCV บน Android เท่าที่ผมเจอมาไว้ก่อนครับ
- ความแตกต่างระหว่างภาษา คือเนื่องจาก OpenCV ถูกพัฒนาหลักด้วย C++ เวลาเอามาใช้งานบน Android ซึ่งภาษาเขียนเป็น Java จึงมีทางออกหลักๆ 2 ทางคือ เขียนโค้ดบน Android ด้วย Java (ใช้ได้เลย ใช้ Instant run ได้ แต่ต้องไปหาเอกสาร OpenCV for Java มาอ่านเพิ่ม ซึ่งหายาก) หรือ เขียนโค้ดบน Android ด้วย C++ (ต้องลง LLDC, CMake หรือ NDK เพิ่ม และใช้ Instant run ไม่ได้ แต่หาเอกสารต่างๆได้ง่ายกว่า) ในที่นี้ผมจะลองแบบแรกคือเขียนทุกอย่างด้วย Java เลย
- กระบวนการติดตั้งและใช้งานค่อนข้างไม่นิ่ง ยังมีการเปลี่ยนตามเวอร์ชันของ OpenCV และ Android Studio ทำให้เวลาไปดูในเว็บ อ่านในหนังสือ หรือดูคลิปสอน อาจจะใช้ไม่ได้กับเครื่องของเรา
- ไฟล์ app ค่อนข้างใหญ่ (ประมาณ 20 MB หรือมากกว่า) คือมันต้องผนวก library ของ OpenCV เข้าไปด้วย จริงๆมีอีกทางเลือกนึงคือให้ผู้ใช้ไปติดตั้ง OpenCV library (OpenCV Manager) ก่อนบน Play store แล้วแอพของเราก็จะทำให้ขนาดเล็กลงได้ (แต่มันไม่สะดวกต่อผู้ใช้มั้ง)
สมมติว่าเราจะใช้ซอฟต์แวร์ทุกอย่างเวอร์ชันล่าสุด ณ ปัจจุบัน (ก.พ. 2560) ได้แก่ Android Studio 2.2.3 และ OpenCV for Android 3.2.0
ขั้นตอน
1. ดาวน์โหลด OpenCV for Android 3.2.0 ที่เว็บ OpenCV หรือตรงๆเลยที่นี่ แล้วแตกไฟล์ไว้ซักที่ เช่น D:\ จะได้โฟลเดอร์ชื่อ D:\OpenCV-android-sdk
2. เปิด Android Studio สร้างโปรเจคใหม่ (ถ้าต้องการเขียนแบบ C++ ตอนสร้างโปรเจคต้องเลือก C++ support ด้วย แต่ไม่ใช่วิธีของเราตอนนี้)
3. เลือกเมนู File/New/Import Module... แล้วเลือกโฟลเดอร์ D:\OpenCV-android-sdk\sdk\java จากนั้นเลือก Next แล้วไม่เลือก (เอาเครื่องหมายติ้กออก) ทั้งสามรายการ กด Finish
4. สังเกตว่ามีข้อแจ้งเตือนอย่างไรบ้าง ซึ่งมักจะเจอว่า SDK เวอร์ชันในไฟล์ build.gradle ของ project เรา กับของ OpenCV ไม่ตรงกัน
5. ให้เลือกโหมด Project แล้วเทียบไฟล์สองไฟล์ตามรูป
6. แก้ไขไฟล์ build.gradle ของ OpenCV (อันล่าง) ให้เวอร์ชัน SDK เป็นไปตามอันบน ซึ่งจะแก้ไขเวอร์ชันของค่าต่างๆต่อไปนี้
compileSdkVersion
buildToolsVersion
minSdkVersion
targetSdkVersion
แล้ว Sync project อีกครั้ง ปัญหานี้ก็จะหายไป
7. สร้าง JNI folder โดยการเลือกเมนู File/New Folder/ JNI Folder แล้วเลือกเปลี่ยนชื่อโฟลเดอร์ตามนี้
จะได้
8. ทำการคัดลอกโฟลเดอร์ทั้งหมดจาก D:\OpenCV-android-sdk\sdk\native\libs มาไว้ที่โฟลเดอร์นี้ โดยการ copy และ paste (ความจริงจะเลือกเฉพาะที่สอดคล้องกับ CPU ของมือถือที่เป็นเป้าหมายของเราก็ได้) จะได้
ถ้าไม่ได้เขียนโค้ด OpenCV แบบ C++ ที่ต้องการ link library ด้วย ในแต่ละโฟลเดอร์ข้างต้น สามารถลบไฟล์นามสกุล .a ได้หมด ให้เหลือไว้แค่ .so
9. เลือกแก้ไขไฟล์ข้อใดข้อหนึ่งเท่านั้นต่อไปนี้
9.1 ถ้าไม่ได้เขียนโค้ด OpenCV แบบ C++ เลย ให้แก้ไขไฟล์ build.gradle ของ Module app จาก
sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jniLibs/'] } }เป็น
sourceSets { main { jni.srcDirs = [] } }
หรือ
9.2 แก้ไขไฟล์ gradle.properties เพิ่มคำสั่งต่อไปนี้ที่บรรทัดล่างสุด
android.useDeprecatedNdk=true
กรณีนี้ตอน build จะถูกเตือนว่าคำสั่งดังกล่าวอาจจะถูกยกเลิกใน gradle รุ่นถัดไป
10. เพิ่ม Dependencies สำหรับการ build ให้โปรเจค โดยเลือก File/Project Structure แล้วเลือกแท็บ Dependencies กดเครื่องหมายบวกเลือก Module dependency แล้วเพิ่มตามนี้
11. ติดตั้ง NDK เพิ่มเติม โดยเลือกจากเมนูดังรูป (จากการไปดูของคนอื่นมา ถ้าเป็น Android Studio ต่ำกว่า 2.3 ไม่ต้องก็ได้)
12. รีสตาร์ท Android Studio (หรือจะไปเพิ่ม path ของ NDK ที่ไฟล์ local.properties ก็ได้ โดยเพิ่มเช่น
ndk.dir=C\:\\Users\\Surapong\\Downloads\\android-sdk-windows\\ndk-bundle)
13. เพิ่มโค้ดทดสอบเพื่อโหลด OpenCV ใน MainAcitivity.java ดังนี้
public class MainActivity extends AppCompatActivity { static { if(OpenCVLoader.initDebug()) { Log.i("OpenCV", "Success"); } else { Log.i("OpenCV", "Fail"); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
14. ลอง Build หรือรันโปรเจค แอพน่าจะติดตั้งลงเครื่องหรือ emulator ได้แล้ว แต่ว่าจะใช้เวลานานเพราะไฟล์ apk จะใหญ่มาก เนื่องจากมีการสร้าง apk สำหรับทุกรุ่น CPU ของมือถือ
15. เพื่อที่จะลดขนาด เราสามารถเพิ่มคำสั่งใน build.gradle (Module: app) ดังนี้
android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.example.mobile.opencv102" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets { main { jni.srcDirs = [] } } productFlavors { x86 { ndk { abiFilter "x86" } } armv7a { ndk { abiFilter "armeabi-v7a" } } } }
16. จากนั้นลอง run ดูอีกครั้ง น่าจะเร็วขึ้นเพราะไฟล์ apk ขนาดเล็กลงแล้วครับ
17. นอกจากนี้ เมื่อเราตรวจสอบที่ Android Monitor เราควรจะเห็น log message ดังนี้
อ้างอิง
https://www.youtube.com/watch?v=nv4MEliij14&t=922s
https://www.learn2crack.com/2016/03/setup-opencv-sdk-android-studio.html
http://stackoverflow.com/questions/8283206/huge-apk-filesize-when-using-opencv
http://stackoverflow.com/questions/40065871/error-your-project-contains-c-files-but-it-is-not-using-a-supported-native-bu
บทความดีมาก
ReplyDeleteขอบคุณครับ
ถ้ารันแล้วError ต้องแก้ยังไงครับ
ReplyDelete