summaryrefslogtreecommitdiff
path: root/2005/i/robert/src/ovision/see/segm.cc
blob: f194ce2deb45d805d80f15ad9b7b37427ec3e0a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// segm.cc - Classe Segmentation
// robert - Programme du robot APBteam
// Copyright (C) 2005 Olivier Gaillard

/// @file segm.cc Segmente l'image et cree un tableau contenant des valeurs segmentees, creation du reseau de neurones
#include "segm.hh"
#include <iostream>
#include <stdlib.h>

/// Constructor Segm
Segm::Segm () 
    : index_ (0), node_ (0), lumPos_ (-1)
{
    oconfig_= OConfig::getInstance ();
    nbOutput_= oconfig_->nnNbColor;
}

/// Destructor Segm
Segm::~Segm ()
{
    delete [] node_;
    delete [] index_;
}

/// Affiche les poids du reseau de neurones (neural network : NN)
void 
Segm::showNodes () const 
{
    // Affichage des poids du NN
    std::cout << "Poids:\n";
    for(int i=0; i<nbOutput_; i++)
	std::cout << "\t" << (int)node_[i*3] << " "
	    << (int)node_[i*3+1] << " " << (int)node_[i*3+2] << "\n";
    std::cout << std::endl;
}

/// Segmente l'image avec le reseau de neurones
void 
Segm::segmImg (Img *img) 
{
    // Initialisation
    unsigned char* d = img->tabData_;
    delete [] img->tabSegm_;
    img->tabSegm_= new unsigned char[img->nbPixels_];
    unsigned char *s = img->tabSegm_;
    // Parcours de l'image pour la segmentation
    // On recupere l'indextabSegm_et non le numero de sortie du NN
    for (unsigned long i=0; i<img->nbPixels_; i++) 
      {
	*(s++) = index_[giveColor (d)];
	d += 3;
      }
}

/// Segmente l'image pour une seule couleur uniquement et permet donc d'isoler une couleur
/// @param numColor numero de la couleur a isoler
void 
Segm::segmImg (Img *img, const int numColor) 
{
    unsigned char* d = img->tabData_;
    delete [] img->tabSegm_;
    img->tabSegm_= new unsigned char[img->nbPixels_];
    unsigned char *s = img->tabSegm_;
    // Parcours de l'image pour la segmentation
    for (unsigned long i=0; i<img->nbPixels_; i++) 
      {
	numColor == index_[giveColor (d)] ? *s = 1 : *s = 0;
	++s;
	d += 3;
      }
}

/// Configure le mode de couleur utilis�
void 
Segm::setMode (const Image::PixelFormat color)
{
    switch (color)
      {
      case Image::rgb: lumPos_= -1; break;
      case Image::yuv: lumPos_= 0; break;
      case Image::hsi: lumPos_= 2; break;
      default: lumPos_= -1;
      }
}