#include #include "pgmmovielib.h" void load_movie_images(int num); void extract_bg(int num); void retrieve_object(int num); void draw_line(int n, int x1, int y1, int x2, int y2, int col); void calcCoG(int n, int* cog_x, int* cog_y); void draw_trajectory(int num); int main(void) { char filename[100] = ""; int Num = 14; load_movie_images(Num); extract_bg(Num); save_image(Num, filename); /* int Num = 14; //背景画像の読みこみ char filename[100] = "bg.pgm"; load_image(Num,filename); //連続画像の読み込み load_movie_images(Num); //オブジェクトの抽出 retrieve_object(Num); draw_trajectory(Num); */ } void load_movie_images(int num) { int i; char img_num[15]; for (i = 0; i < num; i++) { sprintf(img_num, "%d", i); load_image(i, strcat(img_num, ".pgm")); } } void draw_line(int n, int x1, int y1, int x2, int y2, int col) { double a, b; int y, x; int x_start, x_end; a = (double)(y2 - y1) / (x2 - x1); b = (double)(((y1 + y2) - a * (x1 + x2))) / 2.0; if (x1 < x2) { x_start = x1; x_end = x2; } if (x1 > x2) { x_start = x2; x_end = x1; } for (x = x_start; x < x_end; x++) { y = (int)(a * x + b); image[n][x][y] = col; } } void calcCoG(int n, int* cog_x, int* cog_y) { int x, y, sum; *cog_x = 0; *cog_y = 0; sum = 0; for (y = 0; y < height[n]; y++) { for (x = 0; x < width[n]; x++) { *cog_x += image[n][x][y] * x; *cog_y += image[n][x][y] * y; sum += image[n][x][y]; } } *cog_x /= sum; *cog_y /= sum; } void retrieve_object(int num) { int i; char img_num[15]; int x, y; for (i = 0; i < num; i++) { for (y = 0; y < height[0]; y++) { for (x = 0; x < width[0]; x++) { image[i][x][y] = image[i][x][y] - image[num][x][y]; } } sprintf(img_num, "%d", i); save_image(i, strcat(img_num, "-out.pgm")); } } void draw_trajectory(int num) { char filename[100] = "trajectory.pgm"; int i; int cog_x, cog_y; int sx, sy; calcCoG(0, &cog_x, &cog_y); sx = cog_x; sy = cog_y; for (i = 1; i < num; i++) { calcCoG(i, &cog_x, &cog_y); draw_line(num, sx, sy, cog_x, cog_y, 0); sx = cog_x; sy = cog_y; printf("%d,%d¥n", sx, sy); } save_image(num, filename); } void extract_bg(int num) { int i; int x, y; int tmp_buf[100][100]; width[num] = width[0]; //背景画像をnum番目に格納 height[num] = height[0]; for (y = 0; y < height[0]; y++) { for (x = 0; x < width[0]; x++) { tmp_buf[x][y] = 0; //初期化 } } for (i = 0; i < num; i++) { for (y = 0; y < height[0]; y++) { for (x = 0; x < width[0]; x++) { tmp_buf[x][y] += (int)image[i][x][y] / num; } } } for (y = 0; y < height[0]; y++) { for (x = 0; x < width[0]; x++) { image[num][x][y] = tmp_buf[x][y]; } } }