Merge branch 'master' of github.com:worklist/hifi

This commit is contained in:
Philip Rosedale 2013-02-07 20:09:29 -08:00
commit 58e96f0ab8
312 changed files with 532 additions and 4523 deletions

10
.gitignore vendored
View file

@ -1,3 +1,13 @@
# CMake
CMakeCache.txt
CMakeFiles/
CMakeScripts/
cmake_install.cmake
build/
# Xcode
*.xcodeproj
*.xcworkspace
.DS_Store
xcuserdata
*.pbxuser

11
CMakeLists.txt Normal file
View file

@ -0,0 +1,11 @@
cmake_minimum_required(VERSION 2.8)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")
project(hifi)
set(GLM_ROOT_DIR ${CMAKE_SOURCE_DIR}/thirdparty)
set(PORTAUDIO_ROOT_DIR ${CMAKE_SOURCE_DIR}/thirdparty/Portaudio)
set(LODEPNG_ROOT_DIR ${CMAKE_SOURCE_DIR}/thirdparty/LodePNG)
add_subdirectory(interface)
add_subdirectory(mixer)

View file

@ -1 +0,0 @@
Versions/A/CVBlob

View file

@ -1 +0,0 @@
Versions/A/Headers/

View file

@ -1,99 +0,0 @@
#ifndef BLOBCONTOUR_H_INCLUDED
#define BLOBCONTOUR_H_INCLUDED
#include "list"
#include <opencv/cv.h>
//#include "cxtypes.h" //AO
#include <opencv/cxcore.h> //
//! Type of chain codes
typedef unsigned char t_chainCode;
//! Type of list of chain codes
typedef CvSeq* t_chainCodeList;
//! Type of list of points
typedef CvSeq* t_PointList;
//! Max order of calculated moments
#define MAX_MOMENTS_ORDER 3
//! Blob contour class (in crack code)
class CBlobContour
{
friend class CBlob;
friend class CBlobProperties; //AO
public:
//! Constructors
CBlobContour();
CBlobContour(CvPoint startPoint, CvMemStorage *storage );
//! Copy constructor
CBlobContour( CBlobContour *source );
~CBlobContour();
//! Assigment operator
CBlobContour& operator=( const CBlobContour &source );
//! Add chain code to contour
void AddChainCode(t_chainCode code);
//! Return freeman chain coded contour
t_chainCodeList GetChainCode()
{
return m_contour;
}
bool IsEmpty()
{
return m_contour == NULL || m_contour->total == 0;
}
//! Return all contour points
t_chainCodeList GetContourPoints();
protected:
CvPoint GetStartPoint() const
{
return m_startPoint;
}
//! Clears chain code contour
void ResetChainCode();
//! Computes area from contour
double GetArea();
//! Computes perimeter from contour
double GetPerimeter();
//! Get contour moment (p,q up to MAX_CALCULATED_MOMENTS)
double GetMoment(int p, int q);
//! Crack code list
t_chainCodeList m_contour;
private:
//! Starting point of the contour
CvPoint m_startPoint;
//! All points from the contour
t_PointList m_contourPoints;
//! Computed area from contour
double m_area;
//! Computed perimeter from contour
double m_perimeter;
//! Computed moments from contour
CvMoments m_moments;
//! Pointer to storage
CvMemStorage *m_parentStorage;
};
#endif //!BLOBCONTOUR_H_INCLUDED

View file

@ -1,22 +0,0 @@
/************************************************************************
BlobLibraryConfiguration.h
FUNCIONALITAT: Configuració del comportament global de la llibreria
AUTOR: Inspecta S.L.
MODIFICACIONS (Modificació, Autor, Data):
FUNCTIONALITY: Global configuration of the library
AUTHOR: Inspecta S.L.
MODIFICATIONS (Modification, Author, Date):
**************************************************************************/
//! Indica si es volen fer servir les MatrixCV o no
//! Use/Not use the MatrixCV class
//#define MATRIXCV_ACTIU
//! Uses/not use the blob object factory
//#define BLOB_OBJECT_FACTORY
//! Show/not show blob access errors
//#define _SHOW_ERRORS //AO: Only works for WIN.

View file

@ -1,754 +0,0 @@
#ifndef BLOB_OPERATORS_H_INCLUDED
#define BLOB_OPERATORS_H_INCLUDED
#include "blob.h"
/**************************************************************************
Definició de les classes per a fer operacions sobre els blobs
Helper classes to perform operations on blobs
**************************************************************************/
//! Factor de conversió de graus a radians
#define DEGREE2RAD (CV_PI / 180.0)
//! Classe d'on derivarem totes les operacions sobre els blobs
//! Interface to derive all blob operations
class COperadorBlob
{
public:
virtual ~COperadorBlob(){};
//! Aply operator to blob
virtual double operator()(CBlob &blob) = 0;
//! Get operator name
virtual const char *GetNom() = 0;
operator COperadorBlob*()
{
return (COperadorBlob*)this;
}
};
typedef COperadorBlob funcio_calculBlob;
#ifdef BLOB_OBJECT_FACTORY
/**
Funció per comparar dos identificadors dins de la fàbrica de COperadorBlobs
*/
struct functorComparacioIdOperador
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) < 0;
}
};
//! Definition of Object factory type for COperadorBlob objects
typedef ObjectFactory<COperadorBlob, const char *, functorComparacioIdOperador > t_OperadorBlobFactory;
//! Funció global per a registrar tots els operadors definits a blob.h
void RegistraTotsOperadors( t_OperadorBlobFactory &fabricaOperadorsBlob );
#endif
//! Classe per calcular l'etiqueta d'un blob
//! Class to get ID of a blob
class CBlobGetID : public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
return blob.GetID();
}
const char *GetNom()
{
return "CBlobGetID";
}
};
//! Classe per calcular l'àrea d'un blob
//! Class to get the area of a blob
class CBlobGetArea : public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
return blob.Area();
}
const char *GetNom()
{
return "CBlobGetArea";
}
};
//! Classe per calcular el perimetre d'un blob
//! Class to get the perimeter of a blob
class CBlobGetPerimeter: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
return blob.Perimeter();
}
const char *GetNom()
{
return "CBlobGetPerimeter";
}
};
//! Classe que diu si un blob és extern o no
//! Class to get the extern flag of a blob
class CBlobGetExterior: public COperadorBlob
{
public:
CBlobGetExterior()
{
m_mask = NULL;
m_xBorder = false;
m_yBorder = false;
}
CBlobGetExterior(IplImage *mask, bool xBorder = true, bool yBorder = true)
{
m_mask = mask;
m_xBorder = xBorder;
m_yBorder = yBorder;
}
double operator()(CBlob &blob)
{
return blob.Exterior(m_mask, m_xBorder, m_yBorder);
}
const char *GetNom()
{
return "CBlobGetExterior";
}
private:
IplImage *m_mask;
bool m_xBorder, m_yBorder;
};
//! Classe per calcular la mitjana de nivells de gris d'un blob
//! Class to get the mean grey level of a blob
class CBlobGetMean: public COperadorBlob
{
public:
CBlobGetMean()
{
m_image = NULL;
}
CBlobGetMean( IplImage *image )
{
m_image = image;
};
double operator()(CBlob &blob)
{
return blob.Mean(m_image);
}
const char *GetNom()
{
return "CBlobGetMean";
}
private:
IplImage *m_image;
};
//! Classe per calcular la desviació estàndard dels nivells de gris d'un blob
//! Class to get the standard deviation of the grey level values of a blob
class CBlobGetStdDev: public COperadorBlob
{
public:
CBlobGetStdDev()
{
m_image = NULL;
}
CBlobGetStdDev( IplImage *image )
{
m_image = image;
};
double operator()(CBlob &blob)
{
return blob.StdDev(m_image);
}
const char *GetNom()
{
return "CBlobGetStdDev";
}
private:
IplImage *m_image;
};
//! Classe per calcular la compacitat d'un blob
//! Class to calculate the compactness of a blob
class CBlobGetCompactness: public COperadorBlob
{
public:
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetCompactness";
}
};
//! Classe per calcular la longitud d'un blob
//! Class to calculate the length of a blob
class CBlobGetLength: public COperadorBlob
{
public:
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetLength";
}
};
//! Classe per calcular l'amplada d'un blob
//! Class to calculate the breadth of a blob
class CBlobGetBreadth: public COperadorBlob
{
public:
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetBreadth";
}
};
//! Classe per calcular la diferència en X del blob
class CBlobGetDiffX: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
return blob.GetBoundingBox().width;
}
const char *GetNom()
{
return "CBlobGetDiffX";
}
};
//! Classe per calcular la diferència en X del blob
class CBlobGetDiffY: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
return blob.GetBoundingBox().height;
}
const char *GetNom()
{
return "CBlobGetDiffY";
}
};
//! Classe per calcular el moment PQ del blob
//! Class to calculate the P,Q moment of a blob
class CBlobGetMoment: public COperadorBlob
{
public:
//! Constructor estàndard
//! Standard constructor (gets the 00 moment)
CBlobGetMoment()
{
m_p = m_q = 0;
}
//! Constructor: indiquem el moment p,q a calcular
//! Constructor: gets the PQ moment
CBlobGetMoment( int p, int q )
{
m_p = p;
m_q = q;
};
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetMoment";
}
private:
//! moment que volem calcular
int m_p, m_q;
};
//! Classe per calcular el perimetre del poligon convex d'un blob
//! Class to calculate the convex hull perimeter of a blob
class CBlobGetHullPerimeter: public COperadorBlob
{
public:
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetHullPerimeter";
}
};
//! Classe per calcular l'àrea del poligon convex d'un blob
//! Class to calculate the convex hull area of a blob
class CBlobGetHullArea: public COperadorBlob
{
public:
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetHullArea";
}
};
//! Classe per calcular la x minima en la y minima
//! Class to calculate the minimum x on the minimum y
class CBlobGetMinXatMinY: public COperadorBlob
{
public:
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetMinXatMinY";
}
};
//! Classe per calcular la y minima en la x maxima
//! Class to calculate the minimum y on the maximum x
class CBlobGetMinYatMaxX: public COperadorBlob
{
public:
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetMinYatMaxX";
}
};
//! Classe per calcular la x maxima en la y maxima
//! Class to calculate the maximum x on the maximum y
class CBlobGetMaxXatMaxY: public COperadorBlob
{
public:
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetMaxXatMaxY";
}
};
//! Classe per calcular la y maxima en la x minima
//! Class to calculate the maximum y on the minimum y
class CBlobGetMaxYatMinX: public COperadorBlob
{
public:
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetMaxYatMinX";
}
};
//! Classe per a calcular la x mínima
//! Class to get the minimum x
class CBlobGetMinX: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
return blob.MinX();
}
const char *GetNom()
{
return "CBlobGetMinX";
}
};
//! Classe per a calcular la x màxima
//! Class to get the maximum x
class CBlobGetMaxX: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
return blob.MaxX();
}
const char *GetNom()
{
return "CBlobGetMaxX";
}
};
//! Classe per a calcular la y mínima
//! Class to get the minimum y
class CBlobGetMinY: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
return blob.MinY();
}
const char *GetNom()
{
return "CBlobGetMinY";
}
};
//! Classe per a calcular la y màxima
//! Class to get the maximum y
class CBlobGetMaxY: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
return blob.MaxY();
}
const char *GetNom()
{
return "CBlobGetMaxY";
}
};
//! Classe per calcular l'elongacio d'un blob
//! Class to calculate the elongation of the blob
class CBlobGetElongation: public COperadorBlob
{
public:
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetElongation";
}
};
//! Classe per calcular la rugositat d'un blob
//! Class to calculate the roughness of the blob
class CBlobGetRoughness: public COperadorBlob
{
public:
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetRoughness";
}
};
//! Classe per calcular la distància entre el centre del blob i un punt donat
//! Class to calculate the euclidean distance between the center of a blob and a given point
class CBlobGetDistanceFromPoint: public COperadorBlob
{
public:
//! Standard constructor (distance to point 0,0)
CBlobGetDistanceFromPoint()
{
m_x = m_y = 0.0;
}
//! Constructor (distance to point x,y)
CBlobGetDistanceFromPoint( const double x, const double y )
{
m_x = x;
m_y = y;
}
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetDistanceFromPoint";
}
private:
// coordenades del punt on volem calcular la distància
double m_x, m_y;
};
//! Classe per calcular el nombre de pixels externs d'un blob
//! Class to get the number of extern pixels of a blob
class CBlobGetExternPerimeter: public COperadorBlob
{
public:
CBlobGetExternPerimeter()
{
m_mask = NULL;
m_xBorder = false;
m_yBorder = false;
}
CBlobGetExternPerimeter( IplImage *mask, bool xBorder = true, bool yBorder = true )
{
m_mask = mask;
m_xBorder = xBorder;
m_yBorder = yBorder;
}
double operator()(CBlob &blob)
{
return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder);
}
const char *GetNom()
{
return "CBlobGetExternPerimeter";
}
private:
IplImage *m_mask;
bool m_xBorder, m_yBorder;
};
//! Classe per calcular el ratio entre el perimetre i nombre pixels externs
//! valors propers a 0 indiquen que la majoria del blob és intern
//! valors propers a 1 indiquen que la majoria del blob és extern
//! Class to calculate the ratio between the perimeter and the number of extern pixels
class CBlobGetExternPerimeterRatio: public COperadorBlob
{
public:
CBlobGetExternPerimeterRatio()
{
m_mask = NULL;
m_xBorder = false;
m_yBorder = false;
}
CBlobGetExternPerimeterRatio( IplImage *mask, bool xBorder = true, bool yBorder = true )
{
m_mask = mask;
m_xBorder = xBorder;
m_yBorder = yBorder;
}
double operator()(CBlob &blob)
{
if( blob.Perimeter() != 0 )
return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder) / blob.Perimeter();
else
return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder);
}
const char *GetNom()
{
return "CBlobGetExternPerimeterRatio";
}
private:
IplImage *m_mask;
bool m_xBorder, m_yBorder;
};
//! Classe per calcular el ratio entre el perimetre convex i nombre pixels externs
//! valors propers a 0 indiquen que la majoria del blob és intern
//! valors propers a 1 indiquen que la majoria del blob és extern
//! Class to calculate the ratio between the perimeter and the number of extern pixels
class CBlobGetExternHullPerimeterRatio: public COperadorBlob
{
public:
CBlobGetExternHullPerimeterRatio()
{
m_mask = NULL;
m_xBorder = false;
m_yBorder = false;
}
CBlobGetExternHullPerimeterRatio( IplImage *mask, bool xBorder = true, bool yBorder = true )
{
m_mask = mask;
m_xBorder = xBorder;
m_yBorder = yBorder;
}
double operator()(CBlob &blob)
{
CBlobGetHullPerimeter getHullPerimeter;
double hullPerimeter;
if( (hullPerimeter = getHullPerimeter( blob ) ) != 0 )
return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder) / hullPerimeter;
else
return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder);
}
const char *GetNom()
{
return "CBlobGetExternHullPerimeterRatio";
}
private:
IplImage *m_mask;
bool m_xBorder, m_yBorder;
};
//! Classe per calcular el centre en el eix X d'un blob
//! Class to calculate the center in the X direction
class CBlobGetXCenter: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
return blob.MinX() + (( blob.MaxX() - blob.MinX() ) / 2.0);
}
const char *GetNom()
{
return "CBlobGetXCenter";
}
};
//! Classe per calcular el centre en el eix Y d'un blob
//! Class to calculate the center in the Y direction
class CBlobGetYCenter: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
return blob.MinY() + (( blob.MaxY() - blob.MinY() ) / 2.0);
}
const char *GetNom()
{
return "CBlobGetYCenter";
}
};
//! Classe per calcular la longitud de l'eix major d'un blob
//! Class to calculate the length of the major axis of the ellipse that fits the blob edges
class CBlobGetMajorAxisLength: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
CvBox2D elipse = blob.GetEllipse();
return elipse.size.width;
}
const char *GetNom()
{
return "CBlobGetMajorAxisLength";
}
};
//! Classe per calcular el ratio entre l'area de la elipse i la de la taca
//! Class
class CBlobGetAreaElipseRatio: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
if( blob.Area()==0.0 ) return 0.0;
CvBox2D elipse = blob.GetEllipse();
double ratioAreaElipseAreaTaca = ( (elipse.size.width/2.0)
*
(elipse.size.height/2.0)
*CV_PI
)
/
blob.Area();
return ratioAreaElipseAreaTaca;
}
const char *GetNom()
{
return "CBlobGetAreaElipseRatio";
}
};
//! Classe per calcular la longitud de l'eix menor d'un blob
//! Class to calculate the length of the minor axis of the ellipse that fits the blob edges
class CBlobGetMinorAxisLength: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
CvBox2D elipse = blob.GetEllipse();
return elipse.size.height;
}
const char *GetNom()
{
return "CBlobGetMinorAxisLength";
}
};
//! Classe per calcular l'orientació de l'ellipse del blob en radians
//! Class to calculate the orientation of the ellipse that fits the blob edges in radians
class CBlobGetOrientation: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
CvBox2D elipse = blob.GetEllipse();
/*
if( elipse.angle > 180.0 )
return (( elipse.angle - 180.0 )* DEGREE2RAD);
else
return ( elipse.angle * DEGREE2RAD);
*/
return elipse.angle;
}
const char *GetNom()
{
return "CBlobGetOrientation";
}
};
//! Classe per calcular el cosinus de l'orientació de l'ellipse del blob
//! Class to calculate the cosinus of the orientation of the ellipse that fits the blob edges
class CBlobGetOrientationCos: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
CBlobGetOrientation getOrientation;
return fabs( cos( getOrientation(blob)*DEGREE2RAD ));
}
const char *GetNom()
{
return "CBlobGetOrientationCos";
}
};
//! Classe per calcular el ratio entre l'eix major i menor de la el·lipse
//! Class to calculate the ratio between both axes of the ellipse
class CBlobGetAxisRatio: public COperadorBlob
{
public:
double operator()(CBlob &blob)
{
double major,minor;
CBlobGetMajorAxisLength getMajor;
CBlobGetMinorAxisLength getMinor;
major = getMajor(blob);
minor = getMinor(blob);
if( major != 0 )
return minor / major;
else
return 0;
}
const char *GetNom()
{
return "CBlobGetAxisRatio";
}
};
//! Classe per calcular si un punt cau dins del blob
//! Class to calculate whether a point is inside a blob
class CBlobGetXYInside: public COperadorBlob
{
public:
//! Constructor estàndard
//! Standard constructor
CBlobGetXYInside()
{
m_p.x = 0;
m_p.y = 0;
}
//! Constructor: indiquem el punt
//! Constructor: sets the point
CBlobGetXYInside( CvPoint2D32f p )
{
m_p = p;
};
double operator()(CBlob &blob);
const char *GetNom()
{
return "CBlobGetXYInside";
}
private:
//! punt que considerem
//! point to be considered
CvPoint2D32f m_p;
};
#endif //!BLOB_OPERATORS_H_INCLUDED

View file

@ -1,70 +0,0 @@
//! Disable warnings referred to 255 character truncation for the std:map
#pragma warning( disable : 4786 )
#ifndef BLOB_PROPERTIES_H_INCLUDED
#define BLOB_PROPERTIES_H_INCLUDED
#include <opencv/cxcore.h>
#include "BlobLibraryConfiguration.h"
#include "BlobContour.h"
#ifdef BLOB_OBJECT_FACTORY
//! Object factory pattern implementation
#include "..\inspecta\DesignPatterns\ObjectFactory.h"
#endif
//! Type of labelled images
typedef unsigned int t_labelType;
//! Max order of calculated moments
#define MAX_MOMENTS_ORDER 3
//! Blob class
class CBlobProperties
{
typedef std::list<CBlobContour> t_contourList;
public:
CBlobProperties();
virtual ~CBlobProperties();
//! Get blob area
double GetArea();
//! Get blob perimeter
double GetPerimeter();
//! Get contour moment (p,q up to MAX_CALCULATED_MOMENTS)
double GetMoment(int p, int q);
//////////////////////////////////////////////////////////////////////////
// Blob contours
//////////////////////////////////////////////////////////////////////////
//! Contour storage memory
CvMemStorage *m_storage;
//! External contour of the blob (crack codes)
CBlobContour m_externalContour;
//! Internal contours (crack codes)
t_contourList m_internalContours;
private:
//! Computed area from blob
double m_area;
//! Computed perimeter from blob
double m_perimeter;
// Computed moment from the blob
double m_moment[MAX_MOMENTS_ORDER*MAX_MOMENTS_ORDER];
};
#endif //!BLOB_PROPERTIES_H_INCLUDED

View file

@ -1,171 +0,0 @@
/************************************************************************
BlobResult.h
FUNCIONALITAT: Definició de la classe CBlobResult
AUTOR: Inspecta S.L.
MODIFICACIONS (Modificació, Autor, Data):
FUNCTIONALITY: Definition of the CBlobResult class
AUTHOR: Inspecta S.L.
MODIFICATIONS (Modification, Author, Date):
**************************************************************************/
#if !defined(_CLASSE_BLOBRESULT_INCLUDED)
#define _CLASSE_BLOBRESULT_INCLUDED
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "BlobLibraryConfiguration.h"
#include <math.h>
#include <opencv/cxcore.h>
#ifdef MATRIXCV_ACTIU
#include "matrixCV.h"
#else
// llibreria STL
#include "vector"
//! Vector de doubles
typedef std::vector<double> double_stl_vector;
#endif
#include <vector> // vectors de la STL
#include <functional>
#include "blob.h"
#include "BlobOperators.h"
#include "ComponentLabeling.h"
/**************************************************************************
Filtres / Filters
**************************************************************************/
//! accions que es poden fer amb els filtres
//! Actions performed by a filter (include or exclude blobs)
#define B_INCLUDE 1L
#define B_EXCLUDE 2L
//! condicions sobre els filtres
//! Conditions to apply the filters
#define B_EQUAL 3L
#define B_NOT_EQUAL 4L
#define B_GREATER 5L
#define B_LESS 6L
#define B_GREATER_OR_EQUAL 7L
#define B_LESS_OR_EQUAL 8L
#define B_INSIDE 9L
#define B_OUTSIDE 10L
/**************************************************************************
Excepcions / Exceptions
**************************************************************************/
//! Excepcions llençades per les funcions:
#define EXCEPTION_BLOB_OUT_OF_BOUNDS 1000
#define EXCEPCIO_CALCUL_BLOBS 1001
/**
Classe que conté un conjunt de blobs i permet extreure'n propietats
o filtrar-los segons determinats criteris.
Class to calculate the blobs of an image and calculate some properties
on them. Also, the class provides functions to filter the blobs using
some criteria.
*/
class CBlobResult
{
public:
//! constructor estandard, crea un conjunt buit de blobs
//! Standard constructor, it creates an empty set of blobs
CBlobResult();
//! constructor a partir d'una imatge
//! Image constructor, it creates an object with the blobs of the image
CBlobResult(IplImage *source, IplImage *mask, uchar backgroundColor);
//! constructor de còpia
//! Copy constructor
CBlobResult( const CBlobResult &source );
//! Destructor
virtual ~CBlobResult();
//! operador = per a fer assignacions entre CBlobResult
//! Assigment operator
CBlobResult& operator=(const CBlobResult& source);
//! operador + per concatenar dos CBlobResult
//! Addition operator to concatenate two sets of blobs
CBlobResult operator+( const CBlobResult& source ) const;
//! Afegeix un blob al conjunt
//! Adds a blob to the set of blobs
void AddBlob( CBlob *blob );
#ifdef MATRIXCV_ACTIU
//! Calcula un valor sobre tots els blobs de la classe retornant una MatrixCV
//! Computes some property on all the blobs of the class
double_vector GetResult( funcio_calculBlob *evaluador ) const;
#endif
//! Calcula un valor sobre tots els blobs de la classe retornant un std::vector<double>
//! Computes some property on all the blobs of the class
double_stl_vector GetSTLResult( funcio_calculBlob *evaluador ) const;
//! Calcula un valor sobre un blob de la classe
//! Computes some property on one blob of the class
double GetNumber( int indexblob, funcio_calculBlob *evaluador ) const;
//! Retorna aquells blobs que compleixen les condicions del filtre en el destination
//! Filters the blobs of the class using some property
void Filter(CBlobResult &dst,
int filterAction, funcio_calculBlob *evaluador,
int condition, double lowLimit, double highLimit = 0 );
void Filter(CBlobResult &dst,
int filterAction, funcio_calculBlob *evaluador,
int condition, double lowLimit, double highLimit = 0 ) const;
//! Retorna l'enèssim blob segons un determinat criteri
//! Sorts the blobs of the class acording to some criteria and returns the n-th blob
void GetNthBlob( funcio_calculBlob *criteri, int nBlob, CBlob &dst ) const;
//! Retorna el blob enèssim
//! Gets the n-th blob of the class ( without sorting )
CBlob GetBlob(int indexblob) const;
CBlob *GetBlob(int indexblob);
//! Elimina tots els blobs de l'objecte
//! Clears all the blobs of the class
void ClearBlobs();
//! Escriu els blobs a un fitxer
//! Prints some features of all the blobs in a file
void PrintBlobs( char *nom_fitxer ) const;
//Metodes GET/SET
//! Retorna el total de blobs
//! Gets the total number of blobs
int GetNumBlobs() const
{
return(m_blobs.size());
}
private:
//! Funció per gestionar els errors
//! Function to manage the errors
void RaiseError(const int errorCode) const;
//! Does the Filter method job
void DoFilter(CBlobResult &dst,
int filterAction, funcio_calculBlob *evaluador,
int condition, double lowLimit, double highLimit = 0) const;
protected:
//! Vector amb els blobs
//! Vector with all the blobs
Blob_vector m_blobs;
};
#endif // !defined(_CLASSE_BLOBRESULT_INCLUDED)

View file

@ -1,30 +0,0 @@
#if !defined(_COMPONENT_LABELING_H_INCLUDED)
#define _CLASSE_BLOBRESULT_INCLUDED
#include "vector"
#include "BlobContour.h"
#include "blob.h"
//! definició de que es un vector de blobs
typedef std::vector<CBlob*> Blob_vector;
bool ComponentLabeling( IplImage* inputImage,
IplImage* maskImage,
unsigned char backgroundColor,
Blob_vector &blobs );
void contourTracing( IplImage *image, IplImage *mask, CvPoint contourStart, t_labelType *labels,
bool *visitedPoints, t_labelType label,
bool internalContour, unsigned char backgroundColor,
CBlobContour *currentBlobContour );
CvPoint tracer( IplImage *image, IplImage *mask, CvPoint P, bool *visitedPoints,
short initialMovement,
unsigned char backgroundColor, short &movement );
#endif //!_CLASSE_BLOBRESULT_INCLUDED

View file

@ -1,172 +0,0 @@
/************************************************************************
Blob.h
FUNCIONALITAT: Definició de la classe CBlob
AUTOR: Inspecta S.L.
MODIFICACIONS (Modificació, Autor, Data):
FUNCTIONALITY: Definition of the CBlob class and some helper classes to perform
some calculations on it
AUTHOR: Inspecta S.L.
MODIFICATIONS (Modification, Author, Date):
**************************************************************************/
//! Disable warnings referred to 255 character truncation for the std:map
#pragma warning( disable : 4786 )
#ifndef CBLOB_INSPECTA_INCLUDED
#define CBLOB_INSPECTA_INCLUDED
#include <opencv/cxcore.h>
#include "BlobLibraryConfiguration.h"
#include "BlobContour.h"
#ifdef BLOB_OBJECT_FACTORY
//! Object factory pattern implementation
#include "..\inspecta\DesignPatterns\ObjectFactory.h"
#endif
//! Type of labelled images
typedef unsigned int t_labelType;
//! Blob class
class CBlob
{
typedef std::list<CBlobContour> t_contourList;
public:
CBlob();
CBlob( t_labelType id, CvPoint startPoint, CvSize originalImageSize );
~CBlob();
//! Copy constructor
CBlob( const CBlob &src );
CBlob( const CBlob *src );
//! Operador d'assignació
//! Assigment operator
CBlob& operator=(const CBlob &src );
//! Adds a new internal contour to the blob
void AddInternalContour( const CBlobContour &newContour );
//! Retrieves contour in Freeman's chain code
CBlobContour *GetExternalContour()
{
return &m_externalContour;
}
//! Retrieves blob storage
CvMemStorage *GetStorage()
{
return m_storage;
}
//! Get label ID
t_labelType GetID()
{
return m_id;
}
//! > 0 for extern blobs, 0 if not
int Exterior( IplImage *mask, bool xBorder = true, bool yBorder = true );
//! Compute blob's area
double Area();
//! Compute blob's perimeter
double Perimeter();
//! Compute blob's moment (p,q up to MAX_CALCULATED_MOMENTS)
double Moment(int p, int q);
//! Compute extern perimeter
double ExternPerimeter( IplImage *mask, bool xBorder = true, bool yBorder = true );
//! Get mean grey color
double Mean( IplImage *image );
//! Get standard deviation grey color
double StdDev( IplImage *image );
//! Indica si el blob està buit ( no té cap info associada )
//! Shows if the blob has associated information
bool IsEmpty();
//! Retorna el poligon convex del blob
//! Calculates the convex hull of the blob
t_PointList GetConvexHull();
//! Pinta l'interior d'un blob d'un color determinat
//! Paints the blob in an image
void FillBlob( IplImage *imatge, CvScalar color, int offsetX = 0, int offsetY = 0 );
//! Join a blob to current one (add's contour
void JoinBlob( CBlob *blob );
//! Get bounding box
CvRect GetBoundingBox();
//! Get bounding ellipse
CvBox2D GetEllipse();
//! Minimun X
double MinX()
{
return GetBoundingBox().x;
}
//! Minimun Y
double MinY()
{
return GetBoundingBox().y;
}
//! Maximun X
double MaxX()
{
return GetBoundingBox().x + GetBoundingBox().width;
}
//! Maximun Y
double MaxY()
{
return GetBoundingBox().y + GetBoundingBox().height;
}
private:
//! Deallocates all contours
void ClearContours();
//////////////////////////////////////////////////////////////////////////
// Blob contours
//////////////////////////////////////////////////////////////////////////
//! Contour storage memory
CvMemStorage *m_storage;
//! External contour of the blob (crack codes)
CBlobContour m_externalContour;
//! Internal contours (crack codes)
t_contourList m_internalContours;
//////////////////////////////////////////////////////////////////////////
// Blob features
//////////////////////////////////////////////////////////////////////////
//! Label number
t_labelType m_id;
//! Area
double m_area;
//! Perimeter
double m_perimeter;
//! Extern perimeter from blob
double m_externPerimeter;
//! Mean gray color
double m_meanGray;
//! Standard deviation from gray color blob distribution
double m_stdDevGray;
//! Bounding box
CvRect m_boundingBox;
//! Bounding ellipse
CvBox2D m_ellipse;
//! Sizes from image where blob is extracted
CvSize m_originalImageSize;
};
#endif //CBLOB_INSPECTA_INCLUDED

View file

@ -1 +0,0 @@
A/

View file

@ -1,43 +0,0 @@
set(NAME glm)
file(GLOB ROOT_SOURCE *.cpp)
file(GLOB ROOT_INLINE *.inl)
file(GLOB ROOT_HEADER *.hpp)
file(GLOB_RECURSE CORE_SOURCE ./core/*.cpp)
file(GLOB_RECURSE CORE_INLINE ./core/*.inl)
file(GLOB_RECURSE CORE_HEADER ./core/*.hpp)
file(GLOB_RECURSE GTC_SOURCE ./gtc/*.cpp)
file(GLOB_RECURSE GTC_INLINE ./gtc/*.inl)
file(GLOB_RECURSE GTC_HEADER ./gtc/*.hpp)
file(GLOB_RECURSE GTX_SOURCE ./gtx/*.cpp)
file(GLOB_RECURSE GTX_INLINE ./gtx/*.inl)
file(GLOB_RECURSE GTX_HEADER ./gtx/*.hpp)
file(GLOB_RECURSE VIRTREV_SOURCE ./virtrev/*.cpp)
file(GLOB_RECURSE VIRTREV_INLINE ./virtrev/*.inl)
file(GLOB_RECURSE VIRTREV_HEADER ./virtrev/*.hpp)
source_group("Core Files" FILES ${CORE_SOURCE})
source_group("Core Files" FILES ${CORE_INLINE})
source_group("Core Files" FILES ${CORE_HEADER})
source_group("GTC Files" FILES ${GTC_SOURCE})
source_group("GTC Files" FILES ${GTC_INLINE})
source_group("GTC Files" FILES ${GTC_HEADER})
source_group("GTX Files" FILES ${GTX_SOURCE})
source_group("GTX Files" FILES ${GTX_INLINE})
source_group("GTX Files" FILES ${GTX_HEADER})
source_group("VIRTREV Files" FILES ${VIRTREV_SOURCE})
source_group("VIRTREV Files" FILES ${VIRTREV_INLINE})
source_group("VIRTREV Files" FILES ${VIRTREV_HEADER})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..)
add_executable(${NAME}
${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER}
${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER}
${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER}
${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER}
${VIRTREV_SOURCE} ${VIRTREV_INLINE} ${VIRTREV_HEADER})

282
Makefile
View file

@ -1,282 +0,0 @@
#############################################################################
#
# Generic Makefile for C/C++ Program
#
# License: GPL (General Public License)
# Author: whyglinux <whyglinux AT gmail DOT com>
# Date: 2006/03/04 (version 0.1)
# 2007/03/24 (version 0.2)
# 2007/04/09 (version 0.3)
# 2007/06/26 (version 0.4)
# 2008/04/05 (version 0.5)
#
# Description:
# ------------
# This is an easily customizable makefile template. The purpose is to
# provide an instant building environment for C/C++ programs.
#
# It searches all the C/C++ source files in the specified directories,
# makes dependencies, compiles and links to form an executable.
#
# Besides its default ability to build C/C++ programs which use only
# standard C/C++ libraries, you can customize the Makefile to build
# those using other libraries. Once done, without any changes you can
# then build programs using the same or less libraries, even if source
# files are renamed, added or removed. Therefore, it is particularly
# convenient to use it to build codes for experimental or study use.
#
# GNU make is expected to use the Makefile. Other versions of makes
# may or may not work.
#
# Usage:
# ------
# 1. Copy the Makefile to your program directory.
# 2. Customize in the "Customizable Section" only if necessary:
# * to use non-standard C/C++ libraries, set pre-processor or compiler
# options to <MY_CFLAGS> and linker ones to <MY_LIBS>
# (See Makefile.gtk+-2.0 for an example)
# * to search sources in more directories, set to <SRCDIRS>
# * to specify your favorite program name, set to <PROGRAM>
# 3. Type make to start building your program.
#
# Make Target:
# ------------
# The Makefile provides the following targets to make:
# $ make compile and link
# $ make NODEP=yes compile and link without generating dependencies
# $ make objs compile only (no linking)
# $ make tags create tags for Emacs editor
# $ make ctags create ctags for VI editor
# $ make clean clean objects and the executable file
# $ make distclean clean objects, the executable and dependencies
# $ make help get the usage of the makefile
#
#===========================================================================
## Customizable Section: adapt those variables to suit your program.
##==========================================================================
# The pre-processor and compiler options.
MY_CFLAGS = -I/usr/X11R6/include/
# The linker options.
MY_LIBS =
# The pre-processor options used by the cpp (man cpp for more).
CPPFLAGS = -Wall
# The options used in linking as well as in any direct use of ld.
#LDFLAGS = -L/usr/X11R6/lib -lX11 -lXi -lXmu -lglut -lGL -lGLU -lportaudio
LDFLAGS = -L/usr/X11R6/lib -lglut -lGL -lGLU -lportaudio
# The directories in which source files reside.
# If not specified, only the current directory will be serached.
SRCDIRS =
# The executable file name.
# If not specified, current directory name or `a.out' will be used.
PROGRAM = demo
## Implicit Section: change the following only when necessary.
##==========================================================================
# The source file types (headers excluded).
# .c indicates C source files, and others C++ ones.
SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp
# The header file types.
HDREXTS = .h .H .hh .hpp .HPP .h++ .hxx .hp
# The pre-processor and compiler options.
# Users can override those variables from the command line.
CFLAGS = -g -O2
CXXFLAGS= -g -O2
# The C program compiler.
#CC = gcc
# The C++ program compiler.
#CXX = g++
# Un-comment the following line to compile C programs as C++ ones.
#CC = $(CXX)
# The command used to delete file.
#RM = rm -f
ETAGS = etags
ETAGSFLAGS =
CTAGS = ctags
CTAGSFLAGS =
## Stable Section: usually no need to be changed. But you can add more.
##==========================================================================
SHELL = /bin/sh
EMPTY =
SPACE = $(EMPTY) $(EMPTY)
ifeq ($(PROGRAM),)
CUR_PATH_NAMES = $(subst /,$(SPACE),$(subst $(SPACE),_,$(CURDIR)))
PROGRAM = $(word $(words $(CUR_PATH_NAMES)),$(CUR_PATH_NAMES))
ifeq ($(PROGRAM),)
PROGRAM = a.out
endif
endif
ifeq ($(SRCDIRS),)
SRCDIRS = .
endif
SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
HEADERS = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(HDREXTS))))
SRC_CXX = $(filter-out %.c,$(SOURCES))
OBJS = $(addsuffix .o, $(basename $(SOURCES)))
DEPS = $(OBJS:.o=.d)
## Define some useful variables.
DEP_OPT = $(shell if `$(CC) --version | grep "GCC" >/dev/null`; then \
echo "-MM -MP"; else echo "-M"; fi )
DEPEND = $(CC) $(DEP_OPT) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS)
DEPEND.d = $(subst -g ,,$(DEPEND))
COMPILE.c = $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) -c
COMPILE.cxx = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c
#LINK.c = $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)
#LINK.cxx = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS)
LINK.c = $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS)
LINK.cxx = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS)
.PHONY: all objs tags ctags clean distclean help show
# Delete the default suffixes
.SUFFIXES:
all: $(PROGRAM)
# Rules for creating dependency files (.d).
#------------------------------------------
%.d:%.c
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.C
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.cc
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.cpp
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.CPP
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.c++
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.cp
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.cxx
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
# Rules for generating object files (.o).
#----------------------------------------
objs:$(OBJS)
%.o:%.c
$(COMPILE.c) $< -o $@
%.o:%.C
$(COMPILE.cxx) $< -o $@
%.o:%.cc
$(COMPILE.cxx) $< -o $@
%.o:%.cpp
$(COMPILE.cxx) $< -o $@
%.o:%.CPP
$(COMPILE.cxx) $< -o $@
%.o:%.c++
$(COMPILE.cxx) $< -o $@
%.o:%.cp
$(COMPILE.cxx) $< -o $@
%.o:%.cxx
$(COMPILE.cxx) $< -o $@
# Rules for generating the tags.
#-------------------------------------
tags: $(HEADERS) $(SOURCES)
$(ETAGS) $(ETAGSFLAGS) $(HEADERS) $(SOURCES)
ctags: $(HEADERS) $(SOURCES)
$(CTAGS) $(CTAGSFLAGS) $(HEADERS) $(SOURCES)
# Rules for generating the executable.
#-------------------------------------
$(PROGRAM):$(OBJS)
ifeq ($(SRC_CXX),) # C program
$(LINK.c) $(OBJS) $(MY_LIBS) -o $@ $(LDFLAGS)
@echo Type ./$@ to execute the program.
else # C++ program
$(LINK.cxx) $(OBJS) $(MY_LIBS) -o $@ $(LDFLAGS)
@echo Type ./$@ to execute the program.
endif
ifndef NODEP
ifneq ($(DEPS),)
sinclude $(DEPS)
endif
endif
clean:
$(RM) $(OBJS) $(PROGRAM) $(PROGRAM).exe
distclean: clean
$(RM) $(DEPS) TAGS
# Show help.
help:
@echo 'Generic Makefile for C/C++ Programs (gcmakefile) version 0.5'
@echo 'Copyright (C) 2007, 2008 whyglinux <whyglinux@hotmail.com>'
@echo
@echo 'Usage: make [TARGET]'
@echo 'TARGETS:'
@echo ' all (=make) compile and link.'
@echo ' NODEP=yes make without generating dependencies.'
@echo ' objs compile only (no linking).'
@echo ' tags create tags for Emacs editor.'
@echo ' ctags create ctags for VI editor.'
@echo ' clean clean objects and the executable file.'
@echo ' distclean clean objects, the executable and dependencies.'
@echo ' show show variables (for debug use only).'
@echo ' help print this message.'
@echo
@echo 'Report bugs to <whyglinux AT gmail DOT com>.'
# Show variables (for debug use only.)
show:
@echo 'PROGRAM :' $(PROGRAM)
@echo 'SRCDIRS :' $(SRCDIRS)
@echo 'HEADERS :' $(HEADERS)
@echo 'SOURCES :' $(SOURCES)
@echo 'SRC_CXX :' $(SRC_CXX)
@echo 'OBJS :' $(OBJS)
@echo 'DEPS :' $(DEPS)
@echo 'DEPEND :' $(DEPEND)
@echo 'COMPILE.c :' $(COMPILE.c)
@echo 'COMPILE.cxx :' $(COMPILE.cxx)
@echo 'link.c :' $(LINK.c)
@echo 'link.cxx :' $(LINK.cxx)
## End of the Makefile ## Suggestions are welcome ## All rights reserved ##
#############################################################################

7
README
View file

@ -1,7 +0,0 @@
Boxing balance surface project
Low latency high FPS display of exact balance point of a standing person,
detected by pressure sensors at corners of a 4' by 4' platform.
Sensors read and processed by Maple ret6 board, sent to MacBook via serial USB.

View file

@ -0,0 +1,63 @@
# FindGLM - attempts to locate the glm matrix/vector library.
#
# This module defines the following variables (on success):
# GLM_INCLUDE_DIRS - where to find glm/glm.hpp
# GLM_FOUND - if the library was successfully located
#
# It is trying a few standard installation locations, but can be customized
# with the following variables:
# GLM_ROOT_DIR - root directory of a glm installation
# Headers are expected to be found in either:
# <GLM_ROOT_DIR>/glm/glm.hpp OR
# <GLM_ROOT_DIR>/include/glm/glm.hpp
# This variable can either be a cmake or environment
# variable. Note however that changing the value
# of the environment varible will NOT result in
# re-running the header search and therefore NOT
# adjust the variables set by this module.
#=============================================================================
# Copyright 2012 Carsten Neumann
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
# License text for the above reference.)
# default search dirs
SET(_glm_HEADER_SEARCH_DIRS
"/usr/include"
"/usr/local/include")
# check environment variable
SET(_glm_ENV_ROOT_DIR "$ENV{GLM_ROOT_DIR}")
IF(NOT GLM_ROOT_DIR AND _glm_ENV_ROOT_DIR)
SET(GLM_ROOT_DIR "${_glm_ENV_ROOT_DIR}")
ENDIF(NOT GLM_ROOT_DIR AND _glm_ENV_ROOT_DIR)
# put user specified location at beginning of search
IF(GLM_ROOT_DIR)
SET(_glm_HEADER_SEARCH_DIRS "${GLM_ROOT_DIR}"
"${GLM_ROOT_DIR}/include"
${_glm_HEADER_SEARCH_DIRS})
ENDIF(GLM_ROOT_DIR)
# locate header
FIND_PATH(GLM_INCLUDE_DIR "glm/glm.hpp"
PATHS ${_glm_HEADER_SEARCH_DIRS})
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLM DEFAULT_MSG
GLM_INCLUDE_DIR)
IF(GLM_FOUND)
SET(GLM_INCLUDE_DIRS "${GLM_INCLUDE_DIR}")
MESSAGE(STATUS "GLM_INCLUDE_DIR = ${GLM_INCLUDE_DIR}")
ENDIF(GLM_FOUND)

View file

@ -0,0 +1,44 @@
# - Try to find the LodePNG library
#
# You must provide a LODEPNG_ROOT_DIR which contains the header and cpp file
#
# Once done this will define
#
# LODEPNG_FOUND - system has LODEPNG_FOUND
# LODEPNG_INCLUDE_DIRS - the LodePNG include directory
# LODEPNG_LIBRARY - Link these to use LodePNG
#
# Copyright (c) 2013 Stephen Birarda <birarda@coffeeandpower.com>
#
if (LODEPNG_LIBRARY AND LODEPNG_INCLUDE_DIRS)
# in cache already
set(LODEPNG_FOUND TRUE)
else (LODEPNG_LIBRARY AND LODEPNG_INCLUDE_DIRS)
set(LODEPNG_INCLUDE_DIRS
${LODEPNG_ROOT_DIR}/lodepng.h
)
set(LODEPNG_LIBRARY
${LODEPNG_ROOT_DIR}/lodepng.cpp
)
if (LODEPNG_INCLUDE_DIRS AND LODEPNG_LIBRARY)
set(LODEPNG_FOUND TRUE)
endif (LODEPNG_INCLUDE_DIRS AND LODEPNG_LIBRARY)
if (LODEPNG_FOUND)
if (NOT LodePNG_FIND_QUIETLY)
message(STATUS "Found LodePNG: ${LODEPNG_LIBRARY}")
endif (NOT LodePNG_FIND_QUIETLY)
else (LODEPNG_FOUND)
if (LodePNG_FIND_REQUIRED)
message(FATAL_ERROR "Could not find LodePNG")
endif (LodePNG_FIND_REQUIRED)
endif (LODEPNG_FOUND)
# show the LODEPNG_INCLUDE_DIRS and LODEPNG_LIBRARY variables only in the advanced view
mark_as_advanced(LODEPNG_INCLUDE_DIRS LODEPNG_LIBRARY)
endif (LODEPNG_LIBRARY AND LODEPNG_INCLUDE_DIRS)

View file

@ -0,0 +1,46 @@
# - Try to find the Portaudio library
#
# You must provide a PORTAUDIO_ROOT_DIR which contains the header and library
#
# Once done this will define
#
# PORTAUDIO_FOUND - system has Portaudio
# PORTAUDIO_INCLUDE_DIRS - the Portaudio include directory
# PORTAUDIO_LIBRARY - Link these to use Portaudio
#
# Copyright (c) 2013 Stephen Birarda <birarda@coffeeandpower.com>
#
# Heavily based on Andreas Schneider's original FindPortaudio.cmake
# which can be found at http://gnuradio.org/redmine/projects/gnuradio/repository/
if (PORTAUDIO_LIBRARY AND PORTAUDIO_INCLUDE_DIRS)
# in cache already
set(PORTAUDIO_FOUND TRUE)
else (PORTAUDIO_LIBRARY AND PORTAUDIO_INCLUDE_DIRS)
set(PORTAUDIO_INCLUDE_DIRS
${PORTAUDIO_ROOT_DIR}/portaudio.h
)
set(PORTAUDIO_LIBRARY
${PORTAUDIO_ROOT_DIR}/libportaudio.a
)
if (PORTAUDIO_INCLUDE_DIRS AND PORTAUDIO_LIBRARY)
set(PORTAUDIO_FOUND TRUE)
endif (PORTAUDIO_INCLUDE_DIRS AND PORTAUDIO_LIBRARY)
if (PORTAUDIO_FOUND)
if (NOT Portaudio_FIND_QUIETLY)
message(STATUS "Found Portaudio: ${PORTAUDIO_LIBRARY}")
endif (NOT Portaudio_FIND_QUIETLY)
else (PORTAUDIO_FOUND)
if (Portaudio_FIND_REQUIRED)
message(FATAL_ERROR "Could not find Portaudio")
endif (Portaudio_FIND_REQUIRED)
endif (PORTAUDIO_FOUND)
# show the PORTAUDIO_INCLUDE_DIRS and PORTAUDIO_LIBRARY variables only in the advanced view
mark_as_advanced(PORTAUDIO_INCLUDE_DIRS PORTAUDIO_LIBRARY)
endif (PORTAUDIO_LIBRARY AND PORTAUDIO_INCLUDE_DIRS)

File diff suppressed because it is too large Load diff

View file

@ -1,148 +0,0 @@
// !$*UTF8*$!
{
08FB7793FE84155DC02AAC07 /* Project object */ = {
activeBuildConfigurationName = Release;
activeExecutable = D40BDF8D13403FC300B0BE1F /* automata7 */;
activeTarget = 8DD76F620486A84900D96B5E /* automata7 */;
addToTargets = (
8DD76F620486A84900D96B5E /* automata7 */,
);
codeSenseManager = D40BDF9913403FC900B0BE1F /* Code sense */;
executables = (
D40BDF8D13403FC300B0BE1F /* automata7 */,
);
perUserDictionary = {
PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
PBXFileTableDataSourceColumnWidthsKey = (
20,
833,
20,
48,
43,
43,
20,
);
PBXFileTableDataSourceColumnsKey = (
PBXFileDataSource_FiletypeID,
PBXFileDataSource_Filename_ColumnID,
PBXFileDataSource_Built_ColumnID,
PBXFileDataSource_ObjectSize_ColumnID,
PBXFileDataSource_Errors_ColumnID,
PBXFileDataSource_Warnings_ColumnID,
PBXFileDataSource_Target_ColumnID,
);
};
PBXPerProjectTemplateStateSaveDate = 348474226;
PBXWorkspaceStateSaveDate = 348474226;
};
perUserProjectItems = {
D48F923814C54A47007626C8 = D48F923814C54A47007626C8 /* PBXTextBookmark */;
D48F925214C54B80007626C8 /* PBXTextBookmark */ = D48F925214C54B80007626C8 /* PBXTextBookmark */;
D4C40DC71492DE0C0098EA8B = D4C40DC71492DE0C0098EA8B /* PBXTextBookmark */;
D4DCA72D144F9BEB00D336A4 = D4DCA72D144F9BEB00D336A4 /* PBXTextBookmark */;
};
sourceControlManager = D40BDF9813403FC900B0BE1F /* Source Control */;
userBuildSettings = {
};
};
08FB7796FE84155DC02AAC07 /* main.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1011, 6812}}";
sepNavSelRange = "{63, 0}";
sepNavVisRange = "{835, 1307}";
sepNavWindowFrame = "{{61, 173}, {750, 558}}";
};
};
8DD76F620486A84900D96B5E /* automata7 */ = {
activeExec = 0;
executables = (
D40BDF8D13403FC300B0BE1F /* automata7 */,
);
};
D40BDF8D13403FC300B0BE1F /* automata7 */ = {
isa = PBXExecutable;
activeArgIndices = (
);
argumentStrings = (
);
autoAttachOnCrash = 1;
breakpointsEnabled = 0;
configStateDict = {
};
customDataFormattersEnabled = 1;
dataTipCustomDataFormattersEnabled = 1;
dataTipShowTypeColumn = 1;
dataTipSortType = 0;
debuggerPlugin = GDBDebugging;
disassemblyDisplayState = 0;
dylibVariantSuffix = "";
enableDebugStr = 1;
environmentEntries = (
);
executableSystemSymbolLevel = 0;
executableUserSymbolLevel = 0;
libgmallocEnabled = 0;
name = automata7;
savedGlobals = {
};
showTypeColumn = 0;
sourceDirectories = (
);
};
D40BDF9813403FC900B0BE1F /* Source Control */ = {
isa = PBXSourceControlManager;
fallbackIsa = XCSourceControlManager;
isSCMEnabled = 0;
scmConfiguration = {
repositoryNamesForRoots = {
"" = "";
};
};
};
D40BDF9913403FC900B0BE1F /* Code sense */ = {
isa = PBXCodeSenseManager;
indexTemplatePath = "";
};
D48F923814C54A47007626C8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 08FB7796FE84155DC02AAC07 /* main.cpp */;
name = "main.cpp: 3";
rLen = 0;
rLoc = 63;
rType = 0;
vrLen = 1296;
vrLoc = 845;
};
D48F925214C54B80007626C8 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 08FB7796FE84155DC02AAC07 /* main.cpp */;
name = "main.cpp: 3";
rLen = 0;
rLoc = 63;
rType = 0;
vrLen = 1307;
vrLoc = 835;
};
D4C40DC71492DE0C0098EA8B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 08FB7796FE84155DC02AAC07 /* main.cpp */;
name = "main.cpp: 3";
rLen = 0;
rLoc = 63;
rType = 0;
vrLen = 1047;
vrLoc = 0;
};
D4DCA72D144F9BEB00D336A4 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 08FB7796FE84155DC02AAC07 /* main.cpp */;
name = "main.cpp: 454";
rLen = 9;
rLoc = 12353;
rType = 0;
vrLen = 1746;
vrLoc = 1573;
};
}

File diff suppressed because it is too large Load diff

View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:interface.xcodeproj">
</FileRef>
</Workspace>

View file

@ -1,47 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
type = "1"
version = "1.0">
<FileBreakpoints>
<FileBreakpoint
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
isPathRelative = "1"
filePath = "main.cpp"
timestampString = "368315146.447438"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "41"
endingLineNumber = "41">
</FileBreakpoint>
<FileBreakpoint
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
isPathRelative = "1"
filePath = "main.cpp"
timestampString = "368480470.721832"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "904"
endingLineNumber = "904"
landmarkName = "main(int argc, char** argv)"
landmarkType = "7">
</FileBreakpoint>
<FileBreakpoint
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
isPathRelative = "1"
filePath = "particle.cpp"
timestampString = "368498289.590653"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "26"
endingLineNumber = "26"
landmarkName = "ParticleSystem::simulate (float deltaTime)"
landmarkType = "5">
</FileBreakpoint>
</FileBreakpoints>
</Bucket>

View file

@ -1,84 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8DD76F620486A84900D96B5E"
BuildableName = "interface"
BlueprintName = "interface"
ReferencedContainer = "container:interface.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8DD76F620486A84900D96B5E"
BuildableName = "interface"
BlueprintName = "interface"
ReferencedContainer = "container:interface.xcodeproj">
</BuildableReference>
</MacroExpansion>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8DD76F620486A84900D96B5E"
BuildableName = "interface"
BlueprintName = "interface"
ReferencedContainer = "container:interface.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8DD76F620486A84900D96B5E"
BuildableName = "interface"
BlueprintName = "interface"
ReferencedContainer = "container:interface.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View file

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>interface.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>8DD76F620486A84900D96B5E</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

View file

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
type = "1"
version = "1.0">
<FileBreakpoints>
<FileBreakpoint
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "field.cpp"
timestampString = "375986878.0086"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "122"
endingLineNumber = "122"
landmarkName = "field_avg_neighbors(int index, glm::vec3 * result)"
landmarkType = "7">
</FileBreakpoint>
</FileBreakpoints>
</Bucket>

View file

@ -1,86 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0450"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8DD76F620486A84900D96B5E"
BuildableName = "interface"
BlueprintName = "interface"
ReferencedContainer = "container:interface.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8DD76F620486A84900D96B5E"
BuildableName = "interface"
BlueprintName = "interface"
ReferencedContainer = "container:interface.xcodeproj">
</BuildableReference>
</MacroExpansion>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8DD76F620486A84900D96B5E"
BuildableName = "interface"
BlueprintName = "interface"
ReferencedContainer = "container:interface.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8DD76F620486A84900D96B5E"
BuildableName = "interface"
BlueprintName = "interface"
ReferencedContainer = "container:interface.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View file

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>automata7.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>8DD76F620486A84900D96B5E</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

31
interface/CMakeLists.txt Normal file
View file

@ -0,0 +1,31 @@
cmake_minimum_required(VERSION 2.8)
project(interface)
file(GLOB INTERFACE_SRCS src/*.cpp src/*.h)
add_executable(interface ${INTERFACE_SRCS})
if (APPLE)
set(CMAKE_EXE_LINKER_FLAGS "-framework CoreAudio -framework AudioToolbox -framework AudioUnit -framework CoreServices -framework Carbon")
endif (APPLE)
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
find_package(GLM REQUIRED)
find_package(Portaudio REQUIRED)
find_package(LodePNG REQUIRED)
include_directories(
${OPENGL_INCLUDE_DIRS}
${GLUT_INCLUDE_DIRS}
${GLM_INCLUDE_DIRS}
${PORTAUDIO_INCLUDE_DIRS}
${LODEPNG_INCLUDE_DIRS}
)
target_link_libraries(interface
${OPENGL_LIBRARY}
${GLUT_LIBRARY}
${PORTAUDIO_LIBRARY}
${LODEPNG_LIBRARY}
)

View file

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View file

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View file

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View file

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

View file

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View file

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

View file

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -9,7 +9,7 @@
#ifndef __interface__Agent__
#define __interface__Agent__
#include "glm.hpp"
#include <glm/glm.hpp>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

View file

@ -10,7 +10,7 @@
#define __interface__Audio__
#include <iostream>
#include "portaudio.h"
#include <Portaudio/portaudio.h>
#include "Head.h"
#include "AudioData.h"

View file

@ -10,7 +10,7 @@
#define __interface__AudioSource__
#include <iostream>
#include "glm.hpp"
#include <glm/glm.hpp>
class AudioSource {
public:

View file

@ -9,7 +9,7 @@
#ifndef __interface__Cube__
#define __interface__Cube__
#include "glm.hpp"
#include <glm/glm.hpp>
#include "Util.h"
#include "world.h"
#include <GLUT/glut.h>

View file

@ -7,7 +7,7 @@
//
#include "Field.h"
#include "glm.hpp"
#include <glm/glm.hpp>
#define FIELD_SCALE 0.00050
#define COLOR_DRIFT_RATE 0.001f // per-frame drift of particle color towards field element color
#define COLOR_MIN 0.2f // minimum R/G/B value at 0,0,0 - also needs setting in cloud.cpp

View file

@ -17,7 +17,7 @@
#include <iostream>
#include "world.h"
#include "Util.h"
#include "glm.hpp"
#include <glm/glm.hpp>
// Field is a lattice of vectors uniformly distributed FIELD_ELEMENTS^(1/3) on side
const int FIELD_ELEMENTS = 1000;

View file

@ -9,7 +9,7 @@
#ifndef __interface__Finger__
#define __interface__Finger__
#include "glm.hpp"
#include <glm/glm.hpp>
#include "Util.h"
#include "world.h"
#include <GLUT/glut.h>

View file

@ -9,7 +9,7 @@
#ifndef __interface__Hand__
#define __interface__Hand__
#include "glm.hpp"
#include <glm/glm.hpp>
#include <iostream>
#include "Util.h"
#include "Field.h"

View file

@ -9,7 +9,7 @@
#include <iostream>
#include "Head.h"
#include "Util.h"
#include "vector_angle.hpp"
#include <glm/glm.hpp>
#include "SerialInterface.h"
float skinColor[] = {1.0, 0.84, 0.66};

View file

@ -9,7 +9,7 @@
#ifndef __interface__Lattice__
#define __interface__Lattice__
#include "glm.hpp"
#include <glm/glm.hpp>
#include "Util.h"
#include "world.h"
#include <GLUT/glut.h>

View file

@ -9,7 +9,7 @@
#ifndef __interface__Oscilloscope__
#define __interface__Oscilloscope__
#include "glm.hpp"
#include <glm/glm.hpp>
#include "Util.h"
#include "World.h"
#include <GLUT/glut.h>

View file

@ -9,7 +9,7 @@
#ifndef __interface__Particle__
#define __interface__Particle__
#include "glm.hpp"
#include <glm/glm.hpp>
#include "Util.h"
#include "world.h"
#include <GLUT/glut.h>

View file

@ -6,7 +6,7 @@
#ifndef __interface__SerialInterface__
#define __interface__SerialInterface__
#include "glm.hpp"
#include <glm/glm.hpp>
#include "util.h"
#include "world.h"
#include <GLUT/glut.h>

View file

@ -13,7 +13,7 @@
#else
#include <GL/glut.h>
#endif
#include "lodepng.h"
#include <LodePNG/lodepng.h>
#include <vector>
#include <cstdio>

View file

@ -13,7 +13,7 @@
#endif
#include <iostream>
#include "world.h"
#include "glm.hpp"
#include <glm/glm.hpp>
#include "util.h"

View file

@ -9,7 +9,7 @@
#ifndef __interface__Util__
#define __interface__Util__
#include "glm.hpp"
#include <glm/glm.hpp>
float azimuth_to(glm::vec3 head_pos, glm::vec3 source_pos);
float angle_to(glm::vec3 head_pos, glm::vec3 source_pos, float render_yaw, float head_yaw);

View file

@ -36,8 +36,7 @@
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include "glm.hpp"
#include "portaudio.h"
#include <glm/glm.hpp>
// Bring in OpenCV

4
mixer/.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
socket
sftp-config.json
.DS_Store
*.raw

7
mixer/CMakeLists.txt Normal file
View file

@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 2.8)
project(mixer)
file(GLOB MIXER_SRCS src/*.cpp src/*.h)
add_executable(mixer ${MIXER_SRCS})

292
mixer/src/socket.cpp Normal file
View file

@ -0,0 +1,292 @@
#include <iostream>
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/time.h>
#include <pthread.h>
#include <errno.h>
#include <fstream>
#include <limits>
const int MAX_AGENTS = 1000;
const int LOGOFF_CHECK_INTERVAL = 1000;
const int UDP_PORT = 55443;
const int BUFFER_LENGTH_BYTES = 1024;
const int BUFFER_LENGTH_SAMPLES = BUFFER_LENGTH_BYTES / sizeof(int16_t);
const float SAMPLE_RATE = 22050.0;
const float BUFFER_SEND_INTERVAL_USECS = (BUFFER_LENGTH_SAMPLES/SAMPLE_RATE) * 1000000;
const int MAX_SAMPLE_VALUE = std::numeric_limits<int16_t>::max();
const int MIN_SAMPLE_VALUE = std::numeric_limits<int16_t>::min();
const int MAX_SOURCE_BUFFERS = 10;
int16_t* whiteNoiseBuffer;
int whiteNoiseLength;
#define ECHO_DEBUG_MODE 0
sockaddr_in address, dest_address;
socklen_t destLength = sizeof(dest_address);
struct AgentList {
sockaddr_in agent_addr;
bool active;
timeval time;
} agents[MAX_AGENTS];
int num_agents = 0;
struct SourceBuffer {
int16_t sourceAudioData[BUFFER_LENGTH_SAMPLES];
bool transmitted;
} sourceBuffers[MAX_SOURCE_BUFFERS];
double diffclock(timeval *clock1, timeval *clock2)
{
double diffms = (clock2->tv_sec - clock1->tv_sec) * 1000.0;
diffms += (clock2->tv_usec - clock1->tv_usec) / 1000.0; // us to ms
return diffms;
}
double usecTimestamp(timeval *time, double addedUsecs = 0) {
return (time->tv_sec * 1000000.0) + time->tv_usec + addedUsecs;
}
int create_socket()
{
// Create socket
int handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (handle <= 0) {
printf("Failed to create socket: %d\n", handle);
return false;
}
return handle;
}
int network_init()
{
int handle = create_socket();
// Bind socket to port
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( (unsigned short) UDP_PORT );
if (bind(handle, (const sockaddr*) &address, sizeof(sockaddr_in)) < 0) {
printf( "failed to bind socket\n" );
return false;
}
return handle;
}
int addAgent(sockaddr_in dest_address, void *audioData) {
// Search for agent in list and add if needed
int is_new = 0;
int i = 0;
for (i = 0; i < num_agents; i++) {
if (dest_address.sin_addr.s_addr == agents[i].agent_addr.sin_addr.s_addr
&& dest_address.sin_port == agents[i].agent_addr.sin_port) {
break;
}
}
if ((i == num_agents) || (agents[i].active == false)) {
is_new = 1;
}
agents[i].agent_addr = dest_address;
agents[i].active = true;
gettimeofday(&agents[i].time, NULL);
memcpy(sourceBuffers[i].sourceAudioData, audioData, BUFFER_LENGTH_BYTES);
sourceBuffers[i].transmitted = false;
if (i == num_agents) {
num_agents++;
}
return is_new;
}
struct send_buffer_struct {
int socket_handle;
};
void *send_buffer_thread(void *args)
{
struct send_buffer_struct *buffer_args = (struct send_buffer_struct *) args;
int handle = buffer_args->socket_handle;
int sentBytes;
int currentFrame = 1;
timeval startTime, sendTime, now;
int16_t *clientMix = new int16_t[BUFFER_LENGTH_SAMPLES];
int16_t *masterMix = new int16_t[BUFFER_LENGTH_SAMPLES];
gettimeofday(&startTime, NULL);
while (true) {
sentBytes = 0;
int sampleOffset = ((currentFrame - 1) * BUFFER_LENGTH_SAMPLES) % whiteNoiseLength;
memcpy(masterMix, whiteNoiseBuffer + sampleOffset, BUFFER_LENGTH_BYTES);
gettimeofday(&sendTime, NULL);
for (int a = 0; a < num_agents; a++) {
if (diffclock(&agents[a].time, &sendTime) <= LOGOFF_CHECK_INTERVAL) {
memcpy(clientMix, masterMix, BUFFER_LENGTH_BYTES);
for (int b = 0; b < MAX_SOURCE_BUFFERS; b++) {
if (b != a && !sourceBuffers[b].transmitted) {
for (int s = 0; s < BUFFER_LENGTH_SAMPLES; s++) {
// we have source buffer data for this sample
int mixSample = clientMix[s] + sourceBuffers[b].sourceAudioData[s];
int sampleToAdd = std::max(mixSample, MIN_SAMPLE_VALUE);
sampleToAdd = std::min(sampleToAdd, MAX_SAMPLE_VALUE);
clientMix[s] = sampleToAdd;
}
sourceBuffers[b].transmitted = true;
}
}
sockaddr_in dest_address = agents[a].agent_addr;
sentBytes = sendto(handle, clientMix, BUFFER_LENGTH_BYTES,
0, (sockaddr *) &dest_address, sizeof(dest_address));
if (sentBytes < BUFFER_LENGTH_BYTES) {
std::cout << "Error sending mix packet! " << sentBytes << strerror(errno) << "\n";
}
}
}
gettimeofday(&now, NULL);
double usecToSleep = usecTimestamp(&startTime, (currentFrame * BUFFER_SEND_INTERVAL_USECS)) - usecTimestamp(&now);
if (usecToSleep > 0) {
usleep(usecToSleep);
} else {
std::cout << "NOT SLEEPING!";
}
currentFrame++;
}
pthread_exit(0);
}
struct process_arg_struct {
int16_t *packet_data;
sockaddr_in dest_address;
};
void *process_client_packet(void *args)
{
struct process_arg_struct *process_args = (struct process_arg_struct *) args;
sockaddr_in dest_address = process_args->dest_address;
if (addAgent(dest_address, process_args->packet_data)) {
std::cout << "Added agent: " <<
inet_ntoa(dest_address.sin_addr) << " on " <<
dest_address.sin_port << "\n";
}
pthread_exit(0);
}
bool different_clients(sockaddr_in addr1, sockaddr_in addr2)
{
return addr1.sin_addr.s_addr != addr2.sin_addr.s_addr ||
(addr1.sin_addr.s_addr == addr2.sin_addr.s_addr &&
addr1.sin_port != addr2.sin_port);
}
void white_noise_buffer_init() {
// open a pointer to the audio file
FILE *whiteNoiseFile = fopen("opera.raw", "r");
// get length of file
std::fseek(whiteNoiseFile, 0, SEEK_END);
whiteNoiseLength = std::ftell(whiteNoiseFile) / sizeof(int16_t);
std::rewind(whiteNoiseFile);
// read that amount of samples from the file
whiteNoiseBuffer = new int16_t[whiteNoiseLength];
std::fread(whiteNoiseBuffer, sizeof(int16_t), whiteNoiseLength, whiteNoiseFile);
// close it
std::fclose(whiteNoiseFile);
}
int main(int argc, const char * argv[])
{
timeval now, last_agent_update;
int received_bytes = 0;
// read in the workclub white noise file as a base layer of audio
white_noise_buffer_init();
int handle = network_init();
if (!handle) {
std::cout << "Failed to create listening socket.\n";
return 0;
} else {
std::cout << "Network Started. Waiting for packets.\n";
}
gettimeofday(&last_agent_update, NULL);
int16_t packet_data[BUFFER_LENGTH_SAMPLES];
for (int b = 0; b < MAX_SOURCE_BUFFERS; b++) {
sourceBuffers[b].transmitted = true;
}
struct send_buffer_struct send_buffer_args;
send_buffer_args.socket_handle = handle;
pthread_t buffer_send_thread;
pthread_create(&buffer_send_thread, NULL, send_buffer_thread, (void *)&send_buffer_args);
while (true) {
received_bytes = recvfrom(handle, (int16_t*)packet_data, BUFFER_LENGTH_BYTES,
0, (sockaddr*)&dest_address, &destLength);
if (ECHO_DEBUG_MODE) {
sendto(handle, packet_data, BUFFER_LENGTH_BYTES,
0, (sockaddr *) &dest_address, sizeof(dest_address));
} else {
struct process_arg_struct args;
args.packet_data = packet_data;
args.dest_address = dest_address;
pthread_t client_process_thread;
pthread_create(&client_process_thread, NULL, process_client_packet, (void *)&args);
pthread_join(client_process_thread, NULL);
}
}
pthread_join(buffer_send_thread, NULL);
return 0;
}

Some files were not shown because too many files have changed in this diff Show more