OpenCV와 함께하는 컴퓨터 비전 프로그래밍 캠프

Similar documents
03장

( )부록

2 Application Name: Day10_yhg <LinearLayout android:layout_weight="3" > /> an

어댑터뷰

01장

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

13ÀåÃß°¡ºÐ

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

REMON Android SDK GUIDE (SDK Version 1.4.1) 1 / 25

학습목표 메뉴를추가하는방법을이해하고실습할수있다. 프로그램의기본설정 (settings) 을정의하는방법을알고실습할수있다. 대화상자를여는방법을알고실습할수있다. 로그메시지로디버깅하는방법을이해한다. 디버거로디버깅하는방법을이해한다.

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

슬라이드 1

02 C h a p t e r Java

PowerPoint 프레젠테이션

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

PowerPoint Presentation

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

rmi_박준용_final.PDF

JMF2_심빈구.PDF

신림프로그래머_클린코드.key

4S 1차년도 평가 발표자료

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

(Microsoft PowerPoint - AndroG3\306\367\306\303\(ICB\).pptx)

12-file.key

JMF3_심빈구.PDF

리니어레이아웃 - 2 -

Facebook API

5장.key

비긴쿡-자바 00앞부속

안드로이드2_14

Google Maps Android API v2

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

을풀면된다. 2. JDK 설치 JDK 는 Sun Developer Network 의 Java( 혹은 에서 Download > JavaSE 에서 JDK 6 Update xx 를선택하면설치파일을

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

학습목표 선언하여디자인을하는방법을이해하고, 실행할수있다. 시작화면을만드는방법과대체리소스를사용하는방법을이해하고실행할수있다. About 과같은상자를구현하고, 테마를적용하는법을이해하고실행할수있다.

PowerPoint 프레젠테이션

서현수

Dialog Box 실행파일을 Web에 포함시키는 방법

50_1953.pdf

9 차시고급위젯다루기 1 학습목표 날짜 / 시간과관련된위젯을배운다. 웹뷰를사용하여간단한웹브라우저기능을구현한다. 매니패스트파일의설정법을배운다. 2 확인해볼까? 3 날짜 / 시간위젯 1) 활동하기 활동개요

Microsoft PowerPoint - 안드로이드 개발 환경 구축(170411)

MasoJava4_Dongbin.PDF

Speaker MVP (Visual C++) 팁스웨어대표 tipssoft.com 개발커뮤니티운영자 한이음 IT 멘토 tipsware blog.naver.com/tipsware

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

PowerPoint 프레젠테이션

PowerPoint Presentation

Secure Programming Lecture1 : Introduction

SMART ZONE CAST ANDROID SDK 적용가이드 NIT

슬라이드 1

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

Microsoft PowerPoint - 04-UDP Programming.ppt

쉽게 풀어쓴 C 프로그래밊

변수이름 변수값 PATH ;C:\Program Files\Java\jdk1.8.0_45\bin CLASSPATH.;C:\Program Files\jdk1.8.0_45\lib\tools.jar JAVA_HOME C:\Program Files\Java\jdk1.8.0_45

Microsoft PowerPoint App Fundamentals[Part2].pptx

Microsoft PowerPoint - 4주차_Android_UI구현.ppt [호환 모드]

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

자바로

슬라이드 1

JUNIT 실습및발표

슬라이드 1

슬라이드 1

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

09-interface.key

Interstage5 SOAP서비스 설정 가이드

교육2 ? 그림

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

HTML5* Web Development to the next level HTML5 ~= HTML + CSS + JS API

Chap 8 호스트시스템개발환경구성및 안드로이드개발환경구축

Microsoft Word - src.doc

PowerPoint 프레젠테이션

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

fundamentalOfCommandPattern_calmglow_pattern_jstorm_1.0_f…

MPLAB C18 C

제8장 자바 GUI 프로그래밍 II

untitled

1. 도구개요 CppUnit Testing 소개 CppUnit 는 C++ 용 testing Framework 로 Java 의 JUnit 을 C++ 로구현 C++ 언어에서사용할수있도록개발된 Open Source 프로젝트로, source code 의특정 Module 이의도

05-class.key

Modern Javascript

FileMaker ODBC and JDBC Guide

Microsoft PowerPoint - 14주차 강의자료

adlibr-android_4.x

<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>

슬라이드 1

표준프레임워크로 구성된 컨텐츠를 솔루션에 적용하는 것에 문제가 없는지 확인

헬로, 안드로이드 13 주차 SQL 활용하기 (2) 강대기동서대학교컴퓨터정보공학부

자바-11장N'1-502

슬라이드 1

초보자를 위한 C# 21일 완성

Microsoft PowerPoint - 03-TCP Programming.ppt

Microsoft PowerPoint - 02처음으로만드는(Ver 1.0)

자바GUI실전프로그래밍2_장대원.PDF

SKT UCC DRM

컴퓨터과학과 교육목표 컴퓨터과학과의 컴퓨터과학 프로그램은 해당분야 에서 학문적 기술을 창의적으로 연구하고 산업적 기술을 주도적으로 개발하는 우수한 인력을 양성 함과 동시에 직업적 도덕적 책임의식을 갖는 IT인 육성을 교육목표로 한다. 1. 전공 기본 지식을 체계적으로

PowerPoint Template

Contents. 1. PMD ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2. Metrics ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 3. FindBugs ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 4. ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ

오핀 (OFIN) SDK Guide Fintech Mobile SDK Guide - Android V 1.0 OPPFLIB 1

자바 프로그래밍

Transcription:

OpenCV 와함께하는컴퓨터비전프로그래밍캠프 Appx. 안드로이드 OpenCV 프로그래밍 Last Update: 2018/06/07 Visual C++ 영상처리프로그래밍 저자 황선규 / 공학박사 sunkyoo.hwang@gmail.com

모바일컴퓨터비전프로그래밍 목차 Android 개요 Android 개발환경구축 Android Studio 설치 OpenCV Android SDK 설치 OpenCV Java API 사용방법 JNI를이용한 OpenCV 사용방법 2017 년 4 월 Android Studio 2.3.x & Android KitKat 기반으로최초작성된문서를 2018 년 6 월기준최신버전으로업데이트하면서예전그림이일부사용되었습니다. - 2 -

Android 개요 안드로이드 (Android) 구글 (Google) 에서개발하고배포하는모바일운영체제 리눅스기반 + Java UI 개발정보 개발자사이트 : https://developer.android.com/ ( 공식 ) 개발도구 : Android Studio 개발언어 : Java, C/C++, Go, Kotlin image from https://en.wikipedia.org/wiki/android_(operating_system) - 3 -

Android 개요 모바일 OS 점유율 https://www.statista.com/statistics/266136/global-market-share-held-by-smartphone-operating-systems/ - 4 -

Android 개요 안드로이드 OS 버전별점유율 (Apr. 2017) - 5 -

Android 개요 안드로이드 OS 버전별점유율 (Jun. 2018) - 6 -

Android Framework 앱개발자 Java 구글 JNI C/C++ 제조사 C/ASM - 7 -

Android Studio 설치 Android Studio 다운로드 설치파일다운로드 : https://developer.android.com/studio/ - 8 -

Android Studio 설치 Android Studio 설치 - 9 -

Android 개발환경구축 Android SDK 설치 Android Studio 첫화면하단 Configure 버튼을누르고, [SDK Manager] 선택 필요한 SDK Platform 설치확인 - 10 -

Android 개발환경구축 NDK(JNI) 빌드위한 SDK 툴설치 [SDK Tools] 탭에서 CMake, LLDB, NDK 추가설치 - 11 -

OpenCV Android SDK 설치 OpenCV Android SDK 다운로드 http://opencv.org/releases.html OpenCV-3.4.0-android-sdk.zip 다운로드 C:\opencv\ 폴더에압축해제 - 12 -

OpenCV Java API 사용하기 OcvTest1 프로젝트생성 Android Studio 시작화면에서 Start a new Android Studio project: 선택 ( 또는 [File] [New] [New Project ] 메뉴선택 ) Application name : OcvTest1 이후설정은디폴트값사용 ([Next] & [Next] & & [Finish]) 프로젝트위치는가급적한글또는공백이없는폴더로지정 - 13 -

OpenCV Java API 사용하기 OpenCV 3.4.0 모듈추가 [File] [New] [Import Module ] 메뉴선택 Source Directory 항목에서 C:\opencv\OpenCV-androidsdk\sdk\java 폴더선택 Module name 항목은자동으로 opencvlibrary340 입력됨 이후 [Next] [Finish] 버튼클릭 - 14 -

OpenCV Java API 사용하기 빌드설정파일수정 1 2 3 좌측상단탭을 [Android] 에서 [Project] 로변경 <Project>\OcvTest1\app\build.gradle 파일을참조하여 <Project>\OcvTest1\openCVLibrary340\build.gradle 파일을수정 (compilesdkversion, buildtoolsversion, minsdkversion, targetsdkversion 등의숫자값을동일하게수정 ) [Tools] [Android] [Sync Project with Gradle Files] 메뉴선택 1 3 2 copy - 15 -

OpenCV Java API 사용하기 모듈의존성설정 [File] [Project Structure ] 메뉴선택 2 3 1 4-16 -

OpenCV Java API 사용하기 모듈의존성설정 [File] [Project Structure ] 메뉴선택 (Con t) 5-17 -

OpenCV Java API 사용하기 OpenCV so 파일복사 <Project>\OcvTest1\app 아래에 JNI Folder 생성 Change Folder Location 선택하고 src/main/jnilibs/ 입력 - 18 -

OpenCV Java API 사용하기 OpenCV so 파일복사 (Con t) C:\opencv\OpenCV-android-sdk\sdk\native\libs 아래모든파일을복사하여 <Project>\OcvTest1\app\src\main\jniLibs\ 폴더에붙여넣기! 실제로는각하위폴더에서 *.so 파일만필요하며, *.a 파일은삭제해도무방함. - 19 -

OpenCV Java API 사용하기 activity_main.xml 파일편집 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.kkokkal.ocvtest1.mainactivity"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/imageview1" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="load Image" android:id="@+id/button1" android:onclick="onbutton1clicked" android:layout_alignparentbottom="true" /> </RelativeLayout> - 20 -

OpenCV Java API 사용하기 MainActivity.java 파일편집 loadlibrary("opencv_java3") - 21 -

public class MainActivity extends AppCompatActivity {... OpenCV Java API 사용하기 @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!haspermissions(permissions)) { requestpermissions(permissions, PERMISSIONS_REQUEST_CODE); imageview1 = findviewbyid(r.id.imageview1); @Override protected void ondestroy() { bitmap1.recycle(); bitmap1 = null; super.ondestroy(); public void onbutton1clicked(view view) { Intent intent = new Intent(Intent.ACTION_PICK); intent.settype(android.provider.mediastore.images.media.content_type); intent.setdata(android.provider.mediastore.images.media.external_content_uri); startactivityforresult(intent, REQ_CODE_SELECT_IMAGE); OpenCV와함께하는컴퓨터비전프로그래밍 - 22 -

@Override protected void onactivityresult(int requestcode, int resultcode, Intent data) { if (requestcode == REQ_CODE_SELECT_IMAGE) { OpenCV if (resultcode Java == Activity.RESULT_OK) API 사용하기 { try { String path = getimagepathfromuri(data.getdata()); BitmapFactory.Options options = new BitmapFactory.Options(); options.insamplesize = 4; bitmap1 = BitmapFactory.decodeFile(path, options); if (bitmap1!= null) { detectedge(); imageview1.setimagebitmap(bitmap1); catch (Exception e) { e.printstacktrace(); public String getimagepathfromuri(uri contenturi) { String[] proj = {MediaStore.Images.Media.DATA; Cursor cursor = getcontentresolver().query(contenturi, proj, null, null, null); if (cursor == null) { return contenturi.getpath(); else { int idx = cursor.getcolumnindexorthrow(mediastore.images.media.data); cursor.movetofirst(); String imgpath = cursor.getstring(idx); cursor.close(); return imgpath; OpenCV와함께하는컴퓨터비전프로그래밍 - 23 -

OpenCV Java API 사용하기 static final int PERMISSIONS_REQUEST_CODE = 1000; String[] PERMISSIONS = {"android.permission.read_external_storage"; private boolean haspermissions(string[] permissions) { int result; for (String perms : permissions){ result = ContextCompat.checkSelfPermission(this, perms); if (result == PackageManager.PERMISSION_DENIED){ return false; return true; public void detectedge() { Mat src = new Mat(); Utils.bitmapToMat(bitmap1, src); Mat edge = new Mat(); Imgproc.Canny(src, edge, 50, 150); Utils.matToBitmap(edge, bitmap1); OpenCV Java API 사용코드 src.release(); edge.release(); - 24 -

c:\opencv\opencv-android-sdk\sdk\java\src\org\opencv\android\utils.java OpenCV Java API 사용하기 OpenCV와함께하는컴퓨터비전프로그래밍 <opencv-src>\modules\java\generator\src\cpp\util.cpp - 25 -

OpenCV Java API 사용하기 AndroidManifest.xml 파일편집 - 26 -

OpenCV Java API 사용하기 gradle.properties 파일편집 android.usedeprecatedndk = true 문장추가한후, 우측상단의 Sync Now 클릭! - 27 -

OpenCV Java API 사용하기 실행결과 - 28 -

OpenCV Java API 사용하기 만약실행시아래와같은에러가발생한다면, <OcvTest1-src>\app\Build.gradle 파일에서 sourcesets 부분을수정 - 29 -

OpenCV Java API 사용하기 OpenCV Java API 도움말 http://docs.opencv.org/java/3.0.0/ - 30 -

JNI 를이용한 OpenCV 사용방법 OcvTest2 프로젝트생성 Android Studio 시작화면에서 Start a new Android Studio project: 선택 ( 또는 [File] [New] [New Project ] 메뉴선택 ) Application name : OcvTest2 Inlucde C++ Support 항목선택 이후설정은디폴트값사용 ([Next] & [Next] & & [Finish]) - 31 -

JNI 를이용한 OpenCV 사용방법 OpenCV 사용을위한기본설정하기 OcvTest1 프로젝트생성할때와마찬가지로 OcvTest2 프로젝트에서도 OpenCV 관련설정하기 (pp. 14 ~ 19 참고 ) OpenCV 3.4.0 모듈추가 빌드설정파일수정 모듈의존성설정 OpenCV so 파일복사 - 32 -

JNI 를이용한 OpenCV 사용방법 activity_main.xml 파일편집 - 33 -

JNI 를이용한 OpenCV 사용방법 MainActivity.java 파일편집 - 34 -

@Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!haspermissions(permissions)) { requestpermissions(permissions, PERMISSIONS_REQUEST_CODE); mjavacameraview = (JavaCameraView) findviewbyid(r.id.java_camera_view); if (mjavacameraview!= null) { mjavacameraview.setvisibility(surfaceview.visible); mjavacameraview.setcvcameraviewlistener(this); else { Log.e(TAG, "oncreate: mjavacameraview is null!"); @Override public void oncameraviewstarted(int width, int height) { Log.d(TAG, "oncameraviewstarted: width = " + width + ", height = " + height); mrgba = new Mat(); @Override public void oncameraviewstopped() { Log.d(TAG, "oncameraviewstopped:"); mrgba.release(); - 35 -

@Override public Mat oncameraframe(camerabridgeviewbase.cvcameraviewframe inputframe) { mrgba = inputframe.rgba(); nativedetectanddisplay(mrgba.getnativeobjaddr()); return mrgba; @Override protected void ondestroy() { super.ondestroy(); if (mjavacameraview!= null) mjavacameraview.disableview(); @Override protected void onpause() { super.onpause(); if (mjavacameraview!= null) mjavacameraview.disableview(); @Override protected void onresume() { super.onresume(); mjavacameraview.enableview(); - 36 -

static final int PERMISSIONS_REQUEST_CODE = 1000; String[] PERMISSIONS = {"android.permission.read_external_storage", "android.permission.camera"; private boolean haspermissions(string[] permissions) { int result; for (String perms : permissions){ result = ContextCompat.checkSelfPermission(this, perms); if (result == PackageManager.PERMISSION_DENIED){ return false; return true; /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ public native String stringfromjni(); public native void nativedetectanddisplay(long addrmat); - 37 -

JNI 를이용한 OpenCV 사용방법 native-lib.cpp 파일편집 - 38 -

void Java_com_example_sunkyoo_ocvtest2_MainActivity_nativeDetectAndDisplay( JNIEnv *env, jobject, jlong addrmat) { if (cascade.empty()) { cascade.load("/sdcard/haarcascade_frontalface.xml ); if (cascade.empty()) { return; Mat &src = *(Mat *) addrmat; Mat gray, gray2; cvtcolor(src, gray, COLOR_BGRA2GRAY); resize(gray, gray2, Size(640, 360)); // Screen Size: 1920x1080 vector<rect> faces; cascade.detectmultiscale(gray2, faces, 1.2, 3, 0, Size(40, 40)); for (size_t i = 0; i < faces.size(); i++) { Rect rc = faces[i]; rc.x *= 3; rc.y *= 3; rc.width *= 3; rc.height *= 3; rectangle(src, rc, Scalar(255, 0, 255), 2); - 39 -

JNI 를이용한 OpenCV 사용방법 CMakeLists.txt 파일편집 - 40 -

JNI 를이용한 OpenCV 사용방법 <OcvTest2-src>\app\Build.gradle 파일에서빌드방법수정 최신 android studio 의 NDK 에서 libc++ 을사용하기때문에발생한문제! (See https://stackoverflow.com/a/50320876) - 41 -

JNI 를이용한 OpenCV 사용방법 AndroidManifest.xml 파일편집 - 42 -

JNI 를이용한 OpenCV 사용방법 style.xml 파일편집 - 43 -

JNI 를이용한 OpenCV 사용방법 얼굴검출을위한 XML 파일을안드로이드폰에복사 c:\opencv\build\install\etc\haarcascades\ 폴더에있는 haarcascade_frontalface_default.xml 파일을안드로이드기기 sdcard 최상위폴더에복사 - 44 -

JNI 를이용한 OpenCV 사용방법 - 45 -

break - 46 -