2018-11-13 15:48:02 +01:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2018 dimercur
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _IMAGE_H_
|
|
|
|
#define _IMAGE_H_
|
2018-08-27 16:39:49 +02:00
|
|
|
|
|
|
|
#ifndef __STUB__
|
2018-11-07 11:32:19 +01:00
|
|
|
#ifndef __FOR_PC__
|
2018-08-27 16:39:49 +02:00
|
|
|
#include <raspicam/raspicam_cv.h>
|
|
|
|
#else
|
|
|
|
#include <opencv2/highgui/highgui.hpp>
|
2018-11-07 11:32:19 +01:00
|
|
|
#endif /* __FOR_PC__ */
|
|
|
|
#else
|
|
|
|
#include <opencv2/highgui/highgui.hpp>
|
2018-08-27 16:39:49 +02:00
|
|
|
#endif
|
|
|
|
#include "opencv2/imgproc/imgproc.hpp"
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
#define WIDTH 480 //1280 1024 640 480
|
|
|
|
#define HEIGHT 360 // 960 768 480 360
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
using namespace cv;
|
|
|
|
#ifndef __STUB__
|
2018-11-07 11:32:19 +01:00
|
|
|
#ifndef __FOR_PC__
|
2018-08-27 16:39:49 +02:00
|
|
|
using namespace raspicam;
|
2018-11-07 11:32:19 +01:00
|
|
|
#endif /* __FOR_PC__ */
|
2018-08-27 16:39:49 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef Mat Image;
|
|
|
|
#ifndef __STUB__
|
2018-11-07 11:32:19 +01:00
|
|
|
#ifndef __FOR_PC__
|
2018-08-27 16:39:49 +02:00
|
|
|
typedef RaspiCam_Cv Camera;
|
|
|
|
#else
|
|
|
|
typedef int Camera;
|
2018-11-07 11:32:19 +01:00
|
|
|
#endif /* __FOR_PC__ */
|
|
|
|
#else
|
|
|
|
typedef int Camera;
|
2018-08-27 16:39:49 +02:00
|
|
|
#endif
|
2018-11-07 11:32:19 +01:00
|
|
|
|
2018-08-27 16:39:49 +02:00
|
|
|
typedef Rect Arene;
|
|
|
|
typedef vector<unsigned char> Jpg;
|
|
|
|
|
|
|
|
struct Position {
|
|
|
|
Point center;
|
|
|
|
Point direction;
|
|
|
|
float angle;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2018-11-13 15:48:02 +01:00
|
|
|
* \brief Ouvre une camera.
|
|
|
|
* \details Met à jour le descripteur de fichier passé en paramètre pour correspondre à la camera ouverte
|
2018-08-27 16:39:49 +02:00
|
|
|
*
|
2018-11-13 15:48:02 +01:00
|
|
|
* \param camera Pointeur d'un file descriptor d'une camera ouverte
|
|
|
|
* \return Retourne 0 si la camera a été ouverte correctement et -1 si une erreur survient.
|
2018-08-27 16:39:49 +02:00
|
|
|
*/
|
|
|
|
int open_camera(Camera *camera);
|
|
|
|
|
|
|
|
/**
|
2018-11-13 15:48:02 +01:00
|
|
|
* \brief Ferme la camera passé en paramètre
|
2018-08-27 16:39:49 +02:00
|
|
|
*
|
2018-11-13 15:48:02 +01:00
|
|
|
* \param camera Pointeur sur la camera à fermer
|
2018-08-27 16:39:49 +02:00
|
|
|
*/
|
|
|
|
void close_camera(Camera *camera);
|
|
|
|
|
|
|
|
/**
|
2018-11-13 15:48:02 +01:00
|
|
|
* \brief Capture une image avec la camera passée en entrée. En cas de test sans camera, la fonction charge une image
|
|
|
|
* \details La camera doit préalablement être ouverte via \a openCamera(...)
|
2018-08-27 16:39:49 +02:00
|
|
|
*
|
2018-11-13 15:48:02 +01:00
|
|
|
* \param camera Pointeur sur la camera passée en entrée.
|
|
|
|
* \param monImage Pointeur sur une image capturée.
|
|
|
|
* \param fichier Chemin du fichier d'image
|
|
|
|
* \return Retourne -1 si une erreur survient.
|
2018-08-27 16:39:49 +02:00
|
|
|
*/
|
|
|
|
void get_image(Camera *camera, Image * monImage, const char *fichier = NULL);
|
|
|
|
|
|
|
|
/**
|
2018-11-13 15:48:02 +01:00
|
|
|
* \brief Détecte une arène dans une image fournis en paramètre.
|
2018-08-27 16:39:49 +02:00
|
|
|
*
|
2018-11-13 15:48:02 +01:00
|
|
|
* \param monImage Pointeur sur l'image d'entrée
|
|
|
|
* \param rectangle Pointeur sur les coordonnées du rectangles trouvé.
|
|
|
|
* \return Retourne -1 si aucune arène n'est détectée. Sinon retourne 0
|
2018-08-27 16:39:49 +02:00
|
|
|
*/
|
|
|
|
int detect_arena(Image *monImage, Arene *rectangle);
|
|
|
|
|
|
|
|
/**
|
2018-11-13 15:48:02 +01:00
|
|
|
* \brief Dessine le plus petit rectangle contenant l'arène
|
2018-08-27 16:39:49 +02:00
|
|
|
|
2018-11-13 15:48:02 +01:00
|
|
|
* \param imgInput Pointeur sur l'image d'entrée.
|
|
|
|
* \param imgOutput Pointeur sur l'image de sortie (image d'entrée + arène marquée)
|
|
|
|
* \param monArene Pointeur de type Arène contenant les information à dessiner
|
2018-08-27 16:39:49 +02:00
|
|
|
*/
|
|
|
|
void draw_arena(Image *imgInput, Image *imgOutput, Arene *monArene);
|
|
|
|
|
|
|
|
/**
|
2018-11-13 15:48:02 +01:00
|
|
|
* \brief Détecte la position d'un robot.
|
|
|
|
* \details Détecte la position de triangles blanc sur une image /a imgInput passé en paramètre d'entrer.
|
2018-08-27 16:39:49 +02:00
|
|
|
*
|
2018-11-13 15:48:02 +01:00
|
|
|
* \param imgInput Pointeur sur l'image sur laquelle chercher la position du des robots.
|
|
|
|
* \param posTriangle Pointeur sur un tableau de position ou seront stocké les positions des triangles détectés.
|
|
|
|
* \param monArene Pointeur de type Arène si nécessaire d'affiner la recherche (optionnel)
|
|
|
|
* \return Le nombre de triangles détectés.
|
2018-08-27 16:39:49 +02:00
|
|
|
*/
|
|
|
|
int detect_position(Image *imgInput, Position *posTriangle, Arene * monArene = NULL);
|
|
|
|
|
|
|
|
/**
|
2018-11-13 15:48:02 +01:00
|
|
|
* \brief Dessine sur une image en entrée la position d'un robot et sa direction.
|
|
|
|
* \details Sauvegarde l'image des coordonnées passées par positionRobot superposée à l'image d'entrée sur imgOutput.
|
2018-08-27 16:39:49 +02:00
|
|
|
*
|
2018-11-13 15:48:02 +01:00
|
|
|
* \param imgInput Pointeur sur l'image d'entrée
|
|
|
|
* \param imgOutput Pointeur sur l'image de sortie ( image d'entrée + dessin de la position)
|
|
|
|
* \param positionRobot Pointeur sur la structure position d'un robot.
|
2018-08-27 16:39:49 +02:00
|
|
|
*/
|
|
|
|
void draw_position(Image *imgInput, Image *imgOutput, Position *positionRobot);
|
|
|
|
|
|
|
|
/**
|
2018-11-13 15:48:02 +01:00
|
|
|
* \brief Détecte la position d'un robot.
|
|
|
|
* \details Détecte la position de triangles blanc sur une image /a imgInput passé en paramètre d'entrer.
|
2018-08-27 16:39:49 +02:00
|
|
|
*
|
2018-11-13 15:48:02 +01:00
|
|
|
* \param imgInput Pointeur sur l'image à sauvegarder en mémoire sous format jpg.
|
|
|
|
* \param imageCompress Pointeur sur une image .jpg.
|
2018-08-27 16:39:49 +02:00
|
|
|
*/
|
|
|
|
void compress_image(Image *imgInput, Jpg *imageCompress);
|
|
|
|
|
2018-11-13 15:48:02 +01:00
|
|
|
#endif // _IMAGE_H_
|