AWS를 자주 사용하지 않고 root 비밀번호가 자주 사용하지 않는 비밀번호이면 잊어버리는 경우가 발생합니다.  이때는 AWS에 등록해 놓은 메일주소와 비밀번호가 더 중요합니다.

비밀번호 찾기라고 했지만 비밀번호 변경이라고 하는 것이 더 적합한 표현입니다.

방법은 아주 쉬우니 간단히 따라가 봅니다.

 

AWS 루트에 로그인을 하려면 최초 등록한 메일 주소를 입력하고

 

 

 

 

기억나는 비밀번호를 입력했는데

 

 

 

비밀번호가 맞지 않는다면 (이메일 주소가 틀린 경우에도 등록되지 않았다는 오류 발생).

인증 실패 오류가 발생합니다.

 

그러면 비밀번호 입력란 우측 상단의 [비밀번호 찾기]를 클릭하면 비밀번호 복구 팝업 창이 나오는데

 

 

여기에 이미지에 있는 문자를 입력하고 [이메일 보내기] 버튼을 클릭하면

 

 

 

비밀번호를 복구할 수 있는 메일을 보내줍니다.

 

이제 메일을 확인해 봅니다.

아래와 같이 기나긴 링크 주소를 포함하는 메일이 도착 했습니다.

 

 

 

 

Amazon Web Services에서 알려 드립니다.

이 이메일 주소와 연결된 AWS 계정의 비밀번호 재설정 요청을 받았습니다. 아래 링크를 클릭한 후 보안 서버를 사용하여 비밀번호를 재설정하십시오.

https://signin.aws.amazon.com/resetpassword?type=RootUser&token=uLBQpleoTwuLSoOt5FZrsq0xi57bzbdfZ7VUw8PPfqC_yt1uSq3uYNcd61KOJR73hsALQCrGJIvQU7Lv9CzcBg6B-6DkrxC-w4R3jgnlw3s88-KnxlsFajGdL8uwWgf1duwqLgqvyx5DCDSgTYTlIMCJdeCHnOWkSNq_9tjwJsZPw0NozE6tQxHu4RTrbTNWBZ7EpB2ReFg2QSh8g03vHwBQKwKjXkTT_fPplbUZZG1Q2a_Jt7PN7GT0rTqXK1hoCEI97AfsGU4XpBDJ_QhKxF_NGWGmLAYUADnnzw&key=AQIDAHhIU2rYKiqXYckMu9vmHkrP9AbVRT2DSzh4_8tpwZMe2QGTTtdFLqRynrinHlNFTOdmAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM_2FyNP0M-8boBl8GAgEQgDtxnqkDlhm3RbaeTqlRMP1_lAt6alozxfP6XDkvrXOE2lBx_hNtZLSjIET2ndfgl5A_EyvwCMVPLqFo4w

링크를 클릭해도 작동하지 않을 경우 링크를 복사해서 웹 브라우저 주소 표시줄에 붙여 넣어 보십시오. 위의 링크를 클릭한 후 AWS 계정의 새 비밀번호를 생성할 수 있습니다.

비밀번호 재설정 요청을 하지 않은 경우 이 이메일을 무시하십시오. Amazon Web Services 계정은 안전합니다.

Amazon Web Services는 비밀번호, 신용카드 또는 은행 계좌 번호를 묻거나 또는 확인하라는 이메일을 절대 보내지 않습니다. 계정 정보를 업데이트하라는 링크가 포함된 의심스러운 이메일을 받으신 경우 링크를 클릭하지 마십시오. 그리고 해당 이메일을 조사할 수 있도록 Amazon Web Services에 보고해 주십시오.

도움이나 지원이 필요한 경우 AWS Support Center(https://aws.amazon.com/support)를 방문하십시오.

Amazon Web Services를 이용해 주셔서 감사합니다.


안녕히 계십시오.
Amazon Web Service 팀 드림

 

 

메일 내용 중 https://signin.aws.... 로 시작하는 링크를 클릭하면 비밀번호를 변경할 수 있는 새로운 창이 나옵니다.

 

 

여기에 변경하려는 비밀번호를 입력하면 비밀번호 재설정이 완료됩니다.

기존 비밀번호를 입력하는 창이 없어서 다행입니다.

 

 

이제는 잊지 말고 잘 기억 또는 기록을 해야겠네요.

 

메일로 보내온 링크는 1회만 사용 가능 합니다.

다시 변경하려면 앞에서 했던 비밀번호 찾기 과정을 반복해야 합니다.

AWS는 인스턴스 사용기간이 1년인데 늦기 전에 삭제를 해야 겠습니다.

 

- copy coding -

 

 

 

어떤 제품을 만드는가에 따라서 프로그램 언어를 선택하게 되는데 그에 따라 인기 순위도 시대에 따라 많이 변경되어 왔습니다.  이제는 java에서 python으로 조금씩 바뀌는 추세인데 개인적으로는 go 언어가 장기적으로는 사용범위가 넓어질 것으로 생각 됩니다.

오늘은 간단히 Windowsgo를 설치하고 확인하는 과정에 대해 알아봅니다.

 

go langgoogle에서 개발한 프로그램으로 golang으로 검색을 하면 바로 조회가 됩니다.

 

 

그냥 바로 다운로드 페이지로 이동하려면 아래 주소를 입력하면 됩니다.

https://go.dev/dl/

 

 

운영체제에 따라 설치 파일을 제공하는데 필요한 파일을 다운로드 하면 됩니다.

설치 및 간단한 사용법등에 대해서는 사이트에서 제공하는 공식 문서를 이용하면 됩니다.

 

 

여러 운영체제 중 Windows에 설치하는 방법입니다.

 

 

Go installation
Select the tab for your computer's operating system below, then follow its installation instructions.
Windows SHAPE  \* MERGEFORMAT
1.    Open the MSI file you downloaded and follow the prompts to install Go.
By default, the installer will install Go to Program Files or Program Files (x86). You can change the location as needed. After installing, you will need to close and reopen any open command prompts so that changes to the environment made by the installer are reflected at the command prompt.
2.    Verify that you've installed Go.
1.    In Windows, click the Start menu.
2.    In the menu's search box, type cmd, then press the Enter key.
3.    In the Command Prompt window that appears, type the following command:
$ go version 
4.    Confirm that the command prints the installed version of Go.

 

 

문서에 있는대로 설치방법을 따라 진행해보도록 하겠습니다.

 

다운받은 msi 파일(go1.21.0.windows-amd64.msi)을 실행합니다.

 

그리고 대부분 [Next] 버튼을 클릭하면 됩니다.

 

 

[Next] 버튼을 클릭 합니다.

 

 

라이센스 동의하고 [Next] 버튼을 클릭합니다.

 

 

설치 위치를 정하고 [Next] 버튼을 클릭합니다.

설치 위치는 자유롭게 해도 됩니다.  msi로 설치한 경우 자동으로 path가 설정됩니다.

 

 

설정이 완료되었고 [Next] 버튼을 클릭해서 설치를 진행합니다.

 

 

좀 시간이 걸리는데 잠시 기다리면

 

 

설치가 완료 되었습니다.  [Finish] 버튼을 클릭 합니다.

 

 

설치 확인을 위해 설명서에 나와있는 대로 명령 프롬프트를 하나 열고 버전을 체크 합니다.

 

 

D:\go>go version
go version go1.21.0 windows/amd64
 

 

 

잘 설치가 완료 되었습니다.

 

환경설정도 확인해 봅니다.

 

> go env

> go env

 

 

GOPATH가 작업용 폴더인데 저는 D:\go라는 폴더를 새로 생성을 하고 설정을 변경해 보도록 하겠습니다.

  

윈도우 > 설정 > 시스템 > 고급 시스템 설정(우측)에서 환경 변수를 변경하면 됩니다.

 

 

GOPATH가 보이는 군요.  [편집]을 클릭해서

 

 

기존 정보를 지우고 새로 생성한 폴더로 수정 하고 [확인] 버튼으로 저장 합니다.

그리고 다시 go env 명령어를 이용하여 확인하면

GOPATH=D:\go

이렇게 변경이 됩니다.

 

예제 프로그램을 하나 생성해서 제대로 컴파일이 되는지 확인을 해 봅니다.

텍스트 편집이 가능한 프로그램으로 작성하면 됩니다.

저는 일단 메모장으로 생성을 해보았습니다. VB Code를 사용하면 편할 듯합니다.

 

package main
 
import "fmt"
 
func main() {
    fmt.Println("Hello, world!")
}

 

이렇게 코딩하고 Hello.go 라는 파일명과 확장자로 저장을 합니다.

 

컴파일은 build를 사용합니다.

 

>go build hello.go

 

컴파일이 끝나면 실행을 합니다.

 

>hello

 

 

잘 실행이 되었습니다.

폴더에 가보면 컴파일이 오류없이 완료된 경우 exe 실행파일이 생성됩니다.

 

 

실행파일을 생성하지 않고 결과만 확인하려면 run을 이용합니다.

 

>go run hello.go

 

 

이렇게 하면 exe 파일이 현재의 폴더에 생성되지는 않는데 임의의 폴더에 생성은 합니다.

 

여기까지 간단히 go lang 설치를 해보았습니다.

 

- copy coding -

'GoLang' 카테고리의 다른 글

Golang (Go 언어) 편집기 VSCode와 자동완성 Extension 설치  (0) 2023.09.24

 

로컬 컴퓨터에서 python을 이용한 개발을 하려면 대부분 아나콘다(Anaconda)를 설치하고 필요한 라이브러리를 또 설치하고 설정 값이 틀려서 지우고 다시 설치하는 반복작업들이 귀찮았는데 로컬 컴퓨터가 아닌 인터넷상에서 기본적인 라이브러리는 설치가 되어있고 필요한 라이브러리도 쉽게 설치해 사용할 수 있는 colab이 있다는건 알았지만 눈팅만 하다가 한번 사용을 해보았습니다.

너무 종속된다는 느낌이 들지만 초보자들에게는 쉽게 접근 가능하고 코딩에만 집중할 수 있어서 좋을것 같습니다.

 

간단한 사용방법을 알아보도록 하겠습니다.

colabgoogle에서 인터넷으로 제공되는 것으로 구글드라이브가 있어야 사용 가능합니다.

이 말은 구글에 계정이 있어야 한다는 뜻이고 크롬에서 구글에 로그인을 한 후 google drive를 검색합니다.

 

 

검색된 결과중 [Google Drive] 을 찾아 클릭하면 로그인이 된 상태인 경우 바로 드라이브 페이지로 이동 합니다.

 

또는 로그인 상태라면 우측 상단 더보기 아이콘을 클릭하여

 

 

 

[드라이브] 아이콘을 클릭 합니다.

 

 

 

colab을 설치하지 않았기 때문에 우측에 아무것도 보이지 않습니다.

colab을 설치하기 위해 좌측 상단에 있는 [새로 만들기]를 클릭 합니다.

 

 

 

여기에도 colab 관련 메뉴가 없다는건 아직 한번도 사용해보지 않았다는것입니다.

팝업 메뉴에서 하단의 [더보기]를 클릭하고 여기에서 colab이 보이지 않는다면 다시 [연결할 앱 더보기]를 클릭 합니다.

 

 

 

팝업 창에서 [Colaboratory]를 찾아 선택해 줍니다.

이 팝업은 colabGoogle Drive에 설치해서 메뉴에 추가하는 작업을 진행하는 독립된 팝업 창 입니다.

 

 

 

간단한 설명 페이지로 넘어가는데 우측 상단 파란색 [설치] 버튼을 클릭하면 구글 드라이브에 설치가 됩니다.

 

 

 

[계속]을 클릭해서 설치를 진행 합니다.

 

 

 

설치할 계정을 선택 합니다.

지금 로그인한 계정이 아닌 다른 계정에 설치하려면 [다른 계정 사용]을 클릭해서 설치할 계정을 선택하면 됩니다.

 

 

 

선택한 구글 계정의 Google Drive에 연결을 하기위해 [확인] 버튼을 클릭하고 [완료] 버튼을 클릭해 줍니다.

 

 

 

설치가 완료 되었으니 팝업 창은 우측 [닫기] 버튼을 이용하여 닫아주고 Google Drive를 새로고침하고 메뉴를 다시 시작해 봅니다.

 

 

[새로 만들기]  >  [더보기]  >  [Google Colaboratory]

 

 

이제 메뉴에 colab이 설치 되었네요. [Google Colaboratory]를 클릭하면

잠시후 생성이 완료되고 화면이 전환 됩니다.

 

 

 

주피터 노트북(Jupyter Notebook)과 비슷한 형태의 창이 나옵니다.

사용법도 메뉴가 조금 다를뿐 비슷합니다.

현재 아무것도 설치하지 않았지만 기본적으로 python이 설치되어 있으니 간단히 출력문을 실행해 봅니다.

 

 

 

[+코드]를 클릭 한 후 print(“test”)를 입력하고 검은원 화살표 이미지를 클릭합니다.

잘 되는군요. 

 

 

 

작업을 저장하고 나면 다음부터는 구글 드라이브에 저장된 작업이 나타납니다.

시간 날때마다 오랜만에 python을 공부해 봐야겠습니다.

 

- copy coding -

 

지난번에 Android에서 OpenCV를 사용하기 위한 SDK 추가작업을 진행 했었는데 실제로 사용법을 익혀 보도록 하겠습니다.

Canny 함수를 이용해서 외각선 검출을 진행하게 되며 결과는 아래와 같습니다.

 

 

대부분 이미지 작업을 하게되기 때문에 OpenCV에서 카메라 제어를 할 수 있도록 작업을 하면 나머지는 간단하게 함수 호출만 해주면 되는데 카메라에서 이미지를 받아오는 설정 부분이 버전마다 조금씩 달라서 Canny() 프로그램 함수는 한줄이면 되는데 환경 설정하는 부분에 시간이 많이 소요 될 가능성도 있습니다.

 

먼저 카메라를 사용 할 수 있도록 권한을 추가합니다.

 

AndroidManifest.xml 

<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" />

  

 

Activity_main.xml은 내용을 전부 삭제하고 OpenCV 카메라 VIew를 추가해 줍니다. 

<?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"
           
android:visibility="gone"
           
android:id="@+id/frame_Surface"
           
opencv:show_fps="true"
           
opencv:camera_id="any">

        </
org.opencv.android.JavaCameraView>
</
LinearLayout>

 

 

 

MainActivity.java에 카메라 제어 관련 소스를 추가해 줍니다.

 

Global 변수를 만들어주고 카메라로 부터 Callback을 받아 처리하면 되는 간단한 내용인데 여기서 버전마다 조금씩 다르게 작동을 해서 몇가지 추가적인 작업이 필요할 수도 있습니다.

 

먼저 변수와 callback을 선언 합니다.

private Mat mRgba;
private CameraBridgeViewBase mOpenCvCameraView;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
   
@Override
   
public void onManagerConnected(int status) {
       
switch (status) {
           
case LoaderCallbackInterface.SUCCESS: {
                Log.d(
Tag_Log, "OpenCv loaded");
               
mOpenCvCameraView.enableView();
            }
           
break;
           
default:{
               
super.onManagerConnected(status);
            }
           
break;
        }
    }
};

 

 

onCreate()에는 화면구성시 idframe_Surface로 추가한 JavaCameraView를 설정 합니다.

 

mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.frame_Surface);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
mOpenCvCameraView.setCameraIndex(0);

  

ActivityCvCameraViewListener2를 상속해주고 이와 관련된 OpenCV 카메라 관련 메소드 3개를 Override로 추가합니다.

 

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


    }

   
@Override
   
public void onCameraViewStopped() {
    }

   
@Override
   
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
       
mRgba = inputFrame.rgba();

       
return mRgba;
    }

 

 

그리고 onCameraFrame()에서 받아온 이미지를 리턴 하면 핸드폰 화면에 이미지가 나오는데 그렇지 않은 경우 아래와 같은 기능을 추가해 줍니다.

 

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

 

 

최신 SDK중 이렇게 getCameraViewList()Override 할 수 있도록 되는 SDK 버전이 있습니다.

 

만약 getCameraViewList()Override로 지원 안되는 SDK 버전이라면

 

Permission에서 함수를 호출 하도록 해야 합니다.

 

@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{
           
       
}
       
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

 

  

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

 

 

여기까지 왔으면

 

 

 

 

 

이런식으로 화면이 나와야 합니다.

 

 

그럼 Canny 함수 하나를 추가해서 테스트를 진행해 봅니다.

 

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
   
mRgba = inputFrame.rgba();

   
if(mRgba == null) {
        Log.d(
Tag_Log, "onCameraFrame error");

    }
   
Mat edges = new Mat();
    Imgproc.Canny(mRgba, edges, 80,200);


   
return edges;
}

 

  

카메라로 가져온 이미지를 OpenCV Canny()함수에 추가해서 작업하는 방법입니다.

python으로도 간단하게 함수만 호출하면 테스트 할 수 있는것과 같이 android java에서도 함수만 호출하면 됩니다.

 

 

이미지가 90도 회전되어 보이는 부분은 AndroidManifest.xml에 설정을 추가하면 되고

MainActivity.java에는 onStart(), onDestroy() 등을 추가해줍니다.

그러면 처음에 보았던 이미지를 확인할 수 있습니다.

 

AndroidManifest.xml 전체 소스 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   
package="copycoding.tistory.opencvlib">

    <
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" />

    <
application
       
android:allowBackup="true"
       
android:icon="@mipmap/ic_launcher"
       
android:label="@string/app_name"
       
android:roundIcon="@mipmap/ic_launcher_round"
       
android:supportsRtl="true"
       
android:theme="@style/Theme.OpencvLib">
        <
activity android:name=".MainActivity"
           
android:screenOrientation="landscape"
           
android:configChanges="keyboardHidden|orientation">
            <
intent-filter>
                <
action android:name="android.intent.action.MAIN" />

                <
category android:name="android.intent.category.LAUNCHER" />
            </
intent-filter>
        </
activity>
    </
application>

</
manifest>

 

 

 

MainActivity.java 전체 소스입니다. 

package copycoding.tistory.opencvlib;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.annotation.TargetApi;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceView;
import android.view.Window;
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.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

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

import static android.Manifest.permission.CAMERA;

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {

   
private static String Tag_Log = "OpenCV Test : ---------------------";
   
private static final int CAMERA_PERMISSION_REQUEST_CODE = 200;

   
private Mat mRgba;
   
private Mat mGrey;
   
private CameraBridgeViewBase mOpenCvCameraView;
   
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
       
@Override
       
public void onManagerConnected(int status) {
           
switch (status) {
               
case LoaderCallbackInterface.SUCCESS: {
                    Log.d(
Tag_Log, "OpenCv loaded");
                   
mOpenCvCameraView.enableView();
                }
               
break;
               
default:{
                   
super.onManagerConnected(status);
                }
                
break;
            }
        }
    };


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

        requestWindowFeature(Window.
FEATURE_NO_TITLE);
        getSupportActionBar().hide();

       
setContentView(R.layout.activity_main);

       
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.frame_Surface);
       
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
       
mOpenCvCameraView.setCvCameraViewListener(this);
       
mOpenCvCameraView.setCameraIndex(0);


   
}

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

   
}

   
@Override
   
public void onCameraViewStopped() {
    }

   
@Override
   
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
       
mRgba = inputFrame.rgba();
        if(mRgba == null) {
            Log.d(
Tag_Log, "onCameraFrame error");

        }
        Mat edges = new Mat();
        Imgproc.Canny(mRgba, edges, 80,200);


        
return edges;
    }

   
@Override
   
protected void onResume() {
       
super.onResume();
       
if(OpenCVLoader.initDebug()) {
            Log.d(
Tag_Log, "Opencv initialized");
           
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
else {
            Log.d(
Tag_Log, "Opencv not loaded");
            OpenCVLoader.initAsync(OpenCVLoader.
OPENCV_VERSION, this, mLoaderCallback);
        }
    }

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

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

   
@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();
        }
    }

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

   
@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{
           
       
}
       
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }


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

}

 

 

  

이전에 올렸던 OpenCV SDK 설치관련 글을 읽으러 가지 않으려면 아래 gradle을 참고 하세요.

 

plugins {
   
id
'com.android.application'
}

android {
   
compileSdkVersion
29
   
buildToolsVersion "29.0.0"

   
defaultConfig {
       
applicationId
"copycoding.tistory.opencvlib"
       
minSdkVersion 26
       
targetSdkVersion 29
       
versionCode 1
       
versionName "1.0"

       
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
   
}

   
buildTypes {
       
release {
           
minifyEnabled
false
           
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
       
}
    }
   
compileOptions {
       
sourceCompatibility JavaVersion.
VERSION_1_8
       
targetCompatibility JavaVersion.VERSION_1_8
   
}
}

dependencies {

   
implementation
'androidx.appcompat:appcompat:1.3.1'
   
implementation 'com.google.android.material:material:1.4.0'
   
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
   
implementation project(path: ':OpenCV')
    testImplementation
'junit:junit:4.+'
   
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
   
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

 

 

 - copy coding -


1···45678910···116

+ Recent posts