Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tarea Sem 5 HPM Ricardo Sanchez
Tarea Sem 5 HPM Ricardo Sanchez
Instituto IACC
28/10/2019
INSTRUCCIONES:
Uno de sus amigos más cercanos acaba de volver de vacaciones y sacó muchas fotografías, las
que conserva en la memoria SD de su teléfono. Quiere separar aquellas fotos donde salgan
personas de las que son solamente paisajes. Como él sabe que Ud. está aprendiendo a hacer
aplicaciones Android, le pidió que le ayudara a construir una aplicación que reconozca cuáles
son las fotografías que contienen personas.
Notas:
Ud. sabe que esto es posible utilizando android.media.FaceDetector y
android.media.FaceDetector.Face.
Primeramente debemos indicar que tanto FaceDetector es una clase que proporciona las
dimensiones de la imagen y el número de caras, luego devuelve una serie de caras.
El código JNI hace referencia a una biblioteca FFTEm, sin embargo, por su aspecto, FFT es la
Transformada Rápida de Fourier, que probablemente se usa junto con una red neuronal pre-
entrenada. “ paper by Ben-Yacoub et al”.
Según el enunciado presentado, se requiere de una app que reconozca cuáles fotos tienen rostros
y cuáles son paisajes... según esto, se diseña una interfaz gráfica, la cual, el usuario debe
seleccionar la ruta dónde se encuentran contenidas las imágenes y debe seleccionar qué imágenes
quiera escanear, luego, en el “textbox” (botón para almacenar) inferior, seleccionará dónde
quiere guardarlas, para posterior, el usuario debe presionar el botón SCAN, con el cual, los
procesos internos del programa deberan ir separando las imágenes dentro de la ruta de guardado
seleccionada.
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="50dp"
android:layout_marginEnd="50dp"
android:text="@string/indique_la_ruta_de_la_carpeta_de_im_genes"
android:textColor="#2196F3"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="82dp" />
<Button
android:id="@+id/button"
android:layout_width="56dp"
android:layout_height="50dp"
android:text="......"
android:textColor="#E40A0A0A"
tools:layout_editor_absoluteX="314dp"
tools:layout_editor_absoluteY="117dp" />
<Button
android:id="@+id/button2"
android:layout_width="56dp"
android:layout_height="50dp"
android:text=".............."
android:textColor="#E40A0A0A"
tools:layout_editor_absoluteX="314dp"
tools:layout_editor_absoluteY="266dp" />
<EditText
android:id="@+id/editText"
android:layout_width="261dp"
android:layout_height="45dp"
android:ems="10"
android:inputType="textPersonName"
android:text="....."
android:textColor="#E80F0F0F"
tools:layout_editor_absoluteX="50dp"
tools:layout_editor_absoluteY="118dp" />
<EditText
android:id="@+id/editText2"
android:layout_width="261dp"
android:layout_height="45dp"
android:ems="10"
android:inputType="textPersonName"
android:text="..............."
android:textColor="#E80F0F0F"
tools:layout_editor_absoluteX="50dp"
tools:layout_editor_absoluteY="267dp" />
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="50dp"
android:layout_marginEnd="50dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="167dp" />
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="50dp"
android:layout_marginEnd="50dp"
android:text="Indique ruta guardar imágenes"
android:textColor="#8BC34A"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="227dp" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SCAN"
android:textColor="#2196F3"
tools:layout_editor_absoluteX="161dp"
tools:layout_editor_absoluteY="316dp" />
<ImageView
android:id="@+id/imageView"
android:layout_width="314dp"
android:layout_height="276dp"
app:srcCompat="@android:drawable/ic_menu_gallery"
tools:layout_editor_absoluteX="50dp"
tools:layout_editor_absoluteY="345dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
API detection rostros
tools:context="com.truiton.mobile.vision.facedetection.MainActivity"><font></
font>
<font></font>
<ImageView<font></font>
android:id="@+id/imageView"<font></font>
android:layout_width="70dp"<font></font>
android:layout_height="70dp"<font></font>
app:layout_constraintBottom_toBottomOf="parent"<font></font>
app:layout_constraintHorizontal_bias="1.0"<font></font>
app:layout_constraintLeft_toLeftOf="parent"<font></font>
app:layout_constraintRight_toRightOf="parent"<font></font>
app:srcCompat="@mipmap/truiton"/><font></font>
<font></font>
<Button<font></font>
android:id="@+id/button"<font></font>
android:layout_width="wrap_content"<font></font>
android:layout_height="wrap_content"<font></font>
android:layout_marginBottom="8dp"<font></font>
android:text="Scan Face"<font></font>
app:layout_constraintBottom_toBottomOf="parent"<font></font>
app:layout_constraintLeft_toLeftOf="parent"<font></font>
app:layout_constraintRight_toRightOf="parent"<font></font>
tools:layout_constraintLeft_creator="1"<font></font>
tools:layout_constraintRight_creator="1"<font></font>
/><font></font>
<font></font>
<TextView<font></font>
android:id="@+id/textView"<font></font>
android:layout_width="wrap_content"<font></font>
android:layout_height="wrap_content"<font></font>
android:layout_marginTop="8dp"<font></font>
android:text="Scan Results:"<font></font>
android:textAllCaps="false"<font></font>
android:textStyle="normal|bold"<font></font>
app:layout_constraintLeft_toLeftOf="parent"<font></font>
app:layout_constraintRight_toRightOf="parent"<font></font>
app:layout_constraintTop_toTopOf="parent"<font></font>
tools:layout_constraintLeft_creator="1"<font></font>
tools:layout_constraintRight_creator="1"/><font></font>
<font></font>
<ScrollView<font></font>
android:layout_width="0dp"<font></font>
android:layout_height="0dp"<font></font>
android:layout_marginTop="8dp"<font></font>
android:paddingLeft="5dp"<font></font>
android:paddingRight="5dp"<font></font>
app:layout_constraintBottom_toBottomOf="parent"<font></font>
app:layout_constraintHorizontal_bias="1.0"<font></font>
app:layout_constraintLeft_toLeftOf="parent"<font></font>
app:layout_constraintRight_toRightOf="parent"<font></font>
app:layout_constraintTop_toBottomOf="@+id/textView"<font></font>
app:layout_constraintVertical_bias="1.0"<font></font>
tools:layout_constraintBottom_creator="1"<font></font>
tools:layout_constraintLeft_creator="1"<font></font>
tools:layout_constraintRight_creator="1"<font></font>
tools:layout_constraintTop_creator="1"><font></font>
<font></font>
<LinearLayout<font></font>
android:layout_width="match_parent"<font></font>
android:layout_height="wrap_content"<font></font>
android:orientation="vertical"><font></font>
<font></font>
<TextView<font></font>
android:id="@+id/results"<font></font>
android:layout_width="match_parent"<font></font>
android:layout_height="wrap_content"<font></font>
android:layout_gravity="center_horizontal"<font></font>
android:layout_marginTop="8dp"/><font></font>
<font></font>
<ImageView<font></font>
android:id="@+id/scannedResults"<font></font>
android:layout_width="wrap_content"<font></font>
android:layout_height="wrap_content"<font></font>
android:layout_gravity="center_horizontal"<font></font>
android:layout_marginBottom="8dp"<font></font>
android:layout_marginTop="8dp"/><font></font>
</LinearLayout><font></font>
</ScrollView><font></font>
</android.support.constraint.ConstraintLayout><font></font>
MainActivity Face Detection.
1. package com.truiton.mobile.vision.facedetection;<font></font>
2. <font></font>
3. <font></font>
4. import android.Manifest;<font></font>
5. import android.content.Context;<font></font>
6. import android.content.Intent;<font></font>
7. import android.content.pm.PackageManager;<font></font>
8. import android.graphics.Bitmap;<font></font>
9. import android.graphics.BitmapFactory;<font></font>
10. import android.graphics.Canvas;<font></font>
11. import android.graphics.Color;<font></font>
12. import android.graphics.Paint;<font></font>
13. import android.net.Uri;<font></font>
14. import android.os.Bundle;<font></font>
15. import android.os.Environment;<font></font>
16. import android.provider.MediaStore;<font></font>
17. import android.support.annotation.NonNull;<font></font>
18. import android.support.v4.app.ActivityCompat;<font></font>
19. import android.support.v4.content.FileProvider;<font></font>
20. import android.support.v7.app.AppCompatActivity;<font></font>
21. import android.util.Log;<font></font>
22. import android.util.SparseArray;<font></font>
23. import android.view.View;<font></font>
24. import android.widget.Button;<font></font>
25. import android.widget.ImageView;<font></font>
26. import android.widget.TextView;<font></font>
27. import android.widget.Toast;<font></font>
28. <font></font>
29. import com.google.android.gms.vision.Frame;<font></font>
30. import com.google.android.gms.vision.face.Face;<font></font>
31. import com.google.android.gms.vision.face.FaceDetector;<font></font>
32. import com.google.android.gms.vision.face.Landmark;<font></font>
33. <font></font>
34. import java.io.File;<font></font>
35. import java.io.FileNotFoundException;<font></font>
36. <font></font>
37. public class MainActivity extends AppCompatActivity {<font></font>
38. private static final String LOG_TAG = "FACE API";<font></font>
39. private static final int PHOTO_REQUEST = 10;<font></font>
40. private TextView scanResults;<font></font>
41. private ImageView imageView;<font></font>
42. private Uri imageUri;<font></font>
43. private FaceDetector detector;<font></font>
44. private static final int REQUEST_WRITE_PERMISSION = 20;<font></font>
45. private static final String SAVED_INSTANCE_URI = "uri";<font></font>
46. private static final String SAVED_INSTANCE_BITMAP = "bitmap";<font></font>
47. private static final String SAVED_INSTANCE_RESULT = "result";<font></font>
48. Bitmap editedBitmap;<font></font>
49. <font></font>
50. @Override<font></font>
51. protected void onCreate(Bundle savedInstanceState) {<font></font>
52. super.onCreate(savedInstanceState);<font></font>
53. setContentView(R.layout.activity_main);<font></font>
54. Button button = (Button) findViewById(R.id.button);<font></font>
55. scanResults = (TextView) findViewById(R.id.results);<font></font>
56. imageView = (ImageView) findViewById(R.id.scannedResults);<font></font>
57. if (savedInstanceState != null) {<font></font>
58. editedBitmap = savedInstanceState.getParcelable(SAVED_INSTANCE_BITMAP);<font></font>
59. if (savedInstanceState.getString(SAVED_INSTANCE_URI) != null) {<font></font>
60. imageUri = Uri.parse(savedInstanceState.getString(SAVED_INSTANCE_URI));<font></font>
61. }<font></font>
62. imageView.setImageBitmap(editedBitmap);<font></font>
63. scanResults.setText(savedInstanceState.getString(SAVED_INSTANCE_RESULT));<font></font>
64. }<font></font>
65. detector = new FaceDetector.Builder(getApplicationContext())<font></font>
66. .setTrackingEnabled(false)<font></font>
67. .setLandmarkType(FaceDetector.ALL_LANDMARKS)<font></font>
68. .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)<font></font>
69. .build();<font></font>
70. button.setOnClickListener(new View.OnClickListener() {<font></font>
71. @Override<font></font>
72. public void onClick(View view) {<font></font>
73. ActivityCompat.requestPermissions(MainActivity.this, new<font></font>
74. String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION);<font></font>
75. }<font></font>
76. });<font></font>
77. }<font></font>
78. <font></font>
79. @Override<font></font>
80. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[]
grantResults) {<font></font>
81. super.onRequestPermissionsResult(requestCode, permissions, grantResults);<font></font>
82. switch (requestCode) {<font></font>
83. case REQUEST_WRITE_PERMISSION:<font></font>
84. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {<font></font>
85. takePicture();<font></font>
86. } else {<font></font>
87. Toast.makeText(MainActivity.this, "Permission Denied!", Toast.LENGTH_SHORT).show();<font></font>
88. }<font></font>
89. }<font></font>
90. }<font></font>
91. <font></font>
92. @Override<font></font>
93. protected void onActivityResult(int requestCode, int resultCode, Intent data) {<font></font>
94. if (requestCode == PHOTO_REQUEST && resultCode == RESULT_OK) {<font></font>
95. launchMediaScanIntent();<font></font>
96. try {<font></font>
97. scanFaces();<font></font>
98. } catch (Exception e) {<font></font>
99. Toast.makeText(this, "Failed to load Image", Toast.LENGTH_SHORT).show();<font></font>
100. Log.e(LOG_TAG, e.toString());<font></font>
101. }<font></font>
102. }<font></font>
103. }<font></font>
104. <font></font>
105. private void scanFaces() throws Exception {<font></font>
106. Bitmap bitmap = decodeBitmapUri(this, imageUri);<font></font>
107. if (detector.isOperational() && bitmap != null) {<font></font>
108. editedBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap<font></font>
109. .getHeight(), bitmap.getConfig());<font></font>
110. float scale = getResources().getDisplayMetrics().density;<font></font>
111. Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);<font></font>
112. paint.setColor(Color.rgb(255, 61, 61));<font></font>
113. paint.setTextSize((int) (14 * scale));<font></font>
114. paint.setShadowLayer(1f, 0f, 1f, Color.WHITE);<font></font>
115. paint.setStyle(Paint.Style.STROKE);<font></font>
116. paint.setStrokeWidth(3f);<font></font>
117. Canvas canvas = new Canvas(editedBitmap);<font></font>
118. canvas.drawBitmap(bitmap, 0, 0, paint);<font></font>
119. Frame frame = new Frame.Builder().setBitmap(editedBitmap).build();<font></font>
120. SparseArray<Face> faces = detector.detect(frame);<font></font>
121. scanResults.setText(null);<font></font>
122. for (int index = 0; index < faces.size(); ++index) {<font></font>
123. Face face = faces.valueAt(index);<font></font>
124. canvas.drawRect(<font></font>
125. face.getPosition().x,<font></font>
126. face.getPosition().y,<font></font>
127. face.getPosition().x + face.getWidth(),<font></font>
128. face.getPosition().y + face.getHeight(), paint);<font></font>
129. scanResults.setText(scanResults.getText() + "Face " + (index + 1) + "\n");<font></font>
130. scanResults.setText(scanResults.getText() + "Smile probability:" + "\n");<font></font>
131. scanResults.setText(scanResults.getText() + String.valueOf(face.getIsSmilingProbability()) + "\n");<font></font>
132. scanResults.setText(scanResults.getText() + "Left Eye Open Probability: " + "\n");<font></font>
133. scanResults.setText(scanResults.getText() + String.valueOf(face.getIsLeftEyeOpenProbability()) + "\n");<font></font>
134. scanResults.setText(scanResults.getText() + "Right Eye Open Probability: " + "\n");<font></font>
135. scanResults.setText(scanResults.getText() + String.valueOf(face.getIsRightEyeOpenProbability()) +
"\n");<font></font>
136. scanResults.setText(scanResults.getText() + "---------" + "\n");<font></font>
137. <font></font>
138. for (Landmark landmark : face.getLandmarks()) {<font></font>
139. int cx = (int) (landmark.getPosition().x);<font></font>
140. int cy = (int) (landmark.getPosition().y);<font></font>
141. canvas.drawCircle(cx, cy, 5, paint);<font></font>
142. }<font></font>
143. }<font></font>
144. <font></font>
145. if (faces.size() == 0) {<font></font>
146. scanResults.setText("Scan Failed: Found nothing to scan");<font></font>
147. } else {<font></font>
148. imageView.setImageBitmap(editedBitmap);<font></font>
149. scanResults.setText(scanResults.getText() + "No of Faces Detected: " + "\n");<font></font>
150. scanResults.setText(scanResults.getText() + String.valueOf(faces.size()) + "\n");<font></font>
151. scanResults.setText(scanResults.getText() + "---------" + "\n");<font></font>
152. }<font></font>
153. } else {<font></font>
154. scanResults.setText("Could not set up the detector!");<font></font>
155. }<font></font>
156. }<font></font>
157. <font></font>
158. private void takePicture() {<font></font>
159. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);<font></font>
160. File photo = new File(Environment.getExternalStorageDirectory(), "picture.jpg");<font></font>
161. imageUri = FileProvider.getUriForFile(MainActivity.this,<font></font>
162. BuildConfig.APPLICATION_ID + ".provider", photo);<font></font>
163. intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);<font></font>
164. startActivityForResult(intent, PHOTO_REQUEST);<font></font>
165. }<font></font>
166. <font></font>
167. @Override<font></font>
168. protected void onSaveInstanceState(Bundle outState) {<font></font>
169. if (imageUri != null) {<font></font>
170. outState.putParcelable(SAVED_INSTANCE_BITMAP, editedBitmap);<font></font>
171. outState.putString(SAVED_INSTANCE_URI, imageUri.toString());<font></font>
172. outState.putString(SAVED_INSTANCE_RESULT, scanResults.getText().toString());<font></font>
173. }<font></font>
174. super.onSaveInstanceState(outState);<font></font>
175. }<font></font>
176. <font></font>
177. @Override<font></font>
178. protected void onDestroy() {<font></font>
179. super.onDestroy();<font></font>
180. detector.release();<font></font>
181. }<font></font>
182. <font></font>
183. private void launchMediaScanIntent() {<font></font>
184. Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);<font></font>
185. mediaScanIntent.setData(imageUri);<font></font>
186. this.sendBroadcast(mediaScanIntent);<font></font>
187. }<font></font>
188. <font></font>
189. private Bitmap decodeBitmapUri(Context ctx, Uri uri) throws FileNotFoundException {<font></font>
190. int targetW = 600;<font></font>
191. int targetH = 600;<font></font>
192. BitmapFactory.Options bmOptions = new BitmapFactory.Options();<font></font>
193. bmOptions.inJustDecodeBounds = true;<font></font>
194. BitmapFactory.decodeStream(ctx.getContentResolver().openInputStream(uri), null, bmOptions);<font></font>
195. int photoW = bmOptions.outWidth;<font></font>
196. int photoH = bmOptions.outHeight;<font></font>
197. <font></font>
198. int scaleFactor = Math.min(photoW / targetW, photoH / targetH);<font></font>
199. bmOptions.inJustDecodeBounds = false;<font></font>
200. bmOptions.inSampleSize = scaleFactor;<font></font>
201. <font></font>
202. return BitmapFactory.decodeStream(ctx.getContentResolver()<font></font>
203. .openInputStream(uri), null, bmOptions);<font></font>
204. }<font></font>
205. }<font></font>
PROFESOR:
POR LA PREMURA DEL TIEMPO ENVIE TODA ESTA DOCUMENTACION, ALGO PASO
CON EL ARCHIVO QUE TUVE QUE COMENZAR A REHACER TODO NUEVAMENTE,
DISCULPE LAS MOLESTIAS.
Bibliografía
Contenidos Semana 5
Recursos Adicionales 5