오늘보다 더 나은 내일의 나에게_

비전공자의 IoT 국비 교육 수강일지 Day_94 본문

비전공자의 코딩일지

비전공자의 IoT 국비 교육 수강일지 Day_94

chan_96 2022. 4. 30. 16:45
728x90

머신러닝

마스크 착용여부 분류모델 활용하기

코드
import tensorflow as tf
import cv2
from tensorflow.keras.models import load_model

mask_model = load_model("./mask_detect_model2.h5")

# 얼굴검출 모델 사용하기
face_model = cv2.CascadeClassifier(cv2.data.haarcascades+"haarcascade_frontalface_default.xml")

#반복문 이용해서 영상 출력하기
try : 
    print("영상로딩을 시작합니다..")
    video_cap = cv2.VideoCapture("./03.mp4")
    #video_cap = cv2.VideoCapture(0) 0으로 작성시 컴퓨터와 연결된 카메라 연동
    
    while True:
        ret,frame = video_cap.read()
        
        if ret :
            # 얼굴검출 코드 추가
            faces = face_model.detectMultiScale(frame, 1.2,8)
            for(x,y,w,h) in faces:
                roi = frame[y:y+h,x:x+w]
                # BGR -> RGB
                roi_RGB = cv2.cvtColor(roi,cv2.COLOR_BGR2RGB)
                # resize
                roi_resize = cv2.resize(roi_RGB,dsize=(224,224),
                                       interpolation=cv2.INTER_AREA)
                # -1 ~ 1
                roi_normal = (np.array(roi_resize,dtype=np.float32)/127.0) - 1
                # predict
                pre = mask_model.predict(roi_normal.reshape(1,224,224,3))
                #print(pre)
                if pre[0] >= 0.5:
                    cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),3)
                else:
                    cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),3)
                
            cv2.imshow("video",frame)
            k = cv2.waitKey(38) # 초당 프레임수를 맞추기 위함 : 1000/24
        else:
            break;
            
        if k == 27 : #27번은 ESC
            break;
            
    cv2.destroyAllWindows()
    video_cap.release()
except :
    print("영상로딩 실패")​

안드로이드

Fragment 개요

Fragment란

하나의 액티비티에 여러 개의 화면을 결합 하기 위해 고안된 기술

하나의 프래그 먼트를 여러 개의 액티비티에서 재사용

자체적인 생명주기를 가지며 "하위 액티비티" 와같은 개념

1

Fragment 특징

화면의 분할 및 재사용성

액티비티와 같이 레이아웃, 동작 처리, 생명주기를 가진 독립적인 모듈

액티비티 내 추가/삭제/제거

반드시 액티비티 위에 올라가 있어야 동작 가능

Fragment 실습

 


코드

더보기
MainActivity
package com.example.ex0430;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.MenuItem;

import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;

public class MainActivity extends AppCompatActivity {

    BottomNavigationView bottomNav;
    Fragment1 frag_home;
    Fragment2 frag_time;
    Fragment3 frag_option;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bottomNav = findViewById(R.id.bottmNav);

        frag_home = new Fragment1();
        frag_time = new Fragment2();
        frag_option = new Fragment3();

        //실행 시 처음에 보여줄 프래그먼트 화면 설정
        //replace(프래그먼트를 보여주는 레이아웃ID ,보여줄 프래그먼트객체)
        getSupportFragmentManager().beginTransaction().replace(R.id.container, frag_home).commit();

        //메뉴버튼 클릭 시 화면전환 기능구현
        bottomNav.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {

                //선택한 메뉴버튼에 대한 리소스ID 저장
                int itemId = item.getItemId();

                if(itemId == R.id.home){
                    getSupportFragmentManager().beginTransaction().replace(R.id.container, frag_home).commit();
                }else if(itemId == R.id.time){
                    getSupportFragmentManager().beginTransaction().replace(R.id.container, frag_time).commit();
                }else{
                    getSupportFragmentManager().beginTransaction().replace(R.id.container, frag_option).commit();
                }

                return false;
            }
        });


    }
}

 

Fragment1 코드
package com.example.ex0430;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class Fragment1 extends Fragment {

    WebView webView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_1, container, false);

        webView = view.findViewById(R.id.webView);

        //SharedPreferences에 저장된 데이터를 접근
        String url = getActivity()
                    .getSharedPreferences("mySPF", Context.MODE_PRIVATE)
                    .getString("url","https://www.smhrd.or.kr");

        //안드로이드에 설치되어있는 기본 브라우저를 실행
        // --> WebSettings객체를 이용해서 WebView에 바로 띄워지도록 설정
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);  //자바스크립트 사용허용

        webView.setWebViewClient(new WebViewClient());
        webView.loadUrl(url);


        return view;
    }//end onCreateView
}

Fragment3 코드
package com.example.ex0430;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Fragment3 extends Fragment {

    EditText edtUrl;
    Button btnSave;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_3, container, false);

        edtUrl = view.findViewById(R.id.edtUrl);
        btnSave = view.findViewById(R.id.btnSave);

        //SharedPreferences
        // : 앱의 데이터를 저장하기 위한 객체
        // : 간단한 데이터를 Key, Value형태로 저장 -> 안드로이드 내부에 XML파일로 저장
        //Context.MODE_PRIVATE
        // : 외부 앱에서 접근불가하도록 설정
        SharedPreferences spf = getActivity().getSharedPreferences("mySPF", Context.MODE_PRIVATE);

        SharedPreferences.Editor editor = spf.edit();

        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //사용자가 URL값을 입력하면 저장
                String url = edtUrl.getText().toString();

                //URL값을 mySDFl.xml 파일에 url값을 저장
                editor.putString("url",url);
                editor.commit();

                //getActivity() --> MainActivity
                Toast.makeText(getActivity(), "새로운 주소가 설정되었습니다!", Toast.LENGTH_SHORT).show();

            }
        });


        return view;
    }//end onCreateView
}​
728x90
Comments