Advertisement
Guest User

Untitled

a guest
Mar 4th, 2015
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.06 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #include <cv.h>
  6. #include <highgui.h>
  7.  
  8. #include "building.h"
  9. #include "functools.h"
  10. #include "utils.h"
  11.  
  12. #define LINE_SIZE 1024
  13.  
  14. #define SKIP_LINE( no ) if ( no == NULL ) { printf( "Skipping\n" ); continue; }
  15.  
  16. #define H 0
  17. #define S 1
  18. #define V 2
  19.  
  20. #define STEP1_WIN_NAME "STEP 1"
  21. #define STEP2_WIN_NAME "STEP 2"
  22. #define ZOOM 1
  23.  
  24. #define RESAMPLE 1.0f
  25.  
  26. typedef struct MouseProbe {
  27. int x;
  28. int y;
  29.  
  30. IplImage *img;
  31. IplImage *show_img;
  32. IplImage *edge_img;
  33. } MouseProbe;
  34.  
  35. // variables
  36.  
  37.  
  38. // function declarations
  39. void flood_fill( IplImage *src_img, IplImage *dst_img, IplImage *height_img, const int x, const int y );
  40.  
  41.  
  42. /**
  43. * Callback pro kliknuti mysi.
  44. * param - obsahuje poiter na libovolna data, ktera mu predame pri vytvareni callbacku
  45. */
  46. void mouse_probe_handler( int event, int x, int y, int flags, void* param ) {
  47. MouseProbe *probe = (MouseProbe*)param;
  48.  
  49. switch ( event ) {
  50.  
  51. case CV_EVENT_LBUTTONDOWN:
  52. printf( "Clicked LEFT at: [ %d, %d ]\n", x, y );
  53. flood_fill( probe->edge_img, probe->show_img, probe->img, x, y );
  54. break;
  55.  
  56. case CV_EVENT_RBUTTONDOWN:
  57. printf( "Clicked RIGHT at: [ %d, %d ]\n", x, y );
  58. break;
  59. }
  60. }
  61.  
  62.  
  63. void create_windows( const int width, const int height ) {
  64. cvNamedWindow( STEP1_WIN_NAME, 0 );
  65. cvNamedWindow( STEP2_WIN_NAME, 0 );
  66.  
  67. cvResizeWindow( STEP1_WIN_NAME, width*ZOOM, height*ZOOM );
  68. cvResizeWindow( STEP2_WIN_NAME, width*ZOOM, height*ZOOM );
  69.  
  70. } // create_windows
  71.  
  72.  
  73. /**
  74. * Provede flood fill ze zadaneho bodu (x, y) pro okolni body pokud obsahuji stejnou hodnotu,
  75. * jaka prisla v argumentu value. Funkce rekurzivne vola sama sebe pro sve 4-okoli.
  76. * src_img - obraz na kterem se bude provadet vyplnovani
  77. * dst_img - obraz, do ktereho zaznamename vyplneni
  78. * value - hodnota, pro kterou provedeme vyplneni
  79. */
  80. void fill_step( IplImage *src_img, IplImage *dst_img, IplImage *height_img, const int x, const int y, const uchar value, Building *building ) {
  81. int width, height;
  82. int z;
  83.  
  84. } //fill_step
  85.  
  86.  
  87. /**
  88. * Provede flood fill ze zadaneho bodu (x, y). Funkce si zapamatuje hodnotu na souradnici (x, y)
  89. * a vyplnuje okoli pomoci funkce fill_step tak dlouho, dokud je hodnota v okolnich bodech stejna.
  90. * Vyplnovani provadejte na nejakem docasnem obraze, aby nedoslo k poskozeni puvodniho obrazu.
  91. * src_img - obraz na kterem se bude provadet vyplnovani
  92. * dst_img - obraz, do ktereho zaznamename vyplneni
  93. */
  94. void flood_fill( IplImage *src_img, IplImage *dst_img, IplImage *height_img, const int x, const int y ) {
  95. int width, height;
  96. IplImage *tmp_ff_img;
  97.  
  98. } //flood_fill
  99.  
  100.  
  101. void make_binary_file( const char *input_filename, const char *out_filename ) {
  102. FILE *f_in, *f_out;
  103. char line[ LINE_SIZE ];
  104. char *no = NULL;
  105. long line_no = 0;
  106. float x, y, z;
  107.  
  108. f_in = fopen( input_filename, "r" );
  109. f_out = fopen( out_filename, "wb" );
  110.  
  111. while ( fgets( line, LINE_SIZE, f_in ) != NULL ) {
  112. if ( line_no % 1000000 == 0 ) {
  113. printf( "Processing line: %ld Million\n", line_no / 1000000 );
  114. }
  115.  
  116. no = (char*)strtok( line, " " );
  117. SKIP_LINE( no );
  118. no = (char*)strtok( NULL, " " );
  119. SKIP_LINE( no );
  120. no = (char*)strtok( NULL, " " );
  121. SKIP_LINE( no );
  122. no = (char*)strtok( NULL, " " );
  123. SKIP_LINE( no );
  124. no = (char*)strtok( NULL, " " );
  125. SKIP_LINE( no );
  126. x = (float)atof( no );
  127. no = (char*)strtok( NULL, " " );
  128. SKIP_LINE( no )
  129. y = (float)atof( no );
  130. no = (char*)strtok( NULL, " " );
  131. SKIP_LINE( no );
  132. z = (float)atof( no );
  133.  
  134. fwrite( &x, sizeof( x ), 1, f_out );
  135. fwrite( &y, sizeof( y ), 1, f_out );
  136. fwrite( &z, sizeof( z ), 1, f_out );
  137.  
  138. line_no++;
  139. }
  140.  
  141. printf( "Closing file: %s\n", input_filename );
  142. printf( "Closing file: %s\n", out_filename );
  143. fclose( f_in );
  144. fclose( f_out );
  145. } //make_binary_file
  146.  
  147.  
  148. /**
  149. * Zjisti minimalni a maximalni souradnice v zadanem souboru.
  150. * Nezapomente, ze soubor tvori S-JTSK souradnice.
  151. */
  152. void get_min_max( const char *filename, float *a_min_x, float *a_max_x, float *a_min_y, float *a_max_y, float *a_min_z, float *a_max_z ) {
  153. FILE *f = NULL;
  154. float x, y, z;
  155. float min_x, min_y, min_z, max_x, max_y, max_z;
  156. int l_type;
  157.  
  158. // nacist binarni soubor, ziskat min a max pro x,y,z
  159.  
  160. f = fopen(filename, "rb");
  161.  
  162. fread(&max_x,sizeof(float),1,f);
  163. fread(&max_y,sizeof(float),1,f);
  164. fread(&max_z,sizeof(float),1,f);
  165. fread(&l_type,sizeof(int),1,f);
  166. min_x = max_x;
  167. min_y = max_y;
  168. min_z = max_z;
  169.  
  170. while (feof(f)==0)
  171. {
  172. fread(&x,sizeof(float),1,f);
  173. fread(&y,sizeof(float),1,f);
  174. fread(&z,sizeof(float),1,f);
  175. fread(&l_type,sizeof(int),1,f);
  176.  
  177. if (x > max_x)
  178. {
  179. max_x = x;
  180. }
  181. if (y > max_y)
  182. {
  183. max_y = y;
  184. }
  185. if (z > max_z)
  186. {
  187. max_z = z;
  188. }
  189. if (x < min_x)
  190. {
  191. min_x = x;
  192. }
  193. if (y < min_y)
  194. {
  195. min_y = y;
  196. }
  197. if (z < min_z)
  198. {
  199. min_z = z;
  200. }
  201. }
  202.  
  203. fclose(f);
  204.  
  205. *a_min_x = min_x;
  206. *a_min_y = min_y;
  207. *a_min_z = min_z;
  208. *a_max_x = max_x;
  209. *a_max_y = max_y;
  210. *a_max_z = max_z;
  211.  
  212.  
  213. } //get_min_max
  214.  
  215.  
  216. /**
  217. * Naplni obraz daty z lidaru.
  218. * Vsechny lidarove body jsou ukladany do pole, ktere ma rozmery obrazu. Pote je jednotlivym pixelum prirazena
  219. * hodnota jako prumer hodnot z odpovidajiciho prvku pole. Timto jednoduchym pristupem vsak dochazi ke ztrate dat.
  220. * filename - soubor s binarnimi daty
  221. * img - vystupni obrazek
  222. */
  223. void fill_image( const char *filename, IplImage *img, float min_x, float max_x, float min_y, float max_y, float min_z, float max_z ) {
  224. FILE *f = NULL;
  225. int delta_x, delta_y, delta_z;
  226. float fx, fy, fz;
  227. int x, y, l_type;
  228. int stride;
  229. int num_points = 0;
  230. float range = 0.0f;
  231. float *avg = NULL;
  232. int *avg_count = NULL;
  233.  
  234. // zjistime sirku a vysku obrazu
  235. delta_x = img->width;
  236. delta_y = img->height;
  237.  
  238. // naalokujeme pomocna pole, ve kterych budeme ukaladat hodnoty z lidaru
  239. // a pocet techto hodnot pro kazdy pixel
  240. avg = (float*)malloc((img->width)*(img->height)*(sizeof(float)));
  241. avg_count = (int*)malloc((img->width)*(img->height)*(sizeof(int)));
  242.  
  243. //otevreni souboru
  244. f = fopen(filename, "r");
  245.  
  246. //vynulovani poli
  247. for (int i = 0; i < (img->width)*(img->height); i++)
  248. {
  249. avg[i] = 0.0f;
  250. avg_count[i] = 0;
  251. }
  252.  
  253. // projdeme soubor a hodnoty priradime do poli
  254. while(!feof(f))
  255. {
  256. fread(&fx, 1, sizeof(float), f);
  257. fread(&fy, 1, sizeof(float), f);
  258. fread(&fz, 1, sizeof(float), f);
  259. fread(&l_type, 1, sizeof(int), f);
  260.  
  261. fx -= min_x;
  262. fy -= min_y;
  263.  
  264. x = cvRound(fx);
  265. y = cvRound(fy);
  266.  
  267. /*printf("%d",x);
  268. printf("%d",y);*/
  269.  
  270. if ((x < (img->width)) && (y < (img->height)))
  271. {
  272. avg[x + y * img->width] += fz;
  273. avg_count[x + y * img->width]++;
  274. }
  275. }
  276.  
  277. //zavreni souboru
  278. fclose(f);
  279.  
  280. // pro normalizaci
  281. range = 255/(max_z - min_z);
  282.  
  283. //prepocet z-tove souradnice
  284. for(int i = 0; i < ((img->width)*(img->height)); i++)
  285. {
  286. avg[i] /= avg_count[i]; //prumer
  287. avg[i] -= min_z;
  288. avg[i] *= range;
  289. }
  290.  
  291. // hodnoty z pomocneho pole priradime do obrazu
  292. for ( y = 0; y < (img->height); y++ ) {
  293. for ( x = 0; x < (img->width); x++ ) {
  294. CV_IMAGE_ELEM( img, uchar, y, x ) = (uchar)avg[(x + (y * (img->width)))];
  295. }
  296. }
  297.  
  298. } //fill_image
  299.  
  300. void make_edges( const IplImage *src_img, IplImage *sobel_img ) {
  301. cvCanny( src_img, sobel_img, 1, 80 );
  302. }
  303.  
  304. /**
  305. * Prevede hodnoty obrazu na pouze 2 hodnoty. Hranici mozno nastavit experimentalne.
  306. */
  307. void binarize_image( IplImage *img ) {
  308. int x, y;
  309. uchar value;
  310.  
  311. }
  312.  
  313.  
  314. void process_lidar( const char *txt_file, const char *bin_file, const char *img_file ) {
  315. float min_x, max_x, min_y, max_y, min_z, max_z;
  316. float delta_x, delta_y, delta_z;
  317. MouseProbe *probe;
  318.  
  319. IplImage *img = NULL; // obraz pro vstup lidarovych dat
  320. IplImage *show_img = NULL; // obraz pro kresleni nalezenych ploch
  321. IplImage *edge_img = NULL; // obraz pro hrany
  322.  
  323. probe = (MouseProbe*)malloc( sizeof( probe[ 0 ] ) );
  324.  
  325. //make_binary_file( txt_file, bin_file );
  326. get_min_max( bin_file, &min_x, &max_x, &min_y, &max_y, &min_z, &max_z );
  327.  
  328. printf( "min x: %f, max x: %f\n", min_x, max_x );
  329. printf( "min y: %f, max y: %f\n", min_y, max_y );
  330. printf( "min z: %f, max z: %f\n", min_z, max_z );
  331.  
  332. delta_x = max_x - min_x;
  333. delta_y = max_y - min_y;
  334. delta_z = max_z - min_z;
  335.  
  336. printf( "delta x: %f\n", delta_x );
  337. printf( "delta y: %f\n", delta_y );
  338. printf( "delta z: %f\n", delta_z );
  339.  
  340. // vytvorime obrazky podle informari ze souboru
  341. img = cvCreateImage( cvSize( cvRound (delta_x) , cvRound (delta_y) ), IPL_DEPTH_8U, 1 );
  342. show_img = cvCreateImage( cvSize( cvRound (delta_x) , cvRound (delta_y) ), IPL_DEPTH_8U, 3 );
  343. edge_img = cvCreateImage( cvSize( cvRound (delta_x) , cvRound (delta_y) ), IPL_DEPTH_8U, 1 );
  344.  
  345. create_windows( img->width, img->height );
  346.  
  347. //cvSetMouseCallback( STEP1_WIN_NAME, mouse_probe_handler, probe );
  348. //cvSetMouseCallback( STEP2_WIN_NAME, mouse_probe_handler, probe );
  349. probe->img = img;
  350. probe->show_img = show_img;
  351. probe->edge_img = edge_img;
  352.  
  353.  
  354. //printf( "Image w=%d, h=%d\n", img->width, img->height );
  355.  
  356. // naplnime vstupni obraz daty z lidaru
  357. fill_image( bin_file, img, min_x, max_x, min_y, max_y, min_z, max_z );
  358. cvCvtColor( img, show_img, CV_GRAY2RGB );
  359.  
  360. // vytvorime obraz hran
  361. //make_edges( img, edge_img );
  362.  
  363. // muzeme obraz hran binarizovat, ale v prvni fazi to neni nutne
  364. //binarize_image( edge_img );
  365. // dilatace, eroze
  366.  
  367. // v cyklu cekame na odezvu uzivatele (klikani uzivatele)
  368. // pokud zmackneme klavesu 'q', program konci
  369.  
  370. //cvSaveImage( img_file, img );
  371. while ( 1 ) {
  372. cvShowImage( STEP1_WIN_NAME, show_img );
  373. //cvShowImage( STEP2_WIN_NAME, edge_img );
  374. int key = cvWaitKey( 10 );
  375. if ( key == 'q' )
  376. {
  377. break;
  378. }
  379. }
  380.  
  381.  
  382. cvDestroyWindow( STEP1_WIN_NAME );
  383. cvDestroyWindow( STEP2_WIN_NAME );
  384.  
  385. cvReleaseImage( &img );
  386. cvReleaseImage( &show_img );
  387. cvReleaseImage( &edge_img );
  388. }
  389.  
  390.  
  391. int main( int argc, char *argv[] ) {
  392. char *txt_file, *bin_file, *img_file;
  393.  
  394. if ( argc < 4 ) {
  395. printf( "Not enough parameters.\n" );
  396. exit( 1 );
  397. }
  398.  
  399. txt_file = argv[ 1 ];
  400. bin_file = argv[ 2 ];
  401. img_file = argv[ 3 ];
  402.  
  403. process_lidar( txt_file, bin_file, img_file );
  404.  
  405. return 0;
  406. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement