131 lines
4.1 KiB
C
131 lines
4.1 KiB
C
|
// #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
|