반응형


안녕하세요 : )


NDK를 지원하는 안드로이드 프로젝트를 생성한 후, OpenCV 라이브러리를 추가하여 사용하는 방법을 설명합니다. 


간단한 예제로 OpenCV Java API에서 캡처한 영상을 OpenCV C++ API에서 그레이스케일 영상으로 변환하고 다시  OpenCV Java API에서 화면에 보여줍니다. 



2016.11.20 : 최초 작성 


2019. 8. 8 

OpenCV 4.1.1를 위해 카메라 코드를 수정하고 android.support 대신에 androidx를 사용합니다. 



2020. 1. 19

OpenCV 4.2.0과 최신 안드로이드 환경에서 테스트 해봤습니다.

별문제 없이 동작합니다.






2020. 6. 20

Android Studio 4.0에서 바뀐 점을 반영하였습니다.


Windows 10

OpenCV 4.3.0

Android Studio 4.0

Android 10

NDK 21





아래에 영상에서 사용한 코드를  모아두었습니다. 



1. bit.ly/0613-01


<!-- No Title Bar-->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>




2. bit.ly/0613-02


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:opencv="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:orientation="vertical"
    tools:context=".MainActivity">

    <org.opencv.android.JavaCameraView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        opencv:camera_id="any"
        android:visibility="gone"
        android:id="@+id/activity_surface_view" />

</LinearLayout>




3. bit.ly/0613-03


<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
<uses-feature android:name="android.hardware.camera.front" android:required="false"/>
<uses-feature android:name="android.hardware.camera.front.autofocus"  android:required="false"/>

<supports-screens android:resizeable="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true" />




4. bit.ly/0613-04


<activity android:name=".MainActivity"
android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">




5. bit.ly/0613-05


import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.annotation.TargetApi;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;
import android.view.SurfaceView;
import android.view.WindowManager;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;

import java.util.Collections;
import java.util.List;

import static android.Manifest.permission.CAMERA;


public class MainActivity extends AppCompatActivity
        implements CameraBridgeViewBase.CvCameraViewListener2 {

    private static final String TAG = "opencv";
    private Mat matInput;
    private Mat matResult;

    private CameraBridgeViewBase mOpenCvCameraView;

    public native void ConvertRGBtoGray(long matAddrInput, long matAddrResult);


    static {
        System.loadLibrary("opencv_java4");
        System.loadLibrary("native-lib");
    }



    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS:
                {
                    mOpenCvCameraView.enableView();
                } break;
                default:
                {
                    super.onManagerConnected(status);
                } break;
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        setContentView(R.layout.activity_main);

        mOpenCvCameraView = (CameraBridgeViewBase)findViewById(R.id.activity_surface_view);
        mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
        mOpenCvCameraView.setCvCameraViewListener(this);
        mOpenCvCameraView.setCameraIndex(0); // front-camera(1),  back-camera(0)
    }

    @Override
    public void onPause()
    {
        super.onPause();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }

    @Override
    public void onResume()
    {
        super.onResume();

        if (!OpenCVLoader.initDebug()) {
            Log.d(TAG, "onResume :: Internal OpenCV library not found.");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0, this, mLoaderCallback);
        } else {
            Log.d(TAG, "onResum :: OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }


    public void onDestroy() {
        super.onDestroy();

        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }

    @Override
    public void onCameraViewStarted(int width, int height) {

    }

    @Override
    public void onCameraViewStopped() {

    }

    @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

        matInput = inputFrame.rgba();

        if ( matResult == null )

            matResult = new Mat(matInput.rows(), matInput.cols(), matInput.type());

        ConvertRGBtoGray(matInput.getNativeObjAddr(), matResult.getNativeObjAddr());

        return matResult;
    }


    protected List<? extends CameraBridgeViewBase> getCameraViewList() {
        return Collections.singletonList(mOpenCvCameraView);
    }


    //여기서부턴 퍼미션 관련 메소드
    private static final int CAMERA_PERMISSION_REQUEST_CODE = 200;


    protected void onCameraPermissionGranted() {
        List<? extends CameraBridgeViewBase> cameraViews = getCameraViewList();
        if (cameraViews == null) {
            return;
        }
        for (CameraBridgeViewBase cameraBridgeViewBase: cameraViews) {
            if (cameraBridgeViewBase != null) {
                cameraBridgeViewBase.setCameraPermissionGranted();
            }
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        boolean havePermission = true;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(CAMERA) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);
                havePermission = false;
            }
        }
        if (havePermission) {
            onCameraPermissionGranted();
        }
    }

    @Override
    @TargetApi(Build.VERSION_CODES.M)
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == CAMERA_PERMISSION_REQUEST_CODE && grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            onCameraPermissionGranted();
        }else{
            showDialogForPermission("앱을 실행하려면 퍼미션을 허가하셔야합니다.");
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }


    @TargetApi(Build.VERSION_CODES.M)
    private void showDialogForPermission(String msg) {

        AlertDialog.Builder builder = new AlertDialog.Builder( MainActivity.this);
        builder.setTitle("알림");
        builder.setMessage(msg);
        builder.setCancelable(false);
        builder.setPositiveButton("예", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id){
                requestPermissions(new String[]{CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);
            }
        });
        builder.setNegativeButton("아니오", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                finish();
            }
        });
        builder.create().show();
    }


}




6. bit.ly/0613-06



#include <opencv2/opencv.hpp>

using namespace cv;




Mat &matInput = *(Mat *)mat_addr_input;
Mat &matResult = *(Mat *)mat_addr_result;

cvtColor(matInput, matResult, COLOR_RGBA2GRAY);




7. bit.ly/0613-07


# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

set(pathPROJECT C:/Users/webnautes/AndroidStudioProjects/UseOpenCVwithCMake) # 수정필요
set(pathOPENCV ${pathPROJECT}/sdk) # 수정 필요
set(pathLIBOPENCV_JAVA ${pathOPENCV}/native/libs/${ANDROID_ABI}/libopencv_java4.so)

set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

include_directories(${pathOPENCV}/native/jni/include)


# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
        native-lib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        ${pathPROJECT}/app/src/main/cpp/native-lib.cpp )



add_library( lib_opencv SHARED IMPORTED )

set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${pathLIBOPENCV_JAVA})


# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
        native-lib

        lib_opencv

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib} )




참고


https://developer.android.com/ndk/guides/index.html


https://developer.android.com/studio/projects/add-native-code.html


https://github.com/googlesamples/android-ndk


http://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html


http://docs.opencv.org/2.4/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html



반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

  1. 이전 댓글 더보기
  2. BlogIcon ㅎㅎ 2019.10.08 15:11

    Mat 구조체 그쪽은 처음들어서 잘 모르겠는데 이거를 이용한 포스팅글도 있나요?? 좀더 심화된과정의 내용이 필요해서.. ㅜㅜ 카메라로 찍은 이미지를 활용하는 앱이라던지 더 나아가는 포스팅글이 있으면 정독하고 싶습니다 그리고 영상을 분석하는게 아닌 카메라로 찍었을때 이미지를 분석하는 앱을 만드려고 하는데 영상분석보다는 이미지분석이 쉬운걸로 알고 있습니다 혹시 도움이될만한 깃허브 소스라던가 글이 있으면 추천해주시면 감사하겠습니다 ㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.08 17:24 신고

      현재는 OpenCV/Android 개발 환경 및 예제 카테고리에 있는게 전부입니다.

      대부분의 경우 C++로 작성된 것을 cpp 함수에 추가하면 동작하기 때문에 심화라고 할게 없을 듯합니다.

  3. 황재현 2019.10.15 14:28

    안녕하세요 저도 윗분과같이 native-lib.cpp 파일에
    Mat &matInput = *(Mat *)matAddrInput;
    Mat &matResult = *(Mat *)matAddrResult;
    코드중 matAddrInput; 과 matAddrResult; 부분이 빨강색글씨로 뜹니다.
    다른 함수들은 Sync project with Gradle files 하니 다 돌아왔는데 이 두개만 이러네요 해결방법이 있나요??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.15 17:34 신고

      cpp 파일에 함수 생성시 파라미터 값이 변경되었네요.

      matAddrInput 대신에 mat_addr_input를
      matAddrResult 대신에 mat_addr_result를 적으세요.

    • 황재현 2019.10.15 19:10

      정말 감사합니다 이문제는 해결되었고,

      안드로이드 어플을 실행시키고, 권한 apply
      해주니깐 이상한 픽셀로 된 캐릭터 얼굴이 흔들리는 화면이 나옵니다.
      이건 코드문제가 아닌건가요??

      사진 첨부할수있으면 종을텐데 아쉽네요

      또 궁금한게 어느프로그램에서 캡쳐를 해야 이 어플에 화면이 뜨는 것인지도 궁금합니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.15 21:33 신고

      혹시 에뮬레이터 아닌가요?

    • 황재현 2019.10.16 08:41

      아 그냥 기존에있던 안드로이드 프로그램말고 녹스나 모모같은 에뮬레이터를 사용해야하는건가요??

      만약 맞다면 사용방법도 알려주실 수 있나요??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.16 13:56 신고

      가급적이면 실제 폰에서 하는게 좋습니다. Genymotion이 괜찮습니다. 제 블로그 검색하면 관련 글이 있습니다.

    • 황재현 2019.10.16 14:37

      감사합니다 지니모션 설치 후 연동까지완료하였는데,
      지니모션에서 사진이나 동영상촬영 후 안드로이드 스튜디오에서 구동을시키면
      지니모션 앱에서 흰 화면만 나옵니다.혹시 무슨문제일까요...?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.16 16:28 신고

      지니모션 설정에서 카메라 설정을 했나요?

    • 황재현 2019.10.16 17:15

      네 on으로 설정하고, 프론트카메라 웹캠으로 설정 후 프리뷰해보니 캠은 이상없는데, 프로그램을 실행시키면 흰 화면만 나오네요 ㅜㅜ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.16 18:09 신고

      코드에서 사용하는 카메라는 전면이 아닌 후면입니다. 지니모션에서 후면에 웹캠을 연결하세요.

    • 황재현 2019.10.16 19:14

      네 친절한답변 감사합니다 !!

  4. 체리블루 2019.10.24 15:58

    저는 구동은 되는데 화면이 흑배모드로 나오고, 촬영 버틍이라든가 버튼이 나타나질 안습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.24 17:59 신고

      포스트는 흑백으로 바꾸는 예제입니다.

      컬러영상을 보려면 onCameraFrame 함수의 아래 두줄을 주석처리하고 다음처럼 수정하면 됩니다.

      //ConvertRGBtoGray(matInput.getNativeObjAddr(), matResult.getNativeObjAddr());
      //return matResult;
      return matInput;


      버튼을 추가하려면 다음 포스트의 3번을 참고하세요
      https://webnautes.tistory.com/1087

  5. student02 2019.10.25 10:12

    안녕하세요. 덕분에 opencv공부하는데 많은 도움이 되고있습니다. 감사합니다.
    다름이 아니라 중간에 c++로 영상을 변환하는 이유가 뭔가요?? java만 이용해서 할수는 없는건가요??
    cmake를 써야 하는 이유가 궁금합니다..ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.25 10:56 신고

      java코드보다 c++코드가 빠르게 실행됩니다. 포스트의 코드는 같이 사용하는 예를 보여주는 겁니다.

    • student02 2019.10.25 11:28

      아.. 영상처리하는 시간을 단축시키려고 하는건가요??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.25 17:21 신고

      맞습니다.

      java코드로 돌리기엔 너무 느린 코드들을 C++로 작성하여 돌리면 상대적으로 빠르게 동작합니다.

  6. CityRock 2019.10.29 09:41

    이유는 모르지만 안드로이드 스튜디오 3.5에서 cmake error가 나서 3.4.2 로 하니 잘되는군요. 자료 감사합니다. 유투브 구독과 좋아요 클릭할게요:-)

  7. upright 2019.11.26 04:36

    안녕하세요 고수님 자세한 설명 감사합니다
    저번 예제는 잘 됐는데 이번 예제는 실행하면 바로 꺼지네요..

    run에서
    --------- beginning of crash
    A/libc: Fatal signal 4 (SIGILL), code 1, fault addr 0xdee5f502 in tid 8249 (cvcameraexample)

    logcat에서
    2019-11-26 04:32:13.347 817-2597/? E/IzatSvc_PassiveLocListener: Exiting with error onLocationChanged line 154 "1"
    2019-11-26 04:32:37.797 1133-1403/? E/storaged: getDiskStats failed with result NOT_SUPPORTED and size 0
    2019-11-26 04:32:42.841 29564-29564/? E/android.youtub: Not starting debugger since process cannot load the jdwp agent.
    2019-11-26 04:32:43.062 29564-29589/? E/GEL_DELAYED_EVENT_DEBUG: Failed delayed event dispatch, no dispatchers.
    2019-11-26 04:32:48.893 787-813/? E/vendor.lge.hardware.lgmd@1.0-service: readFile: Could not open /sys/class/power_supply/usb/is_ocp

    이런식으로 뜨는데 어떻게 해야 할까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.26 09:28 신고

      올려주신 로그캣에 에러 원인이 포함되지 않은 듯합니다.

  8. orz 2019.12.16 14:47

    위의 소스들을 따라해서 실제 스마트폰에서 실행해봤더니 별다른 이상 없이 작동하고, 카메라 권한도 제대로 가져왔지만 어째서인지 흑백 화면이 아니라 온통 새까만 화면만 보입니다.

    실행에 오류는 나오지 않았고 카메라 권한은 제대로 가져왔고 소스를 그대로 복사도 해봤고, openCV 라이브러리도 안에 제대로 추가되어 있어서 뭐가 문제인지 모르겠네요.


    혼자서 소스 뒤적거려가며 원인을 찾으려 했지만 도저히 찾을 수 없어서 도움을 요청합니다. 도와주세요...

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.16 15:39 신고

      4.1.1 이상에서하는 코드를보면 자바코드에 있는 권한코드가 이전버전과 다릅니다.
      증세로 봐서는 권한 문제 같습니다.
      로그캣에 관련 오류가 있아보세요

      안드로이드 스튜디오 버전과 OpenCV 그리고 안드로이드 버전을 어떻게해서 진행했나요?

    • orz 2019.12.16 15:58

      안드로이드 스튜디오 버전 3.5.1, OpenCV 버전은 4.1.2, 안드로이드 버전은 8.1.0입니다.

      카메라를 사용하지 않는 OpenCV 예제를 찾아서 해보니까 이건 또 잘되네요... 카메라 문제인가...

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.16 16:08 신고

      로그캣의ㅜ필터를 에러로 바꾼 상태에서 앱 실행시 보이는 로그를 봐야할듯합니다

    • orz 2019.12.16 16:17

      로그캣에 찍히는 로그 중 에러는
      E/OpenCV/StaticHelper: OpenCV error: Cannot load info library for OpenCV
      이것 한 줄 뿐이로군요.

      그 밑으로는

      D/OpenCV/StaticHelper: Library list: ""
      D/OpenCV/StaticHelper: First attempt to load libs
      D/OpenCV/StaticHelper: Trying to init OpenCV libs
      D/OpenCV/StaticHelper: Trying to load library opencv_java4
      D/OpenCV/StaticHelper: Library opencv_java4 loaded
      D/OpenCV/StaticHelper: First attempt to load libs is OK

      이렇게 찍히고요.

      진짜 뭐가 문제지...

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.16 16:19 신고

      안드로이드 버전을 포스트와.맞춰보세요

    • orz 2019.12.16 16:32

      안드로이드 버전 10(API 29) 지원 기기가 없습니다...orz

      안드로이드 버전 9(API 28)인 기기는 있어서 실행시켜보면 마찬가지로
      E/OpenCV/StaticHelper: OpenCV error: Cannot load info library for OpenCV
      한줄만 뜨고요.

      내일 안드로이드 버전 10 지원 기기 대여해와서 돌려봐야겠습니다.

      도와주셔서 감사합니다.

  9. hello 2020.01.16 17:40

    sync를 맞추는 부분에서 ERROR: Cause: executing external native build for cmake C:\(경로)\CMakeLists.txt
    다음과 같은에러가 나옵니다..ㅜㅜ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.01.16 23:28 신고

      사용한 환경을 포스트와 맞추지 않았다면 맞추어서 해보세요.

    • hello 2020.01.16 23:33

      댓글 감사합니다!
      OpenCV 4.1.1, 4.1.2, 안드로이드 스튜디오 3.5.1, NDK 19,20까지 해봤습니다.
      stackoverflow에서 NDK 버전을 낮추라는 말을 듣고 17년도 버전을 받아서도 사용해봤지만 같은 결과가 나옵니다..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.01.16 23:34 신고

      혹시 프로젝트 경로에 한글 이름이 포함되있나 요

    • hello 2020.01.17 09:17

      아뇨.. 전부 영어입니다.
      또 어디서는 app gradle에서 externalNativeBuild를 통채로 지우라길래 지웠다가 sync는 맞춰졌지만 java에서 native-lib을 인식하지 못하는 상황도 있었습니다..

    • hello 2020.01.17 14:18

      Event Log를 확인해보니 경로를 설정했음에도 NDK 21로 적용돼있었습니다.. 그래서 그냥 21을 지워버리고 다시하니 Sync는 적용이 됐습니다!!

      근데 중간중간 AppCompatActivity, nonnull같은 부분은 빨간표시가 떠서 alt+enter로 import class를 해서 적용을 했는데 단말기에 올리니 까만 화면에서 멈추고 에러 로그에는 OpenCV error: Cannot load info library for OpenCV 라고 나옵니다..

      댓글들을 보니 안드로이드 버전도 맞추라고 하셨는데 그럼 낮은 버전에서는 돌릴 수 없나요? 6.0, 7.0입니다 버전은

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.01.18 08:24 신고

      낮은 버전에서는 문제가 생길 수 있습니다.

  10. 김당근 2020.01.30 07:25

    선생님, 안녕하세요.
    이 게시글을 보고난 뒤, 그동안 안드로이드 실행이 안 되어서 몸속에 쌓아 놨던 사리 다 털어냈네요...껄껄
    정말 감사드립니다. 영상으로 보니까 파일 경로를 정확히 알 수 있어서 참 좋았어요.
    설명도 좋고, 목소리도 밝고, 우렁차셔서 즐거웠어요.
    다시 한번 감사드립니다. 앞으로도 블로그와 유튜브 채널 통해서 많은 정보와 지식 얻고 가겠습니다!
    파이팅!!

  11. 캡스톤중 2020.02.24 14:47

    안녕하세요 제가 이번에 안드로이드 스튜디오에서 제작한 어플과 아두이노를 이용한 라인 트레이싱을 하는 중인데요
    그래서 이 카메라 예제를 따라서 해보려는데 create fuction부분에서 다른게 나오고 그래서인지 app-cpp에 cmake가 없어요 ㅠㅠ
    그리고 혹시 라인트레이싱관련도 알수잇을까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.02.24 22:54 신고

      문제가 생겼을땐 프로젝트를 새로 생성하는게 좋습니다. 안드로이드 스튜디오에서 처리가 끝났을때 다음 단계로 넘어가야 합니다

  12. 삽질중 2020.03.19 08:39

    안녕하세요, 따라했더니, 화면은 잘 나오는데요.... 세로 모드에서는 90도 돌아가 있고, 가로모드 한쪽은 잘 나오는데, 반대로 돌린 가로모드에서는 화면이 뒤집혀있는데요.. 이 부분은 왜 그런걸까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.03.19 08:44 신고

      핸드폰의 화면 방향을 잡아주는 센서가 제때 동작못해서 발생하는 문제 같습니다. 안드로이드 폰 기종에 따라 발생하는 문제로 보입니다

    • 삽질중 2020.03.19 10:03

      혹시 화면 돌리는 방법이 있을까요? 제가 폰 3개에서 해봤는데, 모두 똑같은 증상으로 봐서.. 화면을 돌려야할거 같습니다.

      아니면, 핸드폰을 돌리는 거에 따라서 화면이 바뀌지 않고, 그냥 세로 모드로만 볼 수 있는 방법이 있을까요? 제가 굳이 화면이 회전될 필요는 없거든요

      혹시 opencv를 4점대가 아닌, 제가 opencv를 3.4.5를 사용하고 있는데, 이게 문제가 될 수는 있을까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.03.19 11:15 신고

      OpenCV 버전 문제는 아닌듯합니다. OpenCV의 카메라 API의 문제인듯 싶습니다. 그리고 세로방향으로 고정하면 카메라 프리뷰가 전체화면이 안됩니다.

      안드로이드API로 작성한 카메라앱을 사용해보는건 어떨까 싶네요

  13. 이상혁 2020.05.13 21:02

    FAILURE: Build failed with an exception.

    * What went wrong:
    Execution failed for task ':app:externalNativeBuildDebug'.
    > Build command failed.
    Error while executing process C:\Users\82108\AppData\Local\Android\Sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C C:\Users\82108\AndroidStudioProjects\opencvex1\app\.cxx\cmake\debug\x86 native-lib}
    ninja: Entering directory `C:\Users\82108\AndroidStudioProjects\opencvex1\app\.cxx\cmake\debug\x86'

    ninja: error: 'C:/Users/82108/AndroidStudioProjects/opencvex1/opencv/native/libs/x86/libopencv_java4.so', needed by 'C:/Users/82108/AndroidStudioProjects/opencvex1/app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so', missing and no known rule to make it


    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

    * Get more help at https://help.gradle.org

    BUILD FAILED in 818ms


    ---------------------
    Build command failed.
    Error while executing process C:\Users\82108\AppData\Local\Android\Sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C C:\Users\82108\AndroidStudioProjects\opencvex1\app\.cxx\cmake\debug\x86 native-lib}
    ninja: Entering directory `C:\Users\82108\AndroidStudioProjects\opencvex1\app\.cxx\cmake\debug\x86'

    ninja: error: 'C:/Users/82108/AndroidStudioProjects/opencvex1/opencv/native/libs/x86/libopencv_java4.so', needed by 'C:/Users/82108/AndroidStudioProjects/opencvex1/app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so', missing and no known rule to make it

    빌드 돌리면 이런 오류들이 뜹니다 ㅜㅜ 코드에 디렉토리 바꾸고 돌렸는데
    계속 찾고있는데 라이브러리 so파일이 인식 안되거나 디렉토리가 잘못되면 이렇다는데...
    혹시 어떻게 해결하는지 아시나요? ㅜㅜ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.05.13 22:58 신고

      문제가 생겼을 경우 다시 진행하는게 더 빠르게 해결할 수 있습니다.

      영상으로보시고 다시 진행해보세요.

  14. 안녕하세요 2020.06.09 19:40

    영상을 보고 4번째 다시 시도해도 native-lib.cpp 파일에

    #include <opencv2/opencv.hpp>

    using namespace cv;

    빨간줄 그여있고

    하여간 빨갛게 뜨고 뭐 opencv가 인식이 안되는지 계속해도 안됩니다..

    영상 정확하게 4번째 따라하면서 다 했는데도...여기서 문제가 계속 생겨요..

    어떻게 하면 좋을까요 ㅠ

    Build command failed.
    Error while executing process C:\Users\jang7\AppData\Local\Android\Sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C C:\Users\jang7\ViOWLA_dev\app\.cxx\cmake\debug\x86 native-lib}
    ninja: Entering directory `C:\Users\jang7\ViOWLA_dev\app\.cxx\cmake\debug\x86'

    ninja: error: 'C:/Users/jang7/ViOWLA_dev/opencv/native/libs/x86/libopencv_java4.so', needed by 'C:/Users/jang7/ViOWLA_dev/app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so', missing and no known rule to make it

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.09 19:51 신고

      x86이 보이는 거 봐서는 에뮬레이터 같은데 맞나요?

      실제 안드로이드 디바이스에서만 가능합니다.

  15. Favicon of https://asung123456.tistory.com BlogIcon asung123456 2020.06.28 22:26 신고

    도움 많이 됬습니다 감사합니다!!

  16. 방문객 2020.07.31 03:06

    정말 친절한 설명 감사합니다.

  17. jyshin 2020.08.26 17:33

    위 예제에서.. native-lib.cpp을 Visual Studio에서 빌드 후 .so 로 만들어서 현재 Android Studio 프로젝트의 CMakeList.txt 에 추가했을 경우, 현재 Android Studio가 사용중인 SDK API level하고 NDK 버전이 다르다면 빌드시 오류 발생하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.08.26 18:12 신고

      비주얼 스튜디오에서 리눅스 Arm용으로 so 파일을 만들었나요?

  18. jyshin 2020.08.28 20:09

    비주얼 스튜디오에서 리눅스 Arm용으로 so 파일을 만들었나요?
    답변) 아니요. visual studio 2019 pro 버전 이용자입니다. VS 2019는 android dynamic 라이브러리 생성 프로젝트 기능이 있어서.. VS 의 Android 라이브러리 생성 기능으로 .so를 만들었습니다.
    Sdk 와 ndk 버전이 android studio 의 프로젝트 보다는 하위버전이었는데.. 이게 원인일까요?

  19. Favicon of https://hwangchan.tistory.com BlogIcon HwangChan 2020.09.24 10:47 신고

    저...빌드 도중에
    Unexpected native build target opencv_jni_shared. Valid values are: native-lib
    이런 에러가 뜨는데 build.gradle(;sdk)쪽에서 확인 했는데 어떻게 해결해야 할지 모르겠네요..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.09.24 10:52 신고

      cpp 파일이름을 opencv_jni_shared로 바꾸어서 문제 생긴듯합니다. native-lib로 사용해야합니다.

    • Favicon of https://hwangchan.tistory.com BlogIcon HwangChan 2020.09.24 11:14 신고

      그 빌드와 설치는 잘되었는데 앱을 실행 시키면 강제종료가 됩니다..혹시 왜그러는지 아시나요..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.09.24 12:41 신고

      로그캣에서 원인을 찾아야 합니다. 포스트와 차이나는 부분을 검토해야 할듯합니다. 포스트 코드는 여러번 검증했습니다.

    • Favicon of https://hwangchan.tistory.com BlogIcon HwangChan 2020.09.24 14:36 신고

      2020-09-24 14:28:11.802 17058-17058/? E/Zygote: isWhitelistProcess - Process is Whitelisted
      2020-09-24 14:28:11.807 17058-17058/? E/Zygote: accessInfo : 1
      2020-09-24 14:28:11.839 17058-17058/? E/example.camera: Unknown bits set in runtime_flags: 0x8000
      2020-09-24 14:28:12.058 17058-17058/com.example.camera3 E/AndroidRuntime: FATAL EXCEPTION: main
      Process: com.example.camera3, PID: 17058
      java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found
      at java.lang.Runtime.loadLibrary0(Runtime.java:1071)
      at java.lang.Runtime.loadLibrary0(Runtime.java:1007)
      at java.lang.System.loadLibrary(System.java:1667)
      at com.example.camera3.MainActivity.<clinit>(MainActivity.java:39)
      at java.lang.Class.newInstance(Native Method)
      at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
      at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
      at android.app.Instrumentation.newActivity(Instrumentation.java:1251)
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3436)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3707)
      at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
      at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
      at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2220)
      at android.os.Handler.dispatchMessage(Handler.java:107)
      at android.os.Looper.loop(Looper.java:237)
      at android.app.ActivityThread.main(ActivityThread.java:8016)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076)
      로그캣 확인 결과인데 LoadLibrary쪽에서 오류가 뜬거같습니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.09.24 20:48 신고

      다음 에러가 문제 인듯합니다.
      java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found

      아래 링크의 답변을 참고하면
      https://www.366service.com/jp/qa/c99576c8dd71930bfe63deaeda9bd986

      다음 한줄을 CMakeLists.txt에 추가하면 해결된다는데 테스트는 못해봤습니다.

      include(ndk-stl-config.cmake)

      위 링크에 가보면 어디에 삽입해야 하는지 보여주는 링크가 있습니다. '

  20. Favicon of https://dhpark1212.tistory.com BlogIcon EastHoon 2020.11.17 21:27 신고

    조금 아쉬운 부분은 있네요.

    복사하는 코드가 어떤 내용을 담고 있는지 조금더 설명이 있으면 좋을 것 같습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.11.17 21:44 신고

      좋은 의견 감사합니다. 다음번 업데이트시 반영하도록 하겠습니다

  21. Favicon of https://dhpark1212.tistory.com BlogIcon EastHoon 2020.11.17 22:19 신고

    처음에 C:\OpenCV-android-sdk\sdk 파일 선택했을 때 Finish 버튼 활성화 안됬었는데

    프로젝트 지우고 다시 선택하니 활성화가 됬습니다.

    이건 왜 그런 거죠??

+ Recent posts