Skip to content

Commit

Permalink
Adding all files
Browse files Browse the repository at this point in the history
  • Loading branch information
feliperubin committed Apr 27, 2018
1 parent 42c1635 commit 20e17bc
Show file tree
Hide file tree
Showing 16 changed files with 1,491 additions and 2 deletions.
441 changes: 441 additions & 0 deletions Code/main.cpp

Large diffs are not rendered by default.

606 changes: 606 additions & 0 deletions Code/video.cpp

Large diffs are not rendered by default.

159 changes: 159 additions & 0 deletions Code/video.h
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);

126 changes: 126 additions & 0 deletions Code/vmath.cpp
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;
}








58 changes: 58 additions & 0 deletions Code/vmath.h
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 added Docs/Relatorio.pdf
Binary file not shown.
Binary file added Entrega.zip
Binary file not shown.
32 changes: 30 additions & 2 deletions README.md
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 added Testcases/Austria01.mp4
Binary file not shown.
13 changes: 13 additions & 0 deletions Testcases/Austria01.txt

Large diffs are not rendered by default.

Binary file added Testcases/Brazil06.mp4
Binary file not shown.
Loading

0 comments on commit 20e17bc

Please sign in to comment.