utils.c
上传用户:lwxipeng
上传日期:2022-05-16
资源大小:15982k
文件大小:7k
源码类别:

视频捕捉/采集

开发平台:

Visual C++

  1. /*
  2. Miscellaneous utility functions.
  3. Copyright (C) 2006  Rob Hess <hess@eecs.oregonstate.edu>
  4. @version 1.1.1-20070330
  5. */
  6. #include "utils.h"
  7. #include <cv.h>
  8. #include <cxcore.h>
  9. #include <highgui.h>
  10. #include <errno.h>
  11. #include <string.h>
  12. #include <stdlib.h>
  13. /*************************** Function Definitions ****************************/
  14. /*
  15. Prints an error message and aborts the program.  The error message is
  16. of the form "Error: ...", where the ... is specified by the a format
  17. argument
  18. @param format an error message format string (as with c printf(3)).
  19. */
  20. void fatal_error(char* format, ...)
  21. {
  22. va_list ap;
  23. fprintf( stderr, "Error: ");
  24. va_start( ap, format );
  25. vfprintf( stderr, format, ap );
  26. va_end( ap );
  27. fprintf( stderr, "n" );
  28. abort();
  29. }
  30. /*
  31. Replaces a file's extension, which is assumed to be everything after the
  32. last dot ('.') character.
  33. @param file the name of a file
  34. @param extn a new extension for a file; should not include a dot (i.e.
  35. c "jpg", not c ".jpg") unless the new file extension should contain
  36. two dots.
  37. @return Returns a new string formed as described above.  If a file does
  38. not have an extension, this function simply adds one.
  39. */
  40. char* replace_extension( const char* file, const char* extn )
  41. {
  42. char* new_file, * lastdot;
  43. new_file = calloc( strlen( file ) + strlen( extn ) + 2,  sizeof( char ) );
  44. strcpy( new_file, file );
  45. lastdot = strrchr( new_file, '.' );
  46. if( lastdot )
  47. *(lastdot + 1) = '';
  48. else
  49. strcat( new_file, "." );
  50. strcat( new_file, extn );
  51. return new_file;
  52. }
  53. /*
  54. A function that removes the path from a filename.  Similar to the Unix
  55. basename command.
  56. @param pathname a (full) path name
  57. @return Returns the basename of a pathname.
  58. */
  59. char* basename( const char* pathname )
  60. {
  61. char* base, * last_slash;
  62. last_slash = strrchr( pathname, '/' );
  63. if( ! last_slash )
  64. {
  65. base = calloc( strlen( pathname ) + 1, sizeof( char ) );
  66. strcpy( base, pathname );
  67. }
  68. else
  69. {
  70. base = calloc( strlen( last_slash++ ), sizeof( char ) );
  71. strcpy( base, last_slash );
  72. }
  73. return base;
  74. }
  75. /*
  76. Displays progress in the console with a spinning pinwheel.  Every time this
  77. function is called, the state of the pinwheel is incremented.  The pinwheel
  78. has four states that loop indefinitely: '|', '/', '-', ''.
  79. @param done if 0, this function simply increments the state of the pinwheel;
  80. otherwise it prints "done"
  81. */
  82. void progress( int done )
  83. {
  84. char state[4] = { '|', '/', '-', '\' };
  85. static int cur = -1;
  86. if( cur == -1 )
  87. fprintf( stderr, "  " );
  88. if( done )
  89. {
  90. fprintf( stderr, "bbdonen");
  91. cur = -1;
  92. }
  93. else
  94. {
  95. cur = ( cur + 1 ) % 4;
  96. fprintf( stdout, "bb%c ", state[cur] );
  97. fflush(stderr);
  98. }
  99. }
  100. /*
  101. Erases a specified number of characters from a stream.
  102. @param stream the stream from which to erase characters
  103. @param n the number of characters to erase
  104. */
  105. void erase_from_stream( FILE* stream, int n )
  106. {
  107. int j;
  108. for( j = 0; j < n; j++ )
  109. fprintf( stream, "b" );
  110. for( j = 0; j < n; j++ )
  111. fprintf( stream, " " );
  112. for( j = 0; j < n; j++ )
  113. fprintf( stream, "b" );
  114. }
  115. /*
  116. Doubles the size of an array with error checking
  117. @param array pointer to an array whose size is to be doubled
  118. @param n number of elements allocated for a array
  119. @param size size in bytes of elements in a array
  120. @return Returns the new number of elements allocated for a array.  If no
  121. memory is available, returns 0 and frees array.
  122. */
  123. int array_double( void** array, int n, int size )
  124. {
  125. void* tmp;
  126. tmp = realloc( *array, 2 * n * size );
  127. if( ! tmp )
  128. {
  129. fprintf( stderr, "Warning: unable to allocate memory in array_double(),"
  130. " %s line %dn", __FILE__, __LINE__ );
  131. if( *array )
  132. free( *array );
  133. *array = NULL;
  134. return 0;
  135. }
  136. *array = tmp;
  137. return n*2;
  138. }
  139. /*
  140. Calculates the squared distance between two points.
  141. @param p1 a point
  142. @param p2 another point
  143. */
  144. double dist_sq_2D( CvPoint2D64f p1, CvPoint2D64f p2 )
  145. {
  146. double x_diff = p1.x - p2.x;
  147. double y_diff = p1.y - p2.y;
  148. return x_diff * x_diff + y_diff * y_diff;
  149. }
  150. /*
  151. Draws an x on an image.
  152. @param img an image
  153. @param pt the center point of the x
  154. @param r the x's radius
  155. @param w the x's line weight
  156. @param color the color of the x
  157. */
  158. void draw_x( IplImage* img, CvPoint pt, int r, int w, CvScalar color )
  159. {
  160. cvLine( img, pt, cvPoint( pt.x + r, pt.y + r), color, w, 8, 0 );
  161. cvLine( img, pt, cvPoint( pt.x - r, pt.y + r), color, w, 8, 0 );
  162. cvLine( img, pt, cvPoint( pt.x + r, pt.y - r), color, w, 8, 0 );
  163. cvLine( img, pt, cvPoint( pt.x - r, pt.y - r), color, w, 8, 0 );
  164. }
  165. /*
  166. Combines two images by scacking one on top of the other
  167. @param img1 top image
  168. @param img2 bottom image
  169. @return Returns the image resulting from stacking a img1 on top if a img2
  170. */
  171. extern IplImage* stack_imgs( IplImage* img1, IplImage* img2 )
  172. {
  173. IplImage* stacked = cvCreateImage( cvSize( img1->width + img2->width + 20,
  174. MAX(img1->height , img2->height) ),
  175. IPL_DEPTH_8U, 3 );
  176. cvZero( stacked );
  177. cvSetImageROI( stacked, cvRect( 0, 0, img1->width, img1->height ) );
  178. cvAdd( img1, stacked, stacked, NULL );
  179. cvSetImageROI( stacked, cvRect(img1->width + 20, 0, img2->width, img2->height) );
  180. cvAdd( img2, stacked, stacked, NULL );
  181. cvResetImageROI( stacked );
  182. return stacked;
  183. }
  184. /*
  185. Allows user to view an array of images as a video.  Keyboard controls
  186. are as follows:
  187. <ul>
  188. <li>Space - start and pause playback</li>
  189. <li>Page Down - skip forward 10 frames</li>
  190. <li>Page Up - jump back 10 frames</li>
  191. <li>Right Arrow - skip forward 1 frame</li>
  192. <li>Left Arrow - jump back 1 frame</li>
  193. <li>Backspace - jump back to beginning</li>
  194. <li>Esc - exit playback</li>
  195. <li>Closing the window also exits playback</li>
  196. </ul>
  197. @param imgs an array of images
  198. @param n number of images in a imgs
  199. @param win_name name of window in which images are displayed
  200. */
  201. void vid_view( IplImage** imgs, int n, char* win_name )
  202. {
  203. int k, i = 0, playing = 0;
  204. cvNamedWindow( win_name, 1 );
  205. cvShowImage( win_name, imgs[i] );
  206. while( ! win_closed( win_name ) )
  207. {
  208. /* if already playing, advance frame and check for pause */
  209. if( playing )
  210. {
  211. i = MIN( i + 1, n - 1 );
  212. cvNamedWindow( win_name, 1 );
  213. cvShowImage( win_name, imgs[i] );
  214. k = cvWaitKey( 33 );
  215. if( k == ' '  ||  i == n - 1 )
  216. playing = 0;
  217. }
  218. else
  219. {
  220. k = cvWaitKey( 0 );
  221. switch( k )
  222. {
  223. /* space */
  224. case ' ':
  225. playing = 1;
  226. break;
  227. /* esc */
  228. case 27:
  229. case 1048603:
  230. cvDestroyWindow( win_name );
  231. break;
  232. /* backspace */
  233. case 'b':
  234. i = 0;
  235. cvNamedWindow( win_name, 1 );
  236. cvShowImage( win_name, imgs[i] );
  237. break;
  238. /* left arrow */
  239. case 65288:
  240. case 1113937:
  241. i = MAX( i - 1, 0 );
  242. cvNamedWindow( win_name, 1 );
  243. cvShowImage( win_name, imgs[i] );
  244. break;
  245. /* right arrow */
  246. case 65363:
  247. case 1113939:
  248. i = MIN( i + 1, n - 1 );
  249. cvNamedWindow( win_name, 1 );
  250. cvShowImage( win_name, imgs[i] );
  251. break;
  252. /* page up */
  253. case 65365:
  254. case 1113941:
  255. i = MAX( i - 10, 0 );
  256. cvNamedWindow( win_name, 1 );
  257. cvShowImage( win_name, imgs[i] );
  258. break;
  259. /* page down */
  260. case 65366:
  261. case 1113942:
  262. i = MIN( i + 10, n - 1 );
  263. cvNamedWindow( win_name, 1 );
  264. cvShowImage( win_name, imgs[i] );
  265. break;
  266. }
  267. }
  268. }
  269. }
  270. /*
  271. Checks if a HighGUI window is still open or not
  272. @param name the name of the window we're checking
  273. @return Returns 1 if the window named a name has been closed or 0 otherwise
  274. */
  275. int win_closed( char* win_name )
  276. {
  277. if( ! cvGetWindowHandle(win_name) )
  278. return 1;
  279. return 0;
  280. }