월요일은 쉬었고 오늘 다시 해보자
일단 생각보다 앱에서 작업하는 양이 많고 처음보는 작업들이 많다...
https://webnautes.tistory.com/1590
- 안드로이드
일단 안드로이드 xml에 인터넷 사용 권한을 추가해줬고
themes.xml 에 타이틀바를 보이지 않게 하는 코드를 추가했다.
간단한 작업이여서 따로 스샷은 안찍었음
그리고 아래로 내려보면 recyclerview 를 사용하는데 이게 뭔지좀 살펴봤다.
https://developer.android.com/guide/topics/ui/layout/recyclerview?hl=ko#plan-your-layout
동적 목록이라고 하는데
나는 일단 반환할 값이 1개이고
최종적으로 만드려는것이 이미지 파일 반환이기 때문에
그냥 텍스트뷰로 일단 해보자
그리고 빌드그래들 파일에 okhttp3 관련을 추가해줬고
그다음에 PersnalData.java 와 UserAdapter.java 파일이 나와있는데
이 파일들중에서 PersnalData.java 가 왜 필요한지 모르겠다.
그냥 넣어주면 안되는건가?
UserAdapter.java 파일은 ArrayList에 있는 PersnalData 타입의 데이터를 recyclerview 에 보여주는 작업을 한다고 하는데
나는 그냥 텍스트뷰 쓸꺼니까 얘는 필요 없을것 같고
mainactivity.java 파일이 좀 많이 복잡한데
일단 오브젝트들을 다 찾아줬고
내용중에 task.execute() 형식을 처음봐서 한번 알아봤다.
https://itmining.tistory.com/7
봐도 뭔소린지 잘 모르겠다.
뭔가 단일 스레드 실행에 있어서 효과적인 부분인가?
느낌은 오는데 정확히 뭐다라고는 잘 모르겠음
어쨌든
나는 결과 보기를 누르면
한 함수 안에서 전송api 한번 실행하고 수신api 한번 실행하는 거니까
음... 함수 안에 다른 함수를 넣는 식으로 구현해보자
일단 필요한 부분들을 가져오는데 첫번째 문제가 발생
okhttp3 가 추가가 안됨
찾아보니 라이브러리 추가를 해줘야 하는것 같다
블로그 따라서 라이브러리를 추가해줬다.
쭉 코드를 적용시키다가 발생한 두번째 문제
PersonalData 를 여기서 쓰나본데
왜 쓰는지 모르겠는데...
일단 대충 만들어봤다.
그리고 앱을 빌드하려는데 세번재 문제 발생
뭔소린지 모르겠다
찾아보니까 리소스파일이 없어서 생기는 오류라는데??
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=phj99&logNo=222134048594
뭐 들어가는게 없는데...?
다시 빌드하니깐 된다?
ㅋㅋ
대충 값을 넣고 돌리면?
에러라는데
일단 로그를 보니까 데이터를 넣는건 성공한거같은데
불러오는데 실패한것 같다
ㅇㅇ GetData 에서 문제가 발생했다.
write data success 는 확인했고 dynamoDB에도 잘 기록되는걸 확인했다.
getdata 람다 함수에 이전에 테스트할때 입력했던 키가 잘못 입력되어있어서
dynamoDB 테이블을 새로 만들고 이어줬다.
다시한번 해보자
왜 안돼냐 ㅅㅂ
일단 입력은 확실히 잘 된다.
이러고 코드를 수정하면서 몇번 더 해봤는데
갑자기 되버림 ㅇㅅㅇ...
근데 결과 textview 에 저렇게 함수 결과값이 나오게 되는데
일단 저 창을 키워봤다
데이터삭제까지 깔끔하게 되는 모습!
- 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([[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)
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[0, 0] = 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, 10, 1.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[0, 0] = 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 함수에서 도트그림이 만들어지는데
어떤 원리인지 차근차근 한번 보자
일단 np array 의 2차원 배열을 2개를 만들어 주는데
생김새가 3*3 에
하나는 꽉 차있고 하나는 모서리부분은 0으로 되어있는데 이게 밑에서
외곽선에 쓰인다. 아마 0으로 되있는 부분만 외각선으로 처리하는게 아닐까 싶음
이 부분에서 쓰이는데
일단 cv2.erode() 랑 cv2.bilateralFilter() 가 무슨 역할을 하는지 알아보자
erode 는 기존 객체의 영역을 깎아 내는 연산으로 객체 크기가 감소하는 함수라고 한다.
https://deep-learning-study.tistory.com/226
그런데 모서리가 0인 2차원배열은 찾기가 힘들다
찾음
http://www.gisdeveloper.co.kr/?p=6529
모폴로지에 대해서 여러 함수기능들을 정리해주신 블로그이다.
경우에 따라 사각형, 십자, 원형 배열을 사용한다고 한다.
그리고 bilateral filter 는 opencv 의 필터중 하나라고 하는데
https://eehoeskrap.tistory.com/125
이미지를 부드럽게 해주는 효과라고 한다
이 글을 화요일날 쓰기 시작해서 지금 벌써 금요일이다...
좀 설렁설렁 하기도 했고
잘 안되는걸 계속 찾아가면서 하기도 해서 오래걸렸다...
시험공부 하면서 다시 좀 열씸히 만들어 보자
일주일간 저거 하나했네 ㅋㅋㅠㅠ
'Archive > [App] 도트감성:pixel painter' 카테고리의 다른 글
[3주-1일차] NFT maker APP - dynamoDB 이미지 파일 저장+불러오기 (0) | 2022.05.08 |
---|---|
[3주-0일차] NFT maker APP - 3주차 스프린트 계획 수립 (0) | 2022.05.07 |
[2주-1일차] NFT maker APP - 안드로이드 to AWS파이썬api서버 연동2 (0) | 2022.05.01 |
[2주-0일차] NFT maker APP - 2주차 스프린트 계획 수립 (0) | 2022.04.30 |
[1주-5일차] NFT maker APP - 안드로이드 to AWS파이썬api서버 연동 (0) | 2022.04.30 |