Recent Posts
Link
250x250
오늘보다 더 나은 내일의 나에게_
비전공자의 IoT 국비 교육 수강일지 Day_94 본문
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란
하나의 액티비티에 여러 개의 화면을 결합 하기 위해 고안된 기술
하나의 프래그 먼트를 여러 개의 액티비티에서 재사용
자체적인 생명주기를 가지며 "하위 액티비티" 와같은 개념
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
'비전공자의 코딩일지' 카테고리의 다른 글
비전공자의 IoT 국비 교육 수강일지 Day_93 (0) | 2022.04.29 |
---|---|
비전공자의 IoT 국비 교육 수강일지 Day_92 (0) | 2022.04.28 |
비전공자의 IoT 국비 교육 수강일지 Day_91 (0) | 2022.04.27 |
비전공자의 IoT 국비 교육 수강일지 Day_90 (0) | 2022.04.26 |
비전공자의 IoT 국비 교육 수강일지 Day_89 (0) | 2022.04.25 |
Comments