piv.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #include <ufo/ufo.h>
  2. #include <stdlib.h>
  3. #include "piv-scheduler.h"
  4. #include "piv-nodes.h"
  5. #include "piv-ufo-base.h"
  6. static void
  7. check_error (GError *error)
  8. {
  9. if (error != NULL) {
  10. g_print ("Error reading configuration: %s\n", error->message);
  11. exit (1);
  12. }
  13. }
  14. int
  15. main (int argc, char *argv[])
  16. {
  17. struct piv_nodes piv;
  18. struct piv_ufo_base piv_base;
  19. GOptionContext *context;
  20. GKeyFile *key_file;
  21. GError *error = NULL;
  22. static gchar *key_file_name = NULL;
  23. static GOptionEntry entries[] = {
  24. { "config", 'c', 0, G_OPTION_ARG_STRING, &key_file_name, "Configuration file name (default piv.cfg)", "FILE" },
  25. { NULL }
  26. };
  27. #if !(GLIB_CHECK_VERSION (2, 36, 0))
  28. g_type_init ();
  29. #endif
  30. context = g_option_context_new (NULL);
  31. g_option_context_add_main_entries (context, entries, NULL);
  32. if (!g_option_context_parse (context, &argc, &argv, &error)) {
  33. g_print ("Failed parsing arguments: %s\n", error->message);
  34. return 1;
  35. }
  36. if (!key_file_name)
  37. key_file_name = "piv.cfg";
  38. piv_ufo_base_init(&piv_base);
  39. piv_nodes_init(&piv, &piv_base);
  40. if (piv_base.error)
  41. g_print ("Error %s\n", piv_base.error->message);
  42. key_file = g_key_file_new ();
  43. if (!g_key_file_load_from_file (key_file, key_file_name, G_KEY_FILE_NONE, &error)) {
  44. g_print ("Error loading `%s': %s", key_file_name, error->message);
  45. return 1;
  46. }
  47. /*********************/
  48. /* CONFIGURATION *****/
  49. /*********************/
  50. UfoTaskNode *global_reader;
  51. global_reader = ufo_plugin_manager_get_task (piv_base.manager, "read", &piv_base.error);
  52. gchar *input_path = g_key_file_get_string (key_file, "input", "path", &error);
  53. check_error (error);
  54. guint scale = (guint) g_key_file_get_integer (key_file, "input", "scale", &error);
  55. check_error (error);
  56. g_object_set (G_OBJECT (global_reader), "path", input_path, NULL);
  57. g_object_set (G_OBJECT (piv.writer), "filename", "res%i.tif", NULL);
  58. g_object_set (G_OBJECT (piv.ringwriter), "filename", "results", NULL);
  59. g_object_set (G_OBJECT (piv.denoise), "matrix_size",
  60. g_key_file_get_integer (key_file, "input", "matrix_size", &error) / scale, NULL);
  61. check_error (error);
  62. g_object_set (G_OBJECT (piv.contrast), "remove_high",
  63. g_key_file_get_boolean (key_file, "input", "remove_high_intensity_pixels", &error), NULL);
  64. check_error (error);
  65. guint ring_start = ((guint) g_key_file_get_integer (key_file, "ring", "start", &error)) / scale;
  66. check_error (error);
  67. guint ring_end = ((guint) g_key_file_get_integer (key_file, "ring", "end", &error)) / scale;
  68. check_error (error);
  69. guint ring_step = ((guint) g_key_file_get_integer (key_file, "ring", "step", &error)) / scale;
  70. check_error (error);
  71. g_object_set (G_OBJECT (piv.ring_pattern),
  72. "ring_start", ring_start,
  73. "ring_end", ring_end,
  74. "ring_step", ring_step, NULL);
  75. g_object_set (G_OBJECT (piv.ring_pattern), "ring_thickness",
  76. g_key_file_get_integer (key_file, "ring", "thickness", &error) / scale, NULL);
  77. check_error (error);
  78. g_object_set (G_OBJECT (piv.ring_pattern), "width",
  79. g_key_file_get_integer (key_file, "ring", "width", &error) / scale, NULL);
  80. check_error (error);
  81. g_object_set (G_OBJECT (piv.ring_pattern), "height",
  82. g_key_file_get_integer (key_file, "ring", "height", &error) / scale, NULL);
  83. check_error (error);
  84. g_object_set (G_OBJECT (piv.ringwriter), "scale", scale, NULL);
  85. g_object_set (G_OBJECT (piv.fft), "dimensions", 2, NULL);
  86. g_object_set (G_OBJECT (piv.ifft), "dimensions", 2, NULL);
  87. g_object_set (G_OBJECT (piv.ringfft), "dimensions", 2, NULL);
  88. g_object_set (G_OBJECT (piv.ringifft), "dimensions", 2, NULL);
  89. /* Give ring scale, when image is reduced by two, then scale should be 2 */
  90. g_object_set (G_OBJECT (piv.dump_ring), "scale", scale, NULL);
  91. /* Does not need user configuration */
  92. guint number_of_rings = (ring_end - ring_start) / ring_step + 1;
  93. g_object_set (G_OBJECT (piv.duplicater), "dup_count", number_of_rings, NULL);
  94. g_object_set (G_OBJECT (piv.concatenate_result), "ring_count", number_of_rings, NULL);
  95. g_object_set (G_OBJECT (piv.loop_ringfft), "loop", 1, NULL);
  96. g_object_set (G_OBJECT (piv.loop_ringfft), "dup_count",
  97. g_key_file_get_integer (key_file, "input", "num_images", &error), NULL);
  98. check_error (error);
  99. g_object_set (G_OBJECT (piv.concatenate_result), "max_count",
  100. g_key_file_get_integer (key_file, "ring", "max_count", &error), NULL);
  101. check_error (error);
  102. g_object_set (G_OBJECT (piv.filter_particle), "min",
  103. g_key_file_get_double (key_file, "filter", "min", &error), NULL);
  104. check_error (error);
  105. g_object_set (G_OBJECT (piv.filter_particle), "threshold",
  106. g_key_file_get_double (key_file, "filter", "threshold", &error), NULL);
  107. check_error (error);
  108. g_object_set (G_OBJECT (piv.get_dup_circ), "threshold",
  109. g_key_file_get_double (key_file, "dup", "threshold", &error) / scale, NULL);
  110. check_error (error);
  111. g_object_set (G_OBJECT (piv.remove_circle), "threshold",
  112. g_key_file_get_double (key_file, "remove", "threshold", &error) / scale, NULL);
  113. check_error (error);
  114. g_object_set (G_OBJECT (piv.multi_search), "radii_range",
  115. g_key_file_get_integer (key_file, "radii", "range", &error) / scale, NULL);
  116. check_error (error);
  117. g_object_set (G_OBJECT (piv.multi_search), "threshold",
  118. g_key_file_get_double (key_file, "radii", "threshold", &error), NULL);
  119. check_error (error);
  120. g_object_set (G_OBJECT (piv.multi_search), "displacement",
  121. g_key_file_get_integer (key_file, "radii", "displacement", &error) / scale, NULL);
  122. check_error (error);
  123. /*********************/
  124. /* GRAPH SETUP *******/
  125. /*********************/
  126. GList* piv_nodes = NULL;
  127. GList* it = piv_base.gpu_nodes;
  128. if (!it) {
  129. g_print("Main : No GPUs found\n");
  130. return 1;
  131. }
  132. g_print("Main : Connecting nodes %p\n", it->data);
  133. piv_nodes_set_gpu(&piv, it->data);
  134. piv_nodes = g_list_append(piv_nodes, &piv);
  135. piv_ufo_base_connect (&piv_base, &piv, scale,
  136. g_key_file_get_boolean (key_file, "output", "dump_ring_to_image", &error), global_reader);
  137. check_error (error);
  138. // Graph expansion for usage of multiple GPUs. Uncomment lines when UFO
  139. // supports calling plug-ins on demand
  140. //for (it = it->next; it; it = it->next) {
  141. // g_print("Main : Connecting nodes %p\n", it->data);
  142. // struct piv_nodes *cpy = piv_nodes_copy(&piv);
  143. // piv_nodes = g_list_append(piv_nodes, cpy);
  144. // piv_nodes_set_gpu(cpy, it->data);
  145. // piv_ufo_base_connect(&piv_base, cpy, scale, dump_ring_to_image, global_reader);
  146. //}
  147. ufo_base_scheduler_run(piv_base.scheduler, piv_base.graph, &piv_base.error);
  148. if (piv_base.error)
  149. g_print("Error %s\n", piv_base.error->message);
  150. /*********************/
  151. /* CLEANUP ***********/
  152. /*********************/
  153. piv_ufo_base_unref(&piv_base);
  154. for (it = piv_nodes; it; it = it->next)
  155. piv_nodes_unref(it->data);
  156. g_object_unref (global_reader);
  157. g_option_context_free (context);
  158. g_key_file_free (key_file);
  159. return 0;
  160. }