CuPBoP/examples/heartwall/AVI/avimod.c

131 lines
4.1 KiB
C
Raw Normal View History

2022-05-04 20:59:38 +08:00
// #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