شروع OpenCv اندروید
در ادامه سری آموزش های برنامه نویسی اندروید, به مبحث OpenCv میپردازیم. در این سری آموزش ها قصد داریم تا با استفاده از openCv در اندروید پردازش تصویر انجام دهیم. در این مقاله به مقدمات و مفاهیم مورد نیاز میپردازیم.
در ابتدا نیاز است تا از NDK استفاده شود. وقتی از کد های ++C در اندروید استفاده می کنیم, به NDK نیاز داریم. علت استفاده از NDK در پردازش تصویر نیز به این دلیل است که توابع و library های openCv به زبان ++C نوشته شده اند. برای دانلود NDK به اینجا مراجعه کنید.
نیاز است تا یک توضیح اجمالی پیرامون NDK ارائه دهیم. اگر بخواهید بخش های native در کد خود را Compile کنید, نیاز است تا از ndk-build tool استفاده کنید. در واقع ndk-build tool یک script است که متناسب با شرایط ذیل script ها دیگری را اجرا میکند :
- به صورت خودکار پروژه را جستجو میکند تا مشخص کند کدام قسمت ها را باید build کند
- بعد از اتمام جستجو به پردازش و مدیریت dependency ها میپردازد
- library های ایجاد شده را به پروژه اضافه میکند
علاوه بر ndk-build tool نیاز است تا با یکسری component های دیگر آشنا شوید :
- Java and Native Calls : برنامه های اندروید به زبان جاوا نوشته میشوند و کد ها بعد از compile به byteCode ها تبدیل می شود. این کد های تبدیل شده در سیستم عامل اندروید با استفاده از Dalvik یا Android Runtime (ART) اجرا میشوند. برنامه های که با استفاده از کد های native نوشته میشوند, تنها بر روی Dalvik آزمایش میشوند. وقتی یک متد native میخواهید تعریف کنید نیاز است تا واژه کلیدی “native” را در تعریف آن ذکر کنید. مانند :
public native zeroToHero(String username)
- Native Shared Libraries : این فایل ها با استفاده از NDK و با فرمت so. ایجاد میشوند. این library ها در زمان اجرا به اشتراک گذاشته میشوند و به برنامه متصل میشوند
- Native Static Libraries : این فایل ها با استفاده از NDK و با فرمت a. ایجاد میشوند. این library ها در زمان compile به برنامه اضافه میشوند
- Java Native Interface : وقتی برنامه ها را در زبان جاوا مینویسیم و نیاز داریم تا از طریق یک کانال ارتباطی library های نوشته شده به زبان ++C را فراخوانی کنیم, از Java Native Interface و یا به اختصار JNI استفاده میشود
- Application Binary Interface : با استفاده از این interface مشخص میشود که کد ها باید به چه صورتی باشند تا در معماری های مختلف اجرا شوند. به صورت پیش فرض NDK کد ها را برای معماری ARM EABI ایجاد میکند. اما میتوان طوری تعیین کرد تا برای معماری هایی مانند MIPS و یا X86 نیز ایجاد شود
- Android.mk : کارکرد آن را میتوان مشابه Maven دانست. در حقیقت یک make file است که module ها و نام آنها, source file های مورد نیاز برای compile و library هایی که نیاز است تا به پروژه متصل شوند را برای ndk-build tools script تعیین میکند. شیوه استفاده از این فایل بسیار حائز اهمیت است و در راستای این مقالات با نحوه استفاده از آن اشنا میشوید
- Application.mk : استفاده از این فایل اختیاری است. در این فایل module های مورد نیاز برنامه لیست میشوند. این اطلاعات میتواند شامل Application Binary Interface ها که به machine code تبدیل میشوند, toolchain ها و library های استاندارد باشد
با استفاده از این component ها میتوان خلاصه توسعه یک برنامه native در اندروید را به این صورت بیان کرد :
- مشخص میشود که کدام قسمت به زبان جاوا نوشته شود و کدام قسمت به زبان ++C
- یک برنامه در android studio ایجاد میشود
- با استفاده از Android.mk لیست native code هایی که باید compile شوند, module ها و library هایی که باید به پروژه متصل شوند مشخص میشود
- فایل Android.mk در پوشه jni قرار میگیرد.
- NDK با استفاده از ndk-build tool فایل ها با فرمت so. , کد های جاوا و a. فایل ها را به فایل dex تبدیل میکند و تمام فایل ها در کنار هم تشکیل یک فایل APK را میدهند.
برای استفاده از توابع و library ها نیاز داریم تا OpenCvSDK را نیز دریافت کرده و به پروژه اضافه کنیم. برای دانلود OpenCvSDK به اینجا مراجعه کنید.
سپس باید از قسمت sdk موجود در OpenCvSDK, پوشه java را به عنوان یک module به پروژه اضافه کنید. بعد از افزودن module یک import-summary.txt برای شما نمایش داده میشود که فایل هایی افزوده شده را لیست میکند. سپس نیاز است تا نام module را که در موقع اضافه کردن به پروژه مشخص کرده اید (ما در اینجا ZeroToHeroOpenCV انتخاب کرده ایم ), را به buid.gradle اضافه کنید :
compile project(':ZeroToHeroOpenCV')
در مسیر مشخص شده در تصویر پوشه jniLibs را ایجاد کنید و محتویات پوشه libs در پوشه native در مسیر sdk موجود در OpenCvSDK را در آن قرار دهید.
سپس پوشه افزوده شده را به build.gradle اضافه میکنیم :
android { .... sourceSets { main { jni.srcDirs = [] } } }
بر روی دستگاه اندرویدی شما حتما باید openCV Manager نصب باشد. برای نصب میتوانید به اینجا مراجعه کنید.
سپس با استفاده از کد زیر صحت افزوده شدن openCv را بررسی میکنیم :
public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (OpenCVLoader.initDebug()) { Log.d("Zero to hero", "OpenCV Lib Founded"); } else { Log.d("Zero to hero", "Not found"); } } @Override public void onCameraViewStarted(int width, int height) { } @Override public void onCameraViewStopped() { } @Override public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { return null; } }
اگر تمام مراحل فوق را درست انجام داده باشید در Android Monitor این خروجی نمایش داده میشود :
vhdrjb.zerotohero.simpleopencv D/Zero to hero: OpenCV Lib Founded
در این مقاله سعی بر این شد تا مفاهیم اولیه و نصب openCv را بررسی کنیم.
سری مقالات آموزش openCv ادامه دارد.
با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.