반응형


안녕하세요 : )


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



2021. 1. 6

다음 환경에서 문제 없이 동작함을 확인했습니다. 

최근 안드로이드 버전에서 styles.xml 이 변경되었는데 마지막줄에 넣어주면 됩니다. 


OpenCV 4.5.1

Android Studio 4.1.1

Android 11(API 30)

NDK 22( 추가로 21.1.6352462를 설치하고 진행해야 합니다.)


다음처럼 보일경우 해당 경로로 이동하여 21.1.6352462-2 폴더가 추가로 생겼나 확인하여 21.1.6352462로 바꾸세요. 


NDK at C:\Users\webnautes\AppData\Local\Android\Sdk\ndk\21.1.6352462 did not have a source.properties file





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



1. bit.ly/0613-01


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


최신 버전의 경우 themes.xml 파일에 붙여 넣기 합니다.


<resources xmlns:tools="http://schemas.android.com/tools">
    

        <!-- Customize your theme here. -->
        <!-- No Title Bar-->
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
</resources>



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. 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 신고

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

  3. 김당근 2020.01.30 07:25

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

  4. 캡스톤중 2020.02.24 14:47

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

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

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

  5. 삽질중 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로 작성한 카메라앱을 사용해보는건 어떨까 싶네요

  6. 이상혁 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 신고

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

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

  7. 안녕하세요 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이 보이는 거 봐서는 에뮬레이터 같은데 맞나요?

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

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

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

  9. 방문객 2020.07.31 03:06

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

  10. 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 파일을 만들었나요?

  11. jyshin 2020.08.28 20:09

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

  12. 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)

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

  13. 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 신고

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

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

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

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

    이건 왜 그런 거죠??

  15. Favicon of https://50billion-dollars.tistory.com BlogIcon 로구상 2021.01.05 03:49 신고

    실행은 아무 이상없이 되는데, 혹시 인식이 어떻게 진행되는 건가요?
    그냥 카메라 화면만 나오고, 인식이 안 되는 것 같습니다.

  16. Favicon of https://lolou.tistory.com BlogIcon 의도_ 2021.01.06 21:00 신고

    안녕하세요, BaseLoaderCallback 클래스에서
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.util.Log;
    이 부분을 임포트 해 오지 못하여서 오류가 나고 있어요
    왜그런걸까요??

    run을 돌려보면

    C:\Users\leebbr\AndroidStudioProjects\OpenCVCamera\app\src\main\cpp\CMakeLists.txt : C/C++ debug|arm64-v8a : CMake Error at C:\Users\leebbr\AndroidStudioProjects\OpenCVCamera\app\src\main\cpp\CMakeLists.txt:23 (add_library):
    Cannot find source file:

    C:/Users/webnautes/AndroidStudioProjects/OpenCVCamera/app/src/main/cpp/native-lib.cpp

    Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
    .hxx .in .txx

    이런식으로 에러가 찍혀요..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2021.01.06 22:19 신고

      좀 더 확인이 필요하겠지만 에러를 보니 CMakeLists.txt에서 프로젝트 위치를 잘못수정하신듯합니다. webnautes라고 적힌부분이 leebbr이 되어야 할거 같네요

  17. Favicon of https://phj9908.tistory.com BlogIcon pasongsong 2021.01.07 16:26 신고

    항상 감사합니다
    opencv 4.4
    안드로이드 스튜디오 gradle 4.1.1
    ndk 22
    로 하면 native 함수가 JNI로 변환이 안되고(빨간색 전구에 안뜨더라고요..)
    gradle을 3.5.1로 변경해야 JNI함수로 변경가능 하던데 ndk 21.1.6352462를 추가로 설치하면 해결되는 것인가요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2021.01.07 16:59 신고

      네 맞습니다. 제가 빨간글씨로 표시한 폴더가 제대로 생성되었나 꼭 확인해보세요

  18. Favicon of https://lolou.tistory.com BlogIcon 의도_ 2021.01.11 14:34 신고

    안녕하세요, 제가 응용을 해서 버튼별로 화면의 색을 바꿔주는 것까지 응용을 하였고요,
    이제 추가로 촬영 버튼을 누르면 저장이 되게 구현하고 싶은데 https://webnautes.tistory.com/1087의 3번을 참고해서 동일하게 구현했더니,
    버튼(화면의 색을 바꿔주는버튼이나 촬영버튼 )들을 누르면 2021-01-11 14:26:34.133 2158-2158/com.leebbr.opencvcamera D/JavaCameraView: Preview Frame received. Frame size: 3110400
    이것만 계속 로그캣에 찍히면서 화면이 버튼눌렀을 때의 화면만 보여지고 멈춘 후에 렉이 걸려버려요..
    어느부분 때문에 그런걸까요..

  19. 2021.01.11 14:52

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2021.01.11 18:37 신고

      코드만 봐서는 원인을 찾기 힘듭니다. 디버깅을 시도해보거나 코드를 단계별로 실행해서 원인을 찾아야 할거 같삽니다.

  20. Favicon of https://lolou.tistory.com BlogIcon 의도_ 2021.01.11 22:46 신고

    답변 주셔서 항상감사드려요:)
    제가 초보라,, 촬영버튼 눌렀을 때 저장되는 것 때문에 너무 힘드네요ㅠㅠ
    boolean ret = Imgcodecs.imwrite( filename, matResult);
    if ( ret ) Log.d(TAG, "SUCESS");
    else Log.d(TAG, "FAIL");

    여기서 ret이 계속 FAIL로 로그가 찍혀서 저장이 안되는건가 해요.. (추측일뿐)
    어디를 어떻게 수정하면 될지 알려주실 수 있을까요?ㅠㅠㅠ
    matResult : Mat [ 1080*1920*CV_8UC4, isCont=true, isSubmat=false, nativeObj=0x6fab6c6140, dataAddr=0x6f35200000 ]
    matResult 값을 이용해서 뭘 하면 될것같기도 한데... 도저히 감이 안와요ㅠㅠ

    그리고 이게 저장이 되면 갤러리에 저장이 되는건가요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2021.01.11 23:51 신고

      다음 포스트의 코드를 썼는데 안된경우라면
      https://webnautes.tistory.com/1087

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2021.01.11 23:53 신고

      안드로이드 10.0에서 발생하는 퍼미션 문제 일수 있습니다. 메니페스트 파일에 두번째 줄을 추가해보세요.

        <application
              android:requestLegacyExternalStorage="true"

  21. Favicon of https://toy9910.tistory.com BlogIcon 도리닥 2021.01.20 12:34 신고

    안드로이드 기본 카메라 어플을 사용하여 사진을 찍은 후에 해당 사진을 openCV로 roi에 영상처리를 할 수 있을까요?

+ Recent posts