123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- // #ifdef __cplusplus
- // extern "C" {
- // #endif
- //===============================================================================================================================================================================================================
- // DEFINE / INCLUDE
- //===============================================================================================================================================================================================================
- #include "avimod.h"
- //===============================================================================================================================================================================================================
- // FUNCTIONS
- //===============================================================================================================================================================================================================
- // Flips the specified image and crops it to the specified dimensions
- // If scaled == true, all values are scaled to the range [0.0, 1.0
- fp* chop_flip_image( char *image,
- int height,
- int width,
- int cropped,
- int scaled,
- int converted) {
- // fixed dimensions for cropping or not cropping, square vertices starting from initial point in top left corner going down and right
- int top;
- int bottom;
- int left;
- int right;
- if(cropped==1){
- top = 0;
- bottom = 0;
- left = 0;
- right = 0;
- }
- else{
- top = 0;
- bottom = height - 1;
- left = 0;
- right = width - 1;
- }
- // dimensions of new cropped image
- int height_new = bottom - top + 1;
- int width_new = right - left + 1;
- // counters
- int i, j;
- // allocate memory for cropped/flipped frame
- fp* result = (fp *) malloc(height_new * width_new * sizeof(fp));
- // crop/flip and scale frame
- fp temp;
- if (scaled) {
- fp scale = 1.0 / 255.0;
- for(i = 0; i <height_new; i++){ // rows
- for(j = 0; j <width_new; j++){ // colums
- temp = (fp) image[((height - 1 - (i + top)) * width) + (j + left)] * scale;
- if(temp<0){
- result[i*width_new+j] = temp + 256;
- }
- else{
- result[i*width_new+j] = temp;
- }
- }
- }
- } else {
- for(i = 0; i <height_new; i++){ // rows
- for(j = 0; j <width_new; j++){ // colums
- temp = (fp) image[((height - 1 - (i + top)) * width) + (j + left)] ;
- if(temp<0){
- result[i*width_new+j] = temp + 256;
- }
- else{
- result[i*width_new+j] = temp;
- }
- }
- }
- }
- // convert storage method (from row-major to column-major)
- fp* result_converted = (fp *) malloc(height_new * width_new * sizeof(fp));
- if(converted==1){
- for(i = 0; i <width_new; i++){ // rows
- for(j = 0; j <height_new; j++){ // colums
- result_converted[i*height_new+j] = result[j*width_new+i];
- }
- }
- }
- else{
- result_converted = result;
- }
- free(result);
- // return
- return result_converted;
- }
- // Returns the specified frame from the specified video file
- // If cropped == true, the frame is cropped to pre-determined dimensions
- // (hardcoded to the boundaries of the blood vessel in the test video)
- // If scaled == true, all values are scaled to the range [0.0, 1.0]
- fp* get_frame( avi_t* cell_file,
- int frame_num,
- int cropped,
- int scaled,
- int converted) {
- // variable
- int dummy;
- int width = AVI_video_width(cell_file);
- int height = AVI_video_height(cell_file);
- int status;
- // There are 600 frames in this file (i.e. frame_num = 600 causes an error)
- AVI_set_video_position(cell_file, frame_num);
- //Read in the frame from the AVI
- char* image_buf = (char*) malloc(width * height * sizeof(char));
- status = AVI_read_frame(cell_file, image_buf, &dummy);
- if(status == -1) {
- AVI_print_error((char*) "Error with AVI_read_frame");
- exit(-1);
- }
- // The image is read in upside-down, so we need to flip it
- fp* image_chopped;
- image_chopped = chop_flip_image( image_buf,
- height,
- width,
- cropped,
- scaled,
- converted);
- // free image buffer
- free(image_buf);
- // return
- return image_chopped;
- }
- // #ifdef __cplusplus
- // }
- // #endif
|