PageRenderTime 162ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 1ms

/solucion/tools/tp2diff.c

https://bitbucket.org/a0viedo/orga2tp2
C | 195 lines | 132 code | 50 blank | 13 comment | 27 complexity | 0732dd32a158b67218eefeae0e3afee1 MD5 | raw file
  1. #include <getopt.h>
  2. #include <highgui.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. const char *nombre_programa;
  6. void imprimir_ayuda();
  7. int main(int argc, char **argv) {
  8. int siguiente_opcion;
  9. // Opciones
  10. const char* const op_cortas = "hq";
  11. const struct option op_largas[] = {
  12. { "help", 0, NULL, 'h' },
  13. { "quite", 0, NULL, 'q' },
  14. { NULL, 0, NULL, 0 }
  15. };
  16. // Flags de opciones
  17. int quite = 0;
  18. // Guardar nombre del programa para usarlo en la ayuda
  19. nombre_programa = argv[0];
  20. // Si se ejecuta sin parametros ni opciones
  21. if (argc == 1) {
  22. imprimir_ayuda ( );
  23. exit ( EXIT_SUCCESS );
  24. }
  25. // Procesar opciones
  26. while (1) {
  27. siguiente_opcion = getopt_long ( argc, argv, op_cortas, op_largas, NULL);
  28. // No hay mas opciones
  29. if ( siguiente_opcion == -1 )
  30. break;
  31. // Procesar opcion
  32. switch ( siguiente_opcion ) {
  33. case 'h' : /* -h o --help */
  34. imprimir_ayuda ( );
  35. exit ( EXIT_SUCCESS );
  36. break;
  37. case 'q' : /* -q o --quite */
  38. quite = 1;
  39. break;
  40. case '?' : /* opcion no valida */
  41. imprimir_ayuda ( );
  42. exit ( EXIT_SUCCESS );
  43. default : /* opcion no valida */
  44. abort ( );
  45. }
  46. }
  47. const char *filename_a = argv[optind++];
  48. if (filename_a == NULL) {
  49. imprimir_ayuda ( );
  50. exit ( EXIT_SUCCESS );
  51. }
  52. const char *filename_b = argv[optind++];
  53. if (filename_b == NULL) {
  54. imprimir_ayuda ( );
  55. exit ( EXIT_SUCCESS );
  56. }
  57. const char *epsilon_str = argv[optind++];
  58. if (epsilon_str == NULL) {
  59. imprimir_ayuda ( );
  60. exit ( EXIT_SUCCESS );
  61. }
  62. int epsilon = atoi(epsilon_str);
  63. // Cargo las imagenes
  64. IplImage *src_a = 0;
  65. IplImage *src_b = 0;
  66. IplImage *dst = 0;
  67. int width;
  68. int height;
  69. if( (src_a = cvLoadImage (filename_a, CV_LOAD_IMAGE_GRAYSCALE)) == 0 )
  70. {
  71. printf("Error al cargar: %s\n", filename_a);
  72. exit(EXIT_FAILURE);
  73. }
  74. if( (src_b = cvLoadImage (filename_b, CV_LOAD_IMAGE_GRAYSCALE)) == 0 )
  75. {
  76. printf("Error al cargar: %s\n", filename_b);
  77. cvReleaseImage(&src_a);
  78. exit(EXIT_FAILURE);
  79. }
  80. // Chequear tamanos de las imagenes
  81. if (src_a->width != src_b->width || src_a->height != src_b->height) {
  82. printf("Los tamaños de las imágenes no distintos.\n");
  83. cvReleaseImage(&src_a);
  84. cvReleaseImage(&src_b);
  85. exit(EXIT_FAILURE);
  86. }
  87. // Creo una IplImage para cada salida esperada
  88. if( (dst = cvCreateImage (cvGetSize(src_a), IPL_DEPTH_8U, 1) ) == 0 ) {
  89. printf("Error al crear imágen de salida.\n");
  90. cvReleaseImage(&src_a);
  91. cvReleaseImage(&src_b);
  92. exit(EXIT_FAILURE);
  93. }
  94. // Chequeo pixel a pixel
  95. width = src_a->width;
  96. height = src_a->height;
  97. int row_size_a = src_a->widthStep;
  98. int row_size_b = src_b->widthStep;
  99. int row_size_dst = dst->widthStep;
  100. int equal = 1;
  101. unsigned char (*src_a_matrix)[row_size_a] = (unsigned char (*)[row_size_a]) src_a->imageData;
  102. unsigned char (*src_b_matrix)[row_size_b] = (unsigned char (*)[row_size_b]) src_b->imageData;
  103. unsigned char (*dst_matrix)[row_size_dst] = (unsigned char (*)[row_size_dst]) dst->imageData;
  104. int pixel_a;
  105. int pixel_b;
  106. for (int i = 0; i<height; i++) {
  107. for (int j = 0; j<width; j++) {
  108. pixel_a = (int) src_a_matrix[i][j];
  109. pixel_b = (int) src_b_matrix[i][j];
  110. if (abs(pixel_a - pixel_b) > epsilon) {
  111. if (!quite) {
  112. printf("Hay diferencias en el pixel: (%d, %d)\n", i, j);
  113. }
  114. equal = 0;
  115. dst_matrix[i][j] = 255;
  116. } else {
  117. dst_matrix[i][j] = 0;
  118. }
  119. }
  120. }
  121. // Guardo imagen y libero las imagenes
  122. char nomb_arch_salida[256];
  123. memset(nomb_arch_salida, 0, 256);
  124. sprintf(nomb_arch_salida, "diferencia.bmp");
  125. cvSaveImage(nomb_arch_salida, dst, NULL);
  126. // Libero las imagenes
  127. cvReleaseImage(&src_a);
  128. cvReleaseImage(&src_b);
  129. cvReleaseImage(&dst);
  130. return !equal;
  131. }
  132. void imprimir_ayuda ( ) {
  133. printf ( "Uso: %s opciones nombre_archivo_entrada_a nombre_archivo_entrada_b epsilon \n", nombre_programa );
  134. printf ( "Ejemplo de uso: \n" );
  135. printf ( " %s lena_a.bmp lena_b.bmp 5 \n", nombre_programa );
  136. printf ( " \n" );
  137. printf ( " Verifica pixel a pixel que la diferencia entre lena_a.bmp y \n" );
  138. printf ( " lena_b.bmp no supere el valor 5. Genera una imágen a partir \n" );
  139. printf ( " de las diferencias, poniendo un pixel blanco donde haya \n" );
  140. printf ( " diferencias y uno negro donde no. \n" );
  141. printf ( " \n" );
  142. printf ( " -h, --help Imprime esta ayuda \n" );
  143. printf ( " \n" );
  144. printf ( " -q, --quite Ejecuta en modo silencioso. \n" );
  145. }