Está en la página 1de 20

Multimedia en Android.

Ricardo Sánchez Córdova

Herramientas de Programación Móvil

Instituto IACC

28/10/2019
INSTRUCCIONES:

Lea atentamente la situación planteada y responda a las solicitudes:

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.

Ayude a su amigo y construya la aplicación en Android Studio. Debe entregar la carpeta de


proyecto comprimida en un archivo “rar” o “zip”.-

Notas:
 Ud. sabe que esto es posible utilizando android.media.FaceDetector y
android.media.FaceDetector.Face.

 Se puede acceder a la ruta de la tarjeta SD utilizando


Environment.getExternalStorageDirectory ().
Desarrollo

Detección, selección y enmarcado de fotografías de personas.

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 “FaceFinder” se crea en FaceFinder.


 bbs_MemSeg_alloc devuelve un objeto btk_HFaceFinder (que contiene la función para
encontrar caras).
 Se trata al realizar esta aplicación de un laberinto de funciones se proporcionan con
punteros e instancias.

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.

Dentro de la carpeta de guardado, deben instalarse automáticamente dos carpetas, en una se


almacenarán todos los que el programa de reconocimiento facial reconozca, y las otras se
omitirán, o serán enviadas a la segunda subcarpeta , que serán imágenes variadas.
Interfaz Gráfica:
Código de la interfaz

<?xml version="1.0" encoding="utf-8"?>


<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<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

<?xml version="1.0" encoding="utf-8"?><font></font>


<android.support.constraint.ConstraintLayout<font></font>
android:id="@+id/activity_main"<font></font>
xmlns:android="http://schemas.android.com/apk/res/android"<font></font>
xmlns:app="http://schemas.android.com/apk/res-auto"<font></font>
xmlns:tools="http://schemas.android.com/tools"<font></font>
android:layout_width="match_parent"<font></font>
android:layout_height="match_parent"<font></font>

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>

1. paquete com. truiton . móviles . la visión . detección de cara ;


2.
3.
4. Importar Android. Manifiesto ;
5. Importar Android. contenido . Contexto ;
6. Importar Android. contenido . Intención ;
7. Importar Android. contenido . pm . PackageManager ;
8. Importar Android. gráficos . Mapa de bits ;
9. Importar Android. gráficos . BitmapFactory ;
10. Importar Android. gráficos . Lienzo ;
11. Importar Android. gráficos . Color ;
12. Importar Android. gráficos . Pintura ;
13. Importar Android. neta . Uri ;
14. Importar Android. os . Paquete ;
15. Importar Android. os . Medio ambiente ;
16. Importar Android. proveedor . MediaStore ;
17. Importar Android. apoyo . anotación . No nulo ;
18. Importar Android. apoyo . v4 . aplicación . ActivityCompat ;
19. Importar Android. apoyo . v4 . contenido . FileProvider ;
20. Importar Android. apoyo . v7 . aplicación . AppCompatActivity ;
21. Importar Android. util . Registro ;
22. Importar Android. util . SparseArray ;
23. Importar Android. vista . Vista ;
24. Importar Android. Reproductor . Botón ;
25. Importar Android. Reproductor . ImageView ;
26. Importar Android. Reproductor . TextView ;
27. Importar Android. Reproductor . tostadas ;
28.
29. importación com. google . androide . gms . la visión . Marco ;
30. importación com. google . androide . gms . la visión . la cara . Cara ;
31. importación com. google . androide . gms . la visión . la cara . FaceDetector ;
32. importación com. google . androide . gms . la visión . la cara . Punto de referencia ;
33.
34. Importar Java. io . Archivo ;
35. Importar Java. io . FileNotFoundException ;
36.
37. clase pública MainActivity extiende AppCompatActivity {
38. Private static final String LOG_TAG = "API de CARA" ;
39. privado estático final int PHOTO_REQUEST = 10 ;
40. TextView privado scanResults;
41. ImageView privado ImageView;
42. imagen privada de UriUri;
43. detector privado de FaceDetector;
44. Private static final int REQUEST_WRITE_PERMISSION = 20 ;
45. Cadena final estática privada SAVED_INSTANCE_URI = "uri" ;
46. Cadena estática privada final SAVED_INSTANCE_BITMAP = "mapa de bits" ;
47. Cadena estática privada final SAVED_INSTANCE_RESULT = "resultado" ;
48. Mapa de bits editado Mapa de bits;
49.
50. @Anular
51. vacío protegido onCreate ( Bundle savedInstanceState ) {
52. súper . onCreate ( savedInstanceState ) ;
53. setContentView ( R. diseño . actividad_principal ) ;
54. Botón botón = ( Botón ) findViewById ( botón R. id . ) ;
55. scanResults = ( TextView ) findViewById ( R. id . resultados ) ;
56. imageView = ( ImageView ) findViewById ( R. id . scannedResults ) ;
57. if ( savedInstanceState! = null ) {
58. editedBitmap = savedInstanceState. getParcelable ( SAVED_INSTANCE_BITMAP ) ;
59. if ( savedInstanceState. getString ( SAVED_INSTANCE_URI ) ! = null ) {
60. imageUri = Uri. parse ( savedInstanceState. getString ( SAVED_INSTANCE_URI ) ) ;
61. }
62. imageView. setImageBitmap ( editedBitmap ) ;
63. scanResults. setText ( savedInstanceState. getString ( SAVED_INSTANCE_RESULT ) ) ;
64. }
65. detector = nuevo FaceDetector. Generador ( getApplicationContext ( ) )
66. . setTrackingEnabled ( falso )
67. . setLandmarkType ( FaceDetector. ALL_LANDMARKS )
68. . setClassificationType ( FaceDetector. ALL_CLASSIFICATIONS )
69. . construir ( ) ;
70. botón. setOnClickListener ( nueva vista. OnClickListener ( ) {
71. @Anular
72. public void onClick ( Ver vista ) {
73. ActivityCompat. requestPermissions ( MainActivity. this , new
74. Cadena [ ] { Manifiesto. el permiso . WRITE_EXTERNAL_STORAGE } , REQUEST_WRITE_PERMISSION ) ;
75. }
76. });
77. }
78.
79. @Anular
80. public void onRequestPermissionsResult ( int requestCode , @NonNull String [ ] permissions, @NonNull int [ ]
grantResults ) {
81. súper . onRequestPermissionsResult ( requestCode , permissions, grantResults ) ;
82. switch ( requestCode ) {
83. caso REQUEST_WRITE_PERMISSION:
84. if ( grantResults. length > 0 && grantResults [ 0 ] == PackageManager. PERMISSION_GRANTED ) {
85. takePicture ( ) ;
86. } más {
87. Tostada. makeText ( MainActivity. this , "Permiso denegado!" , Toast. LENGTH_SHORT ) . show ( ) ;
88. }
89. }
90. }
91.
92. @Anular
93. void protegido en OnActivityResult ( int requestCode, int resultCode, Intent data ) {
94. if ( requestCode == PHOTO_REQUEST && resultCode == RESULT_OK ) {
95. launchMediaScanIntent ( ) ;
96. prueba {
97. scanFaces ( ) ;
98. } catch ( Excepción e ) {
99. Tostada. makeText ( esto , "Error al cargar la imagen" , Toast. LENGTH_SHORT ) . show ( ) ;
100. Iniciar sesión. e ( LOG_TAG, e. toString ( ) ) ;
101. }
102. }
103. }
104.
105. scanFaces ( ) vacío privado arroja la excepción {
106. Mapa de bits mapa de bits = decodeBitmapUri ( this , imageUri ) ;
107. if ( detector. isOperational ( ) && bitmap! = null ) {
108. editedBitmap = Bitmap. createBitmap ( mapa de bits. getWidth ( ) , mapa de bits
109. . getHeight ( ) , mapa de bits. getConfig ( ) ) ;
110. escala flotante = getResources ( ) . getDisplayMetrics ( ) . densidad ;
111. Pintura Pintura = nueva pintura ( Paint. ANTI_ALIAS_FLAG ) ;
112. pintar. setColor ( Color. rgb ( 255 , 61 , 61 ) ) ;
113. pintar. setTextSize ( ( int ) ( escala 14 * ) ) ;
114. pintar. setShadowLayer ( 1f, 0f, 1f, Color. BLANCO ) ;
115. pintar. setStyle ( Paint. Style . STROKE ) ;
116. pintar. setStrokeWidth ( 3f ) ;
117. Canvas canvas = nuevo Canvas ( editedBitmap ) ;
118. lona. drawBitmap ( mapa de bits, 0 , 0 , pintura ) ;
119. Marco de marco = nuevo marco. Constructor ( ) . setBitmap ( editedBitmap ) . construir ( ) ;
120. SparseArray <Face> faces = detector. detectar ( marco ) ;
121. scanResults. setText ( nulo ) ;
122. for ( int index = 0 ; index <faces. size ( ) ; ++ index ) {
123. Cara cara = caras. valueAt ( índice ) ;
124. lona. drawRect (
125. cara. getPosition ( ) . x ,
126. cara. getPosition ( ) . Y ,
127. cara. getPosition ( ) . x + cara. getWidth ( ) ,
128. cara. getPosition ( ) . cara y +. getHeight ( ) , paint ) ;
129. scanResults. setText ( scanResults. getText ( ) + "Face" + ( index + 1 ) + "\ n" ) ;
130. scanResults. setText ( scanResults. getText ( ) + "Probabilidad de sonrisa:" + "\ n" ) ;
131. scanResults. setText ( scanResults. getText ( ) + String . valueOf ( face. getIsSmilingProbability ( ) ) + "\ n" ) ;
132. scanResults. setText ( scanResults. getText ( ) + "Probabilidad de apertura del ojo izquierdo:" + "\ n" ) ;
133. scanResults. setText ( scanResults. getText ( ) + String . valueOf ( face. getIsLeftEyeOpenProbability ( ) ) + "\ n" ) ;
134. scanResults. setText ( scanResults. getText ( ) + "Probabilidad de apertura del ojo derecho:" + "\ n" ) ;
135. scanResults. setText ( scanResults. getText ( ) + String . valueOf ( face. getIsRightEyeOpenProbability ( ) ) + "\ n" ) ;
136. scanResults. setText ( scanResults. getText ( ) + "---------" + "\ n" ) ;
137.
138. para ( Punto de referencia: face. getLandmarks ( ) ) {
139. int cx = ( int ) ( punto de referencia. getPosition ( ) . x ) ;
140. int cy = ( int ) ( punto de referencia. getPosition ( ) . y ) ;
141. lona. drawCircle ( cx, cy, 5 , pintura ) ;
142. }
143. }
144.
145. if ( caras. tamaño ( ) == 0 ) {
146. scanResults. setText ( "Error al escanear: no se encontró nada para escanear" ) ;
147. } más {
148. imageView. setImageBitmap ( editedBitmap ) ;
149. scanResults. setText ( scanResults. getText ( ) + "No de caras detectadas:" + "\ n" ) ;
150. scanResults. setText ( scanResults. getText ( ) + String . valueOf ( faces. size ( ) ) + "\ n" ) ;
151. scanResults. setText ( scanResults. getText ( ) + "---------" + "\ n" ) ;
152. }
153. } más {
154. scanResults. setText ( "¡No se pudo configurar el detector!" ) ;
155. }
156. }
157.
158. takePicture privado vacío ( ) {
159. Intención intención = nueva intención ( MediaStore. ACTION_IMAGE_CAPTURE ) ;
160. Foto de archivo = archivo nuevo ( Environment. GetExternalStorageDirectory ( ) , "picture.jpg" ) ;
161. imageUri = FileProvider. getUriForFile ( MainActivity. this ,
162. BuildConfig. APPLICATION_ID + ".provider" , foto ) ;
163. intención. putExtra ( MediaStore. EXTRA_OUTPUT , imageUri ) ;
164. startActivityForResult ( intento, PHOTO_REQUEST ) ;
165. }
166.
167. @Anular
168. vacío protegido onSaveInstanceState ( Bundle outState ) {
169. if ( imageUri! = null ) {
170. fuera del estado. putParcelable ( SAVED_INSTANCE_BITMAP, editedBitmap ) ;
171. fuera del estado. putString ( SAVED_INSTANCE_URI, imageUri. toString ( ) ) ;
172. fuera del estado. putString ( SAVED_INSTANCE_RESULT, scanResults. getText ( ) . toString ( ) ) ;
173. }
174. súper . onSaveInstanceState ( outState ) ;
175. }
176.
177. @Anular
178. nulo protegido en Destroy ( ) {
179. súper . onDestroy ( ) ;
180. detector. liberar ( ) ;
181. }
182.
183. privado void launchMediaScanIntent ( ) {
184. Intención mediaScanIntent = nueva intención ( Intención. ACTION_MEDIA_SCANNER_SCAN_FILE ) ;
185. mediaScanIntent. setData ( imageUri ) ;
186. esta . sendBroadcast ( mediaScanIntent ) ;
187. }
188.
189. decodificación de mapa de bits privado BitmapUri ( Contexto ctx, Uri uri ) arroja FileNotFoundException {
190. int targetW = 600 ;
191. int targetH = 600 ;
192. BitmapFactory. Opciones bmOptions = new BitmapFactory. Opciones ( ) ;
193. bmOptions. inJustDecodeBounds = true;
194. BitmapFactory. decodeStream ( ctx. getContentResolver ( ) . openInputStream ( uri ) , null, bmOptions ) ;
195. int photoW = bmOptions. fuera de ancho ;
196. int photoH = bmOptions. outHeight ;
197.
198. int scaleFactor = Math. min ( fotoW / targetW, photoH / targetH ) ;
199. bmOptions. inJustDecodeBounds = false;
200. bmOptions. inSampleSize = scaleFactor;
201.
202. devuelve BitmapFactory. decodeStream ( ctx. getContentResolver ( )
203. . openInputStream ( uri ) , nulo, bmOptions ) ;
204. }
205. }

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

También podría gustarte