공부하기싫어
article thumbnail

월요일은 쉬었고 오늘 다시 해보자

 

일단 생각보다 앱에서 작업하는 양이 많고 처음보는 작업들이 많다...

 

 

https://webnautes.tistory.com/1590

 

AWS Rest API를 Android와 연동해보기( Lambda + API Gateway + DynamoDB )

AWS의 Lambda + API Gateway + DynamoDB를 사용하여 구현한 Rest API를 안드로이드 앱과 연동해본 예제입니다. 익숙하지 않은 분야라 이상한 점이 있을 수 있습니다. 2021. 11. 29 - 최초작성 본 포스트는 다음처

webnautes.tistory.com

 

  • 안드로이드

일단 안드로이드 xml에 인터넷 사용 권한을 추가해줬고

themes.xml 에 타이틀바를 보이지 않게 하는 코드를 추가했다.

간단한 작업이여서 따로 스샷은 안찍었음

 

그리고 아래로 내려보면 recyclerview 를 사용하는데 이게 뭔지좀 살펴봤다.

https://developer.android.com/guide/topics/ui/layout/recyclerview?hl=ko#plan-your-layout 

 

RecyclerView로 동적 목록 만들기  |  Android 개발자  |  Android Developers

RecyclerView로 동적 목록 만들기   Android Jetpack의 구성요소 RecyclerView를 사용하면 대량의 데이터 세트를 효율적으로 표시할 수 있습니다. 개발자가 데이터를 제공하고 각 항목의 모양을 정의하면 R

developer.android.com

동적 목록이라고 하는데

나는 일단 반환할 값이 1개이고

최종적으로 만드려는것이 이미지 파일 반환이기 때문에

그냥 텍스트뷰로 일단 해보자

 

 

 

그리고 빌드그래들 파일에 okhttp3 관련을 추가해줬고

 

그다음에 PersnalData.java 와 UserAdapter.java 파일이 나와있는데

이 파일들중에서 PersnalData.java 가 왜 필요한지 모르겠다.

그냥 넣어주면 안되는건가?

UserAdapter.java 파일은 ArrayList에 있는 PersnalData 타입의 데이터를 recyclerview 에 보여주는 작업을 한다고 하는데

나는 그냥 텍스트뷰 쓸꺼니까 얘는 필요 없을것 같고

 

 

mainactivity.java 파일이 좀 많이 복잡한데

버튼 찾기

일단 오브젝트들을 다 찾아줬고

 

내용중에 task.execute() 형식을 처음봐서 한번 알아봤다.

https://itmining.tistory.com/7

 

[안드로이드] AsyncTask란? (개념 및 사용법)

이 글은 PC 버전 TISTORY에 최적화 되어있습니다. 서론 안드로이드에서 UI를 조작할 수 있는 방법에 대해서 두 가지를 배웠습니다.  Handler와 Looper 사용하기  runOnUiThread( ) 사용하기  두 가지 사용법

itmining.tistory.com

봐도 뭔소린지 잘 모르겠다.

뭔가 단일 스레드 실행에 있어서 효과적인 부분인가?

느낌은 오는데 정확히 뭐다라고는 잘 모르겠음

어쨌든

 

나는 결과 보기를 누르면

한 함수 안에서 전송api 한번 실행하고 수신api 한번 실행하는 거니까

 

음... 함수 안에 다른 함수를 넣는 식으로 구현해보자

 

 

 

일단 필요한 부분들을 가져오는데 첫번째 문제가 발생

okhttp3

okhttp3 가 추가가 안됨

 

https://velog.io/@jinny_0422/Android-Okhttp3-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%86%B5%EC%8B%A0-%ED%95%98%EA%B8%B0

 

[Android] Okhttp3 사용하여 네트워크 통신 하기

OkHttp는 기본적으로 효율적인 HTTP 클라이언트이다. 쉽게 HTTP 기반의 request/response를 할 수 있도록 도와주는 오픈소스 라이브러리이다. 동기, 비동기 방식을 각각 제공하여 개발자가 선택하여 개발

velog.io

찾아보니 라이브러리 추가를 해줘야 하는것 같다

블로그 따라서 라이브러리를 추가해줬다.

 

쭉 코드를 적용시키다가 발생한 두번째 문제

personaldata

PersonalData 를 여기서 쓰나본데

왜 쓰는지 모르겠는데...

 

일단 대충 만들어봤다.

 

그리고 앱을 빌드하려는데 세번재 문제 발생

????

뭔소린지 모르겠다

 

????

찾아보니까 리소스파일이 없어서 생기는 오류라는데??

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=phj99&logNo=222134048594 

 

Execution failed for task ':app:mergeDebugResources' 에러 해결

안드로이드 스튜디오를 빌드 했을 때, Execution failed for task ':app:mergeDebugResources'...

blog.naver.com

뭐 들어가는게 없는데...?

 

다시 빌드하니깐 된다?

 

ㅋㅋ

 

 

launch secceeded

대충 값을 넣고 돌리면?

 

error

에러라는데

일단 로그를 보니까 데이터를 넣는건 성공한거같은데

불러오는데 실패한것 같다

 

로그

ㅇㅇ GetData 에서 문제가 발생했다.

 

log

write data success 는 확인했고 dynamoDB에도 잘 기록되는걸 확인했다.

 

getdata 람다 함수에 이전에 테스트할때 입력했던 키가 잘못 입력되어있어서

dynamoDB 테이블을 새로 만들고 이어줬다.

 

다시한번 해보자

 

send to py server
error again

왜 안돼냐 ㅅㅂ

 

db

일단 입력은 확실히 잘 된다.

 

이러고 코드를 수정하면서 몇번 더 해봤는데

???

갑자기 되버림 ㅇㅅㅇ...

 

근데 결과 textview 에 저렇게 함수 결과값이 나오게 되는데

일단 저 창을 키워봤다

 

체크1
연속실행
데이터 삭제

데이터삭제까지 깔끔하게 되는 모습!

 

  • pixel.py 코드 분석
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# coding:utf-8
import sys
import cv2
from PIL import Image
import numpy as np
 
n8 = np.array([[111],
               [111],
               [111]],
              np.uint8)
 
n4 = np.array([[010],
               [111],
               [010]],
              np.uint8)
 
 
def make_dot(src, k=3, scale=2, color=True, blur=0, erode=0, alpha=True, to_tw=True):
    img_pl = Image.open(src)
 
    if (img_pl.mode == 'RGBA' or img_pl.mode == 'P'and alpha:
        if img_pl.mode != 'RGBA':
            img_pl = img_pl.convert('RGBA')
        alpha_mode = True
    elif img_pl.mode != 'RGB' and img_pl.mode != 'L':
        img_pl = img_pl.convert('RGB')
        alpha_mode = False
    else:
        alpha_mode = False
 
    img = np.asarray(img_pl)
    if color and alpha_mode:
        a = img[:, :, 3]
        img = cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)
        h, w, c = img.shape
    elif color:
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        h, w, c = img.shape
    else:
        img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
        h, w = img.shape
        c = 0
 
    d_h = int(h / scale)
    d_w = int(w / scale)
    if erode == 1:
        img = cv2.erode(img, n4, iterations=1)
    elif erode == 2:
        img = cv2.erode(img, n8, iterations=1)
    if blur:
        img = cv2.bilateralFilter(img, 15, blur, 20)
 
    img = cv2.resize(img, (d_w, d_h), interpolation=cv2.INTER_NEAREST)
    if alpha_mode:
        a = cv2.resize(a, (d_w, d_h), interpolation=cv2.INTER_NEAREST)
        a = cv2.resize(a, (d_w * scale, d_h * scale), interpolation=cv2.INTER_NEAREST)
        a[a != 0= 255
        if not 0 in a:
            a[00= 0
    if color:
        img_cp = img.reshape(-1, c)
    else:
        img_cp = img.reshape(-1)
 
    img_cp = img_cp.astype(np.float32)
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 101.0)
    ret, label, center = cv2.kmeans(img_cp, k, None, criteria, 10, cv2.KMEANS_PP_CENTERS)
    center = center.astype(np.uint8)
    result = center[label.flatten()]
    result = result.reshape((img.shape))
    result = cv2.resize(result, (d_w * scale, d_h * scale), interpolation=cv2.INTER_NEAREST)
 
    if alpha_mode:
        r, g, b = cv2.split(result)
        result = cv2.merge((r, g, b, a))
    elif to_tw:
        r, g, b = cv2.split(result)
        a = np.ones(r.shape, dtype=np.uint8) * 255
        a[00= 0
        result = cv2.merge((r, g, b, a))
        
    colors = []
    for res_c in center:
        color_code = '#{0:02x}{1:02x}{2:02x}'.format(res_c[2], res_c[1], res_c[0])
        colors.append(color_code)
    return result, colors
 
cs

이 코드의 make_dot 함수에서 도트그림이 만들어지는데

어떤 원리인지 차근차근 한번 보자

 

n8 = np.array([[1, 1, 1],
               [1, 1, 1],
               [1, 1, 1]],
              np.uint8)

n4 = np.array([[0, 1, 0],
               [1, 1, 1],
               [0, 1, 0]],
              np.uint8)

일단 np array 의 2차원 배열을 2개를 만들어 주는데

생김새가 3*3 에

하나는 꽉 차있고 하나는 모서리부분은 0으로 되어있는데 이게 밑에서

외곽선에 쓰인다. 아마 0으로 되있는 부분만 외각선으로 처리하는게 아닐까 싶음

 

if erode == 1:
        img = cv2.erode(img, n4, iterations=1)
    elif erode == 2:
        img = cv2.erode(img, n8, iterations=1)
    if blur:
        img = cv2.bilateralFilter(img, 15, blur, 20)

이 부분에서 쓰이는데

일단 cv2.erode() 랑 cv2.bilateralFilter() 가 무슨 역할을 하는지 알아보자

 

erode 는 기존 객체의 영역을 깎아 내는 연산으로 객체 크기가 감소하는 함수라고 한다.

https://deep-learning-study.tistory.com/226

 

[파이썬 OpenCV] 영상의 모폴로지 - 침식과 팽창 - cv2.erode, cv2.dilate, cv2.getStructuringElement

황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다. 예제 코드 출처 :  황선규 박사님 github홈페이지 『OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝』

deep-learning-study.tistory.com

 

그런데 모서리가 0인 2차원배열은 찾기가 힘들다

찾음

http://www.gisdeveloper.co.kr/?p=6529 

 

Python과 OpenCV – 12 : Morphological Transformations – GIS Developer

이 글의 원문은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html#morphological-ops 입니다. Morphological Transformations, 즉 형태변환은 흑과 백으로 구성된

www.gisdeveloper.co.kr

 

모폴로지에 대해서 여러 함수기능들을 정리해주신 블로그이다.

경우에 따라 사각형, 십자, 원형 배열을 사용한다고 한다.

 

그리고 bilateral filter 는 opencv 의 필터중 하나라고 하는데

https://eehoeskrap.tistory.com/125

 

[OpenCV] Bilateral Filter 적용하기

Bilateral Filter OpenCV에서 대표적인 필터로는 blur, GaussianBlur, medianBlur 그리고 BilateralFilter 가 있다. 이 필터는 선형으로 처리되지 않고, 엣지와 노이즈를 줄여주어 부드러운 영상이 만들어지게 된..

eehoeskrap.tistory.com

이미지를 부드럽게 해주는 효과라고 한다

 

 

 

 

 

이 글을 화요일날 쓰기 시작해서 지금 벌써 금요일이다...

 

좀 설렁설렁 하기도 했고

잘 안되는걸 계속 찾아가면서 하기도 해서 오래걸렸다...

 

시험공부 하면서 다시 좀 열씸히 만들어 보자

 

일주일간 저거 하나했네 ㅋㅋㅠㅠ