Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -5,200 +5,220 @@ from PIL import Image
|
|
5 |
import io
|
6 |
from collections import defaultdict
|
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 |
-
"irritacao_estresse": {
|
69 |
-
"Doenças Psiquiátricas": {
|
70 |
-
"Ansiedade Generalizada": {
|
71 |
-
"prob": 0.85,
|
72 |
-
"sinais_adicionais": ["anéis nervosos", "manchas adrenal"],
|
73 |
-
"exames": ["Cortisol", "ACTH", "Neurotransmissores"],
|
74 |
-
"tratamentos": ["Ansiolíticos", "Psicoterapia", "Meditação"]
|
75 |
-
},
|
76 |
-
"Depressão": {
|
77 |
-
"prob": 0.80,
|
78 |
-
"sinais_adicionais": ["manchas escuras", "anéis profundos"],
|
79 |
-
"exames": ["Serotonina", "Cortisol", "BDNF"],
|
80 |
-
"tratamentos": ["Antidepressivos", "Psicoterapia", "Exercícios"]
|
81 |
-
}
|
82 |
-
}
|
83 |
}
|
84 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
"
|
97 |
-
"
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
107 |
]
|
108 |
}
|
109 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
110 |
|
111 |
-
def
|
112 |
"""
|
113 |
-
|
114 |
"""
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
#
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
if 'deficiência/hipofunção' in linha:
|
145 |
-
sinais_atuais.add('deficiencia_hipofuncao')
|
146 |
-
if 'atrofia/degeneração' in linha:
|
147 |
-
sinais_atuais.add('atrofia_degeneracao')
|
148 |
-
if 'irritação/estresse' in linha:
|
149 |
-
sinais_atuais.add('irritacao_estresse')
|
150 |
-
|
151 |
-
return dict(resultados)
|
152 |
|
153 |
def criar_interface():
|
154 |
"""
|
155 |
-
Cria
|
156 |
"""
|
157 |
-
def analisar(texto_analise):
|
158 |
-
resultados = analisar_doencas(texto_analise)
|
159 |
-
|
160 |
-
# Gerar relatório estruturado
|
161 |
-
saida = "ANÁLISE DETALHADA DE DOENÇAS POR IRIDOLOGIA\n\n"
|
162 |
-
|
163 |
-
# Agrupar por sistemas
|
164 |
-
sistemas = {
|
165 |
-
"Sistema Nervoso": ["Cerebro", "Sistema Nervoso"],
|
166 |
-
"Sistema Digestivo": ["Estomago", "Figado", "Vesicula", "Pancreas",
|
167 |
-
"Sistema Digestivo", "Intestino Grosso", "Intestino Delgado"],
|
168 |
-
"Sistema Circulatório": ["Coracao"],
|
169 |
-
"Sistema Respiratório": ["Pulmao", "Bronquios"],
|
170 |
-
"Sistema Endócrino": ["Tireoide"],
|
171 |
-
"Sistema Urinário": ["Rim Direito", "Rim Esquerdo", "Bexiga"]
|
172 |
-
}
|
173 |
-
|
174 |
-
for sistema, orgaos in sistemas.items():
|
175 |
-
saida += f"\n{sistema.upper()}\n{'='*len(sistema)}\n"
|
176 |
-
|
177 |
-
doenças_sistema = []
|
178 |
-
for orgao in orgaos:
|
179 |
-
if orgao in resultados:
|
180 |
-
for resultado in resultados[orgao]:
|
181 |
-
doenças_sistema.append({
|
182 |
-
'orgao': orgao,
|
183 |
-
**resultado
|
184 |
-
})
|
185 |
-
|
186 |
-
if doenças_sistema:
|
187 |
-
# Ordenar por probabilidade
|
188 |
-
doenças_sistema.sort(key=lambda x: x['probabilidade'], reverse=True)
|
189 |
-
|
190 |
-
for doença in doenças_sistema:
|
191 |
-
prob_percent = doença['probabilidade'] * 100
|
192 |
-
saida += f"\n• {doença['doença']} ({doença['categoria']})\n"
|
193 |
-
saida += f" Órgão: {doença['orgao']}\n"
|
194 |
-
saida += f" Probabilidade: {prob_percent:.1f}%\n"
|
195 |
-
saida += f" Exames Recomendados: {', '.join(doença['exames'])}\n"
|
196 |
-
saida += f" Tratamentos Sugeridos: {', '.join(doença['tratamentos'])}\n"
|
197 |
-
else:
|
198 |
-
saida += " Sem alterações significativas\n"
|
199 |
-
|
200 |
-
return saida
|
201 |
-
|
202 |
# Tema personalizado verde piscina
|
203 |
theme = gr.themes.Soft(
|
204 |
primary_hue="teal",
|
@@ -210,68 +230,63 @@ def criar_interface():
|
|
210 |
input_background_fill="#E9F5F3",
|
211 |
button_primary_background_fill="#2A9D8F",
|
212 |
button_primary_background_fill_dark="#264653",
|
213 |
-
button_primary_text_color="#FFFFFF",
|
214 |
-
button_primary_text_color_dark="#FFFFFF",
|
215 |
)
|
216 |
-
|
217 |
-
# Interface
|
218 |
-
with gr.Blocks(theme=theme, title="Análise
|
219 |
gr.Markdown("""
|
220 |
-
# Sistema Avançado de Análise
|
221 |
-
### Análise
|
222 |
""")
|
223 |
|
224 |
with gr.Tabs():
|
225 |
-
# Aba de Análise
|
226 |
-
with gr.Tab("Análise de
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
233 |
output_text = gr.Textbox(
|
234 |
-
label="
|
235 |
-
lines=
|
236 |
)
|
237 |
|
238 |
analysis_btn.click(
|
239 |
-
fn=
|
240 |
-
inputs=[
|
241 |
-
outputs=[output_text]
|
242 |
)
|
243 |
|
244 |
-
# Aba de
|
245 |
with gr.Tab("Guia de Interpretação"):
|
246 |
gr.Markdown("""
|
247 |
-
## Interpretação dos
|
248 |
-
|
249 |
-
### Níveis de Probabilidade
|
250 |
-
- **>80%**: Alta probabilidade - Investigação prioritária
|
251 |
-
- **60-80%**: Probabilidade moderada - Investigação recomendada
|
252 |
-
- **40-60%**: Probabilidade média - Monitoramento
|
253 |
-
- **<40%**: Baixa probabilidade - Observação
|
254 |
-
|
255 |
-
### Categorias de Doenças Analisadas
|
256 |
-
1. **Doenças Autoimunes**
|
257 |
-
- Artrite Reumatoide
|
258 |
-
- Lúpus
|
259 |
-
- Esclerose Múltipla
|
260 |
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
|
|
265 |
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
|
|
270 |
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
|
|
275 |
""")
|
276 |
|
277 |
# Aba de Recomendações
|
@@ -279,26 +294,27 @@ def criar_interface():
|
|
279 |
gr.Markdown("""
|
280 |
## Recomendações Gerais
|
281 |
|
282 |
-
###
|
283 |
-
-
|
284 |
-
-
|
285 |
-
-
|
|
|
286 |
|
287 |
-
###
|
288 |
-
1. **
|
289 |
-
-
|
290 |
-
-
|
291 |
-
-
|
292 |
|
293 |
-
2. **
|
294 |
-
-
|
295 |
-
-
|
296 |
-
-
|
297 |
|
298 |
-
3. **
|
299 |
-
-
|
300 |
-
-
|
301 |
-
-
|
302 |
""")
|
303 |
|
304 |
return interface
|
|
|
5 |
import io
|
6 |
from collections import defaultdict
|
7 |
|
8 |
+
def detectar_iris(imagem):
|
9 |
+
"""
|
10 |
+
Detecta a íris na imagem e retorna a região de interesse
|
11 |
+
"""
|
12 |
+
# Converter para escala de cinza
|
13 |
+
gray = cv2.cvtColor(imagem, cv2.COLOR_RGB2GRAY)
|
14 |
+
|
15 |
+
# Aplicar blur para reduzir ruído
|
16 |
+
blur = cv2.GaussianBlur(gray, (7, 7), 0)
|
17 |
+
|
18 |
+
# Detectar círculos (íris) usando transformada de Hough
|
19 |
+
circles = cv2.HoughCircles(
|
20 |
+
blur,
|
21 |
+
cv2.HOUGH_GRADIENT,
|
22 |
+
dp=1,
|
23 |
+
minDist=50,
|
24 |
+
param1=50,
|
25 |
+
param2=30,
|
26 |
+
minRadius=50,
|
27 |
+
maxRadius=150
|
28 |
+
)
|
29 |
+
|
30 |
+
if circles is not None:
|
31 |
+
# Converter coordenadas para inteiros
|
32 |
+
circles = np.uint16(np.around(circles))
|
33 |
+
|
34 |
+
# Pegar o primeiro círculo detectado
|
35 |
+
x, y, r = circles[0][0]
|
36 |
+
|
37 |
+
# Criar máscara circular
|
38 |
+
mask = np.zeros_like(gray)
|
39 |
+
cv2.circle(mask, (x, y), r, 255, -1)
|
40 |
+
|
41 |
+
# Aplicar máscara na imagem original
|
42 |
+
result = cv2.bitwise_and(imagem, imagem, mask=mask)
|
43 |
+
|
44 |
+
# Recortar região da íris
|
45 |
+
roi = result[y-r:y+r, x-r:x+r]
|
46 |
+
|
47 |
+
return roi, (x, y, r)
|
48 |
+
|
49 |
+
return None, None
|
50 |
+
|
51 |
+
def analisar_textura(roi):
|
52 |
+
"""
|
53 |
+
Analisa a textura da íris para identificar padrões
|
54 |
+
"""
|
55 |
+
if roi is None:
|
56 |
+
return {}
|
57 |
+
|
58 |
+
# Converter para escala de cinza
|
59 |
+
gray = cv2.cvtColor(roi, cv2.COLOR_RGB2GRAY)
|
60 |
+
|
61 |
+
# Análises de textura
|
62 |
+
padroes = {
|
63 |
+
"congestao_inflamacao": False,
|
64 |
+
"deficiencia_hipofuncao": False,
|
65 |
+
"atrofia_degeneracao": False,
|
66 |
+
"irritacao_estresse": False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
}
|
68 |
+
|
69 |
+
# Análise de variância local
|
70 |
+
kernel_size = 5
|
71 |
+
local_var = cv2.Laplacian(gray, cv2.CV_64F).var()
|
72 |
+
|
73 |
+
# Análise de intensidade média
|
74 |
+
mean_intensity = np.mean(gray)
|
75 |
+
|
76 |
+
# Análise de contraste
|
77 |
+
contrast = np.std(gray)
|
78 |
+
|
79 |
+
# Detecção de bordas
|
80 |
+
edges = cv2.Canny(gray, 100, 200)
|
81 |
+
edge_density = np.sum(edges) / (edges.shape[0] * edges.shape[1])
|
82 |
+
|
83 |
+
# Definir limiares para cada padrão
|
84 |
+
if local_var > 100:
|
85 |
+
padroes["congestao_inflamacao"] = True
|
86 |
+
|
87 |
+
if mean_intensity < 100:
|
88 |
+
padroes["deficiencia_hipofuncao"] = True
|
89 |
+
|
90 |
+
if contrast < 30:
|
91 |
+
padroes["atrofia_degeneracao"] = True
|
92 |
+
|
93 |
+
if edge_density > 0.1:
|
94 |
+
padroes["irritacao_estresse"] = True
|
95 |
+
|
96 |
+
return padroes
|
97 |
|
98 |
+
def analisar_setores(roi, centro, raio):
|
99 |
+
"""
|
100 |
+
Analisa diferentes setores da íris
|
101 |
+
"""
|
102 |
+
if roi is None:
|
103 |
+
return {}
|
104 |
+
|
105 |
+
setores = {
|
106 |
+
"superior": (315, 45), # Cérebro
|
107 |
+
"direito": (45, 135), # Fígado
|
108 |
+
"inferior": (135, 225), # Sistema Digestivo
|
109 |
+
"esquerdo": (225, 315) # Coração
|
110 |
+
}
|
111 |
+
|
112 |
+
resultados = {}
|
113 |
+
|
114 |
+
for setor, (ang_inicio, ang_fim) in setores.items():
|
115 |
+
# Criar máscara para o setor
|
116 |
+
mask = np.zeros_like(roi[:,:,0])
|
117 |
+
cv2.ellipse(mask,
|
118 |
+
(raio, raio),
|
119 |
+
(raio-10, raio-10),
|
120 |
+
0,
|
121 |
+
ang_inicio,
|
122 |
+
ang_fim,
|
123 |
+
255,
|
124 |
+
-1)
|
125 |
+
|
126 |
+
# Aplicar máscara
|
127 |
+
setor_roi = cv2.bitwise_and(roi, roi, mask=mask)
|
128 |
+
|
129 |
+
# Analisar textura do setor
|
130 |
+
resultados[setor] = analisar_textura(setor_roi)
|
131 |
+
|
132 |
+
return resultados
|
133 |
+
|
134 |
+
def gerar_diagnostico(padroes, setores):
|
135 |
+
"""
|
136 |
+
Gera diagnóstico baseado nos padrões encontrados
|
137 |
+
"""
|
138 |
+
diagnostico = []
|
139 |
+
|
140 |
+
# Mapeamento de padrões para possíveis condições
|
141 |
+
mapa_condicoes = {
|
142 |
+
"congestao_inflamacao": [
|
143 |
+
"Processo inflamatório ativo",
|
144 |
+
"Possível condição autoimune",
|
145 |
+
"Inflamação crônica"
|
146 |
+
],
|
147 |
+
"deficiencia_hipofuncao": [
|
148 |
+
"Deficiência nutricional",
|
149 |
+
"Hipofunção glandular",
|
150 |
+
"Fadiga crônica"
|
151 |
+
],
|
152 |
+
"atrofia_degeneracao": [
|
153 |
+
"Desgaste tecidual",
|
154 |
+
"Processo degenerativo",
|
155 |
+
"Envelhecimento acelerado"
|
156 |
+
],
|
157 |
+
"irritacao_estresse": [
|
158 |
+
"Estresse crônico",
|
159 |
+
"Sobrecarga do sistema nervoso",
|
160 |
+
"Ansiedade"
|
161 |
]
|
162 |
}
|
163 |
+
|
164 |
+
# Analisar padrões gerais
|
165 |
+
for padrao, presente in padroes.items():
|
166 |
+
if presente:
|
167 |
+
diagnostico.extend(mapa_condicoes[padrao])
|
168 |
+
|
169 |
+
# Analisar setores específicos
|
170 |
+
for setor, padroes_setor in setores.items():
|
171 |
+
for padrao, presente in padroes_setor.items():
|
172 |
+
if presente:
|
173 |
+
if setor == "superior":
|
174 |
+
diagnostico.append(f"Região cerebral: {mapa_condicoes[padrao][0]}")
|
175 |
+
elif setor == "direito":
|
176 |
+
diagnostico.append(f"Região hepática: {mapa_condicoes[padrao][0]}")
|
177 |
+
elif setor == "inferior":
|
178 |
+
diagnostico.append(f"Região digestiva: {mapa_condicoes[padrao][0]}")
|
179 |
+
elif setor == "esquerdo":
|
180 |
+
diagnostico.append(f"Região cardíaca: {mapa_condicoes[padrao][0]}")
|
181 |
+
|
182 |
+
return list(set(diagnostico)) # Remover duplicatas
|
183 |
|
184 |
+
def processar_imagem(imagem):
|
185 |
"""
|
186 |
+
Processa a imagem da íris e retorna análise
|
187 |
"""
|
188 |
+
# Converter imagem para formato OpenCV
|
189 |
+
img_array = np.array(imagem)
|
190 |
+
|
191 |
+
# Detectar íris
|
192 |
+
roi, (x, y, r) = detectar_iris(img_array)
|
193 |
+
if roi is None:
|
194 |
+
return "Não foi possível detectar a íris na imagem."
|
195 |
+
|
196 |
+
# Analisar padrões gerais
|
197 |
+
padroes = analisar_textura(roi)
|
198 |
+
|
199 |
+
# Analisar setores
|
200 |
+
setores = analisar_setores(roi, (x, y), r)
|
201 |
+
|
202 |
+
# Gerar diagnóstico
|
203 |
+
diagnostico = gerar_diagnostico(padroes, setores)
|
204 |
+
|
205 |
+
# Gerar visualização
|
206 |
+
output_img = img_array.copy()
|
207 |
+
cv2.circle(output_img, (x, y), r, (0, 255, 0), 2)
|
208 |
+
|
209 |
+
# Desenhar setores
|
210 |
+
ang_step = 45
|
211 |
+
for ang in range(0, 360, ang_step):
|
212 |
+
end_x = int(x + r * np.cos(np.radians(ang)))
|
213 |
+
end_y = int(y + r * np.sin(np.radians(ang)))
|
214 |
+
cv2.line(output_img, (x, y), (end_x, end_y), (0, 255, 0), 1)
|
215 |
+
|
216 |
+
return output_img, "\n".join(diagnostico)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
217 |
|
218 |
def criar_interface():
|
219 |
"""
|
220 |
+
Cria interface moderna do Gradio
|
221 |
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
222 |
# Tema personalizado verde piscina
|
223 |
theme = gr.themes.Soft(
|
224 |
primary_hue="teal",
|
|
|
230 |
input_background_fill="#E9F5F3",
|
231 |
button_primary_background_fill="#2A9D8F",
|
232 |
button_primary_background_fill_dark="#264653",
|
|
|
|
|
233 |
)
|
234 |
+
|
235 |
+
# Interface
|
236 |
+
with gr.Blocks(theme=theme, title="Análise Iridológica por Imagem") as interface:
|
237 |
gr.Markdown("""
|
238 |
+
# Sistema Avançado de Análise Iridológica
|
239 |
+
### Análise automatizada de imagens da íris
|
240 |
""")
|
241 |
|
242 |
with gr.Tabs():
|
243 |
+
# Aba de Análise
|
244 |
+
with gr.Tab("Análise de Imagem"):
|
245 |
+
with gr.Row():
|
246 |
+
with gr.Column():
|
247 |
+
input_image = gr.Image(
|
248 |
+
label="Imagem da Íris",
|
249 |
+
type="pil"
|
250 |
+
)
|
251 |
+
with gr.Column():
|
252 |
+
output_image = gr.Image(
|
253 |
+
label="Íris Analisada"
|
254 |
+
)
|
255 |
+
|
256 |
+
analysis_btn = gr.Button("Analisar Íris", variant="primary")
|
257 |
output_text = gr.Textbox(
|
258 |
+
label="Diagnóstico",
|
259 |
+
lines=10
|
260 |
)
|
261 |
|
262 |
analysis_btn.click(
|
263 |
+
fn=processar_imagem,
|
264 |
+
inputs=[input_image],
|
265 |
+
outputs=[output_image, output_text]
|
266 |
)
|
267 |
|
268 |
+
# Aba de Guia
|
269 |
with gr.Tab("Guia de Interpretação"):
|
270 |
gr.Markdown("""
|
271 |
+
## Interpretação dos Sinais
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
272 |
|
273 |
+
### Padrões Principais
|
274 |
+
- **Congestão/Inflamação**: Áreas escuras ou densas
|
275 |
+
- **Deficiência/Hipofunção**: Áreas claras ou vazias
|
276 |
+
- **Atrofia/Degeneração**: Lacunas ou descontinuidades
|
277 |
+
- **Irritação/Estresse**: Linhas radiais ou manchas
|
278 |
|
279 |
+
### Setores da Íris
|
280 |
+
1. **Superior**: Região cerebral
|
281 |
+
2. **Direito**: Região hepática
|
282 |
+
3. **Inferior**: Região digestiva
|
283 |
+
4. **Esquerdo**: Região cardíaca
|
284 |
|
285 |
+
### Recomendações
|
286 |
+
- Faça a foto com boa iluminação
|
287 |
+
- Mantenha o olho bem aberto
|
288 |
+
- Evite reflexos na imagem
|
289 |
+
- Use câmera com boa resolução
|
290 |
""")
|
291 |
|
292 |
# Aba de Recomendações
|
|
|
294 |
gr.Markdown("""
|
295 |
## Recomendações Gerais
|
296 |
|
297 |
+
### Qualidade da Imagem
|
298 |
+
- Resolução mínima: 1280x720
|
299 |
+
- Iluminação uniforme
|
300 |
+
- Foco na íris
|
301 |
+
- Sem reflexos
|
302 |
|
303 |
+
### Preparação
|
304 |
+
1. **Ambiente**
|
305 |
+
- Bem iluminado
|
306 |
+
- Sem luz direta
|
307 |
+
- Fundo claro
|
308 |
|
309 |
+
2. **Posicionamento**
|
310 |
+
- Olho bem aberto
|
311 |
+
- Câmera estável
|
312 |
+
- Distância adequada
|
313 |
|
314 |
+
3. **Momento**
|
315 |
+
- Evite olhos irritados
|
316 |
+
- Preferencialmente pela manhã
|
317 |
+
- Após descanso
|
318 |
""")
|
319 |
|
320 |
return interface
|