-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
42c1635
commit 20e17bc
Showing
16 changed files
with
1,491 additions
and
2 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,159 @@ | ||
/* | ||
CG 2018/1 | ||
Autores: | ||
Felipe Pfeifer Rubin: Email: felipe.rubin@acad.pucrs.br | ||
Ian Aragon Escobar: Mat , Email: ian.escobar@acad.pucrs.br | ||
*/ | ||
|
||
/* | ||
Arquivo: video.h | ||
- Header da biblioteca de manipulacao de dados do video | ||
*/ | ||
|
||
#ifndef VIDEO_H | ||
#define VIDEO_H | ||
#endif | ||
#include "vmath.h" | ||
#include <math.h> | ||
|
||
// Estrutura que armazena informacoes de uma pessoa | ||
typedef struct{ | ||
int valid; //Deveria existir neste frame ? | ||
Point point; // ponto (x,y) | ||
float speed; // Velocidade da pessoa do frame anterior p/ agora | ||
Point displacement; // Deslocamento da Pessoa D = P1 - P0 | ||
}Person; | ||
|
||
//Estrutura que armazena informacoes de um grupo | ||
typedef struct Group{ | ||
int *presence; //Quanto tempo que a Pessoa[x] esta no grupo, 0 = nao esta; malloc length | ||
int bornAt; //Quando que comeca o Grupo | ||
int deathAt; // Quando que termina o Grupo | ||
int size; //Quantas pessoas tem no grupo agora | ||
int length; //Quantas pessoas tem no video ao todo, ou seja, qts posicoes em presence[] | ||
float color[3]; //Cor do grupo | ||
|
||
int *enteredAt; //Primeira vez q a pessoa entrou no grupo | ||
int *exitedAt; //Ultima vez q a pessoa estava presente no grupo | ||
|
||
struct Group *next; | ||
struct Group *prev; | ||
}Group; | ||
|
||
//lista duplamente encadeada de grupos | ||
typedef struct{ | ||
int size; | ||
Group *head; | ||
Group *tail; | ||
}GList; | ||
|
||
// Informacoes da pessoa no frame atual | ||
typedef struct{ | ||
Person *person; | ||
}Frame; | ||
|
||
typedef struct{ | ||
int pxm; // Pixel x Metro | ||
int length; //Numero de frames total | ||
int begin; //Primeiro frame em que alguem aparece | ||
Frame *frames; //Lista de frames (vetor alocado dinamicamente) | ||
Point minpoint; // Armazena os MENORES X e Y | ||
Point maxpoint; // Armazena os MAIORES X e Y | ||
int people; //Numero de pessoas | ||
int *personBegin; //primeira aparicao de cada pessoa | ||
int *personEnd; // ultima aparicao de cada pessoa | ||
}VideoInfo; | ||
|
||
/* | ||
Imprime os grupos | ||
*/ | ||
void printGroups(GList *list); | ||
|
||
/* | ||
Verifica se a Pessoa P e a Pessoa Q sao um grupo | ||
*/ | ||
int ispp(int p, int q, VideoInfo *vi); | ||
|
||
/* | ||
Pega o grupo da posicao pos dessa lista | ||
*/ | ||
Group* getGroup(GList *list, int pos); | ||
|
||
/* | ||
Verifica se small e big devem se unir | ||
*/ | ||
int subsetof(Group *big, Group *small); | ||
|
||
/* | ||
Merge nos grupos com mesmas pessoas | ||
*/ | ||
void subsetGroups(GList *list); | ||
|
||
/* | ||
Atualiza as informacoes de um grupo | ||
*/ | ||
void updateGroup(Group *group); | ||
|
||
/* | ||
Atualiza as informacoes de todos os grupos | ||
*/ | ||
void updateGroups(GList *list); | ||
|
||
/* | ||
Insere um grupo na lista de grupos | ||
*/ | ||
void insertGroup(GList *list,Group *newgroup); | ||
/* | ||
Cria um grupo e depois insere ele na lista de grupos | ||
*/ | ||
void addGroup(GList *list, int p, int q, int length); | ||
|
||
/* | ||
Adiciona uma pessoa a um grupo | ||
*/ | ||
void addToGroup(Group *group, int p); | ||
/* | ||
Remove uma pessoa de um grupo | ||
*/ | ||
void removeFromGroup(Group *group, int p); | ||
|
||
/* | ||
Adiciona todas as pessoas do grupo small no grupo big | ||
*/ | ||
void addGroups(Group *big, Group *small); | ||
/* | ||
Free na struct de VideoInfo | ||
*/ | ||
void freeVideoInfo(VideoInfo *vi); | ||
/* | ||
Aloca a memoria necessaria p/ struct VideoInfo | ||
*/ | ||
void allocateVideoInfo(VideoInfo *vi); | ||
|
||
/* | ||
Free na lista de grupos | ||
*/ | ||
void freeGList(GList *list); | ||
|
||
/* | ||
Elimina todos os grupos vazios da lista de grupos | ||
*/ | ||
void removeEmptyGroups(GList *list); | ||
/* | ||
Verifica, para cada pessoa quando entrou e quando saiu do grupo | ||
*/ | ||
void inoutGroup(int p, Group *g,VideoInfo *vi, int *firstin, int *lastin); | ||
|
||
/* | ||
Utilizar antes de readFileData(), | ||
Le as informacoes iniciais do arquivo para alocar espaco suficiente | ||
para inserir todas as informacoes de cada pessoa | ||
*/ | ||
void readFileInfo(VideoInfo *vi,const char *filename); | ||
|
||
/* | ||
Utilizar depois de readFileInfo(), | ||
Le todo o arquivo e insere todos os dados nas respectivas structs de VideoInfo | ||
*/ | ||
void readFileData(VideoInfo *vi,const char *filename); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
/* | ||
CG 2018/1 | ||
Autores: | ||
Felipe Pfeifer Rubin: Email: felipe.rubin@acad.pucrs.br | ||
Ian Aragon Escobar: Mat , Email: ian.escobar@acad.pucrs.br | ||
*/ | ||
|
||
/* | ||
Arquivo: vmath.cpp | ||
- Codigo da bilioteca de Funcoes Matematicas | ||
*/ | ||
|
||
#include <stdlib.h> | ||
#include "vmath.h" | ||
#include <math.h> | ||
#include <stdio.h> | ||
|
||
//De: https://stackoverflow.com/questions/9912151/math-constant-pi-value-in-c | ||
//User: Martin ... | ||
#ifndef V_PI | ||
#define V_PI acos(-1.0) | ||
#endif | ||
|
||
#ifndef V_RADANGLE | ||
#define V_RADANGLE 180.0/acos(-1.0) | ||
#endif | ||
|
||
|
||
/* | ||
Distancia entre Pontos P(x,y) e Q(x0,y0) | ||
*/ | ||
|
||
float distance(Point p, Point q) | ||
{ | ||
float dx = fabsf(p.x - q.x); | ||
float dy = fabsf(p.y - q.y); | ||
return sqrtf(dx*dx + dy*dy); | ||
} | ||
|
||
/* | ||
Modulo do Vetor |a| | ||
*/ | ||
float magnitude(Point p) | ||
{ | ||
return sqrtf(p.x*p.x + p.y*p.y); | ||
} | ||
|
||
/* | ||
Vetor Unitario | ||
*/ | ||
Point unitvector(Point p) | ||
{ | ||
float mag = magnitude(p); | ||
if(mag == 0){ | ||
Point unit = {.x = 0.0, .y = 0.0}; | ||
return unit; | ||
} | ||
Point unit = {.x = p.x/mag, .y = p.y/mag}; | ||
return unit; | ||
} | ||
|
||
|
||
/* | ||
A diferenca entre dois Pontos eh um vetor | ||
Deslocamento (Displacement) | ||
P ---> Q | ||
*/ | ||
Point displacement(Point p, Point q) | ||
{ | ||
Point v = {.x = q.x - p.x, .y = q.y - p.y}; | ||
|
||
return v; | ||
} | ||
|
||
/* | ||
Cosseno do Angulo entre 2 Vetores | ||
Cos O = unitario(p) * unitario(q) | ||
Cos O = [-1;1] | ||
*/ | ||
float cosvector(Point p, Point q) | ||
{ | ||
|
||
Point unitp = unitvector(p); | ||
|
||
Point unitq = unitvector(q); | ||
|
||
float a = unitp.x*unitq.x + unitp.y*unitq.y; | ||
if (a > 1.0 && a < 1.1) | ||
a = 1.0f; | ||
if (a < -1.0 && a > -1.1) | ||
a = -1.0f; | ||
|
||
if (a > 1 || a < -1){ | ||
printf("cosvector() Isso n deveria ocorrer\n"); | ||
printf("Exit_FAILURE cosvector() \n"); | ||
exit(EXIT_FAILURE); | ||
} | ||
|
||
return a; | ||
} | ||
|
||
/* | ||
Angulo entre 2 dois vetores | ||
*/ | ||
float angle(Point p, Point q) | ||
{ | ||
float res = acos(cosvector(p,q)) * V_RADANGLE; | ||
return res; | ||
} | ||
|
||
/* | ||
Retorna um float pseudo-random entre [a,b] | ||
Como nao eh chamada srand(), ele ira devolver sempre a mesma sequencia de valores pseudo-random | ||
*/ | ||
float get_random(float a, float b) | ||
{ | ||
return ((b - a) * ((float)rand() / RAND_MAX)) + a; | ||
} | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
/* | ||
CG 2018/1 | ||
Autores: | ||
Felipe Pfeifer Rubin: Email: felipe.rubin@acad.pucrs.br | ||
Ian Aragon Escobar: Mat , Email: ian.escobar@acad.pucrs.br | ||
*/ | ||
|
||
/* | ||
Arquivo: vmath.h | ||
- Header da bilioteca de Funcoes Matematicas | ||
*/ | ||
|
||
#ifndef VMATH_H | ||
#define VMATH_H | ||
#endif | ||
|
||
typedef struct{ | ||
float x; | ||
float y; | ||
}Point; | ||
|
||
/* | ||
Distancia entre Pontos P(x,y) e Q(x0,y0) | ||
*/ | ||
float distance(Point p, Point q); | ||
/* | ||
Modulo do Vetor |a| | ||
*/ | ||
float magnitude(Point p); | ||
/* | ||
Vetor Unitario | ||
*/ | ||
Point unitvector(Point p); | ||
/* | ||
A diferenca entre dois Pontos eh um vetor | ||
Deslocamento (Displacement) | ||
P ---> Q | ||
*/ | ||
Point displacement(Point p, Point q); | ||
/* | ||
Cosseno do Angulo entre 2 Vetores | ||
Cos O = unitario(p) * unitario(q) | ||
Cos O = [-1;1] | ||
*/ | ||
float cosvector(Point p, Point q); | ||
|
||
/* | ||
Angulo entre 2 dois vetores | ||
Eh o cosvector transformado em angulos | ||
*/ | ||
float angle(Point p, Point q); | ||
/* | ||
Retorna um float pseudo-random entre [a,b] | ||
Como nao eh chamada srand(), ele ira devolver normalmente a mesma sequencia de valores pseudo-random | ||
*/ | ||
float get_random(float a, float b); | ||
|
||
|
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,30 @@ | ||
# GroupRecognition | ||
Group Recognition using OpenGL and Dataset | ||
# Authors: | ||
- Felipe Pfeifer Rubin | ||
- Ian Aragon Escobar | ||
|
||
|
||
# Files: | ||
- 4 testcases, each txt file relates to one mp4 video | ||
- Relatorio.pdf: Describes the work in Portuguese(BR) | ||
|
||
# Compile: | ||
- At main.cpp, change the first lines from main() which points to the files .txt | ||
- If you want easily just change to vc[n].filename = argv[n]; | ||
- Requires OpenGL (probably >= 2.0) | ||
- gcc main.cpp vmath.cpp video.cpp -o main | ||
- Also if not in IDE (e.g. XCode) add -l<library> | ||
|
||
# Run: | ||
./main | ||
|
||
# Problems: | ||
* 2 Lines: | ||
* 205: glEnable(GL_PROGRAM_POINT_SIZE_EXT); | ||
* 206: glPointSize(5); | ||
- Comment them (On MacOS HighSierra they work). | ||
|
||
# Problems ? | ||
- felipe.rubin@acad.pucrs.br | ||
|
||
|
||
|
Binary file not shown.
Large diffs are not rendered by default.
Oops, something went wrong.
Binary file not shown.
Oops, something went wrong.