detectaMoeda.cxx 7.5 KB
Newer Older
1 2 3
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkBinaryThresholdImageFilter.h"
Clarissa's avatar
Clarissa committed
4 5
#include "itkImageRegionIterator.h"
#include "itkImageRegionConstIterator.h"
6
#include "itkImageFileWriter.h"
7 8 9
#include "itkBinaryMorphologicalClosingImageFilter.h"
#include "itkBinaryBallStructuringElement.h"

10 11
 
int main(int argc, char *argv[]) {
12

13 14 15 16 17
	if(argc < 2) { 
		std::cerr << "Usage: " << std::endl;
		std::cerr << argv[0] << " inputImageFile" << std::endl;
		return EXIT_FAILURE;
	}
18

19 20 21 22
	unsigned int MAX_COL, MAX_LIN;
	unsigned int i, j, diametro, maiorDiametro=0, maiorDiametroColuna=0, linhaMaior, colunaMaior, saiuDaMoeda=0, media;
	unsigned int hue, tamanhoLinha, tamanhoColuna, quant, inicioLinha, inicioColuna, aceito;
	unsigned char val;
23

24 25 26
	typedef itk::Image<unsigned char, 2>  ImageType;
	typedef itk::ImageFileReader<ImageType> ReaderType;
	typedef itk::Image<float, 2> FloatImageType;
27
 
28

29 30 31 32 33 34
	typedef itk::ImageFileReader<ImageType> ReaderType;
	ReaderType::Pointer reader = ReaderType::New();
	reader->SetFileName (argv[1]);
	reader->Update();


35 36 37 38
/*------------------------------------------------------------------------------*/
/* Binarização da Imagem                                                        */
/*------------------------------------------------------------------------------*/

39 40 41 42 43 44
	/* Definição para o Threshold */
	int lowerThreshold = 86;
	int upperThreshold = 255;
	
	/* Binary Threshold Image Filter */ 
	typedef itk::BinaryThresholdImageFilter <ImageType, ImageType> BinaryThresholdImageFilterType;
45
 
46 47 48 49 50 51
	BinaryThresholdImageFilterType::Pointer thresholdFilter = BinaryThresholdImageFilterType::New();
	thresholdFilter->SetInput(reader->GetOutput());
	thresholdFilter->SetLowerThreshold(lowerThreshold);
	thresholdFilter->SetUpperThreshold(upperThreshold);
	thresholdFilter->SetInsideValue(0);
	thresholdFilter->SetOutsideValue(255);
52 53
 

54 55 56 57 58

/*------------------------------------------------------------------------------*/
/* Melhoramento da Imagem                                                       */
/*------------------------------------------------------------------------------*/

59 60 61
	/* Closing Filter */
	ImageType::Pointer image = thresholdFilter->GetOutput();
 	// thresholdFilter->Update();
62

63 64 65 66
	typedef itk::BinaryBallStructuringElement<ImageType::PixelType, ImageType::ImageDimension> StructuringElementType;
	StructuringElementType structuringElement;
	structuringElement.SetRadius(5);
	structuringElement.CreateStructuringElement();
67

68 69 70 71
	typedef itk::BinaryMorphologicalClosingImageFilter <ImageType, ImageType, StructuringElementType> BinaryMorphologicalClosingImageFilterType;
	BinaryMorphologicalClosingImageFilterType::Pointer closingFilter = BinaryMorphologicalClosingImageFilterType::New();
	closingFilter->SetInput(image);
	closingFilter->SetKernel(structuringElement);
72

73
	closingFilter->Update();
74 75


Clarissa's avatar
Clarissa committed
76 77 78
/*------------------------------------------------------------------------------*/
/* Verificação da caixa interna                                                 */
/*------------------------------------------------------------------------------*/
79

80

81 82 83 84 85 86
	ImageType::Pointer image2 = closingFilter->GetOutput();
	ImageType::RegionType region2 = image2->GetLargestPossibleRegion();
	ImageType::SizeType size = region2.GetSize();

	MAX_COL = size[0];
	MAX_LIN = size[1];
87

88
	itk::ImageRegionConstIterator<ImageType> diameterIterator(image2,region2);
89

90 91 92 93 94 95 96 97
	i = 0;
	hue = 1;
	while((!diameterIterator.IsAtEnd()) && (hue)) {
		j = 0;
		tamanhoLinha = 0;
		while ( (j < MAX_COL) && (hue)) {
			
			val = diameterIterator.Get();
98

99 100 101
			if(val == 255) { 
				++tamanhoLinha;
			}
102

103 104 105 106
			if (tamanhoLinha > 1100) {
				hue = 0;
				linhaMaior = i;
			}
107

108 109 110
			++diameterIterator;
			++j;
		}
111

112 113
		++i;
	}
114

115 116
	inicioLinha = i+5;
	MAX_LIN = inicioLinha + 1230;
117

118 119 120



121 122 123 124 125
		tamanhoColuna = 0;
		for (j = 0; (j < MAX_LIN); ++j) {
			if(image->GetPixel({j, 0}) == 255)
				++tamanhoColuna; 
			}
Clarissa's avatar
Clarissa committed
126 127


128 129
		/* Caso a imagem esteja invertida */
		if(tamanhoColuna == MAX_LIN) {
Clarissa's avatar
Clarissa committed
130

131 132 133 134 135 136 137 138
			hue = 1;
			quant = 0;
			
			for (i = (MAX_COL-1); (i > 0) &&  (quant < 6) ; --i) {
				tamanhoColuna = 0;
				for (j = (MAX_LIN-1); (j > 0) && (hue) ; --j) {
					if(image->GetPixel({i, j}) == 255)
						++tamanhoColuna; 
139

140 141 142 143 144 145 146 147 148 149 150 151
					if(tamanhoColuna > 1100) {
						hue = 0;
						if(quant == 0) {
							maiorDiametroColuna = tamanhoColuna;
							colunaMaior = i;
						}
						++quant;
					}
					else
						quant = 0; 
				} 
			}
152

153 154
			inicioColuna = colunaMaior - 1090;
			MAX_COL = colunaMaior;
155

156
		}
157

158
		else {
159

160 161 162 163 164 165 166 167
			hue = 1;
			quant = 0;
			
			for (i = 0; (i < MAX_COL) &&  (quant < 6) ; ++i) {
				tamanhoColuna = 0;
				for (j = 0; (j < MAX_LIN) && (hue) ; ++j) {
					if(image->GetPixel({i, j}) == 255)
						++tamanhoColuna; 
168

169 170 171 172 173 174 175
					if(tamanhoColuna > 1100) {
						hue = 0;
						if(quant == 0) {
							maiorDiametroColuna = tamanhoColuna;
							colunaMaior = i;
						}
						++quant;
Clarissa's avatar
Clarissa committed
176

177 178 179 180 181
					}
					else
						quant = 0; 
				} 
			}
Clarissa's avatar
Clarissa committed
182

183 184
			inicioColuna = colunaMaior;   
			MAX_COL = colunaMaior + 1090;
185

186
		}
187 188


189

190 191 192
/*------------------------------------------------------------------------------*/
/* Encontrando o Diametro                                                       */
/*------------------------------------------------------------------------------*/ 
193

Clarissa's avatar
Clarissa committed
194

195 196 197 198 199 200 201
	colunaMaior = linhaMaior = 0;

	maiorDiametro = 0;
	maiorDiametroColuna = 0;

	aceito = 0;
	while(!aceito) {
202

203 204 205 206 207 208
		for (i = inicioLinha; i < MAX_LIN ; ++i) {
			diametro = 0;
			for (j = inicioColuna; j < MAX_COL ; ++j) {
				if(image->GetPixel({j, i}) == 0)
					diametro++; 
			}
209

210 211 212 213
			if (diametro > maiorDiametro) {
				maiorDiametro = diametro;
				linhaMaior = i;
			}
214

215
		}
216

217 218
		if(maiorDiametro < 410)
			aceito = 1;
219

220 221 222 223 224 225 226
		if (!aceito) {
			inicioLinha += 1;
			MAX_LIN -= 1;
			inicioColuna += 1;
			MAX_COL -= 1;
			maiorDiametro = 0;
		}
227

228
	}
229 230


231 232
	aceito = 0;
	while(!aceito) {
233

Clarissa's avatar
Clarissa committed
234

235 236 237 238 239 240
		for (j = inicioColuna; j < MAX_COL ; ++j) {
			diametro = 0;
			for (i = inicioLinha; i < MAX_LIN; ++i) {
				if(image->GetPixel({j, i}) == 0)
					diametro++; 
			}
Clarissa's avatar
Clarissa committed
241

242 243 244 245 246 247
			if (diametro > maiorDiametroColuna) {
				maiorDiametroColuna = diametro;
				colunaMaior = i;
			}
			 
		}
Clarissa's avatar
Clarissa committed
248

249 250
		if(maiorDiametroColuna < 410)
			aceito = 1;
Clarissa's avatar
Clarissa committed
251

252 253 254 255 256 257 258
		if (!aceito) {
			inicioColuna += 1;
			MAX_COL -= 1;
			inicioLinha += 1;
			MAX_LIN -= 1;
			maiorDiametroColuna = 0;
		}
259

260
	}
Clarissa's avatar
Clarissa committed
261

262 263

		media = (maiorDiametro + maiorDiametroColuna)/2;
264 265 266 267 268 269 270



/*------------------------------------------------------------------------------*/
/* Definindo a Moeda!                                                           */
/*------------------------------------------------------------------------------*/

271
	puts("");
272

273 274 275
	// Comparando o tamanho médio encontrado com as faixas de tamanhos
	if (media >= 280 && media <= 319)
		printf("R$ 0,10\n\n");
276

277 278
	else if (media >= 320 && media <= 334)
		printf("R$ 0,05\n\n");
279

280 281
	else if (media >= 335 && media <= 348)
		printf("R$ 0,50\n\n");
282

283 284
	else if (media >= 349 && media <= 354)
		printf("R$ 0,05\n\n");
Clarissa's avatar
Clarissa committed
285

286 287
	else if (media >= 355 && media <= 376)
		printf("R$ 0,25\n\n");
288
	
289 290
	else if (media >= 377 && media <= 410)
		printf("R$ 1,00\n\n");
291

292 293 294
	else
		printf("Moeda nao identificada :( \n\n");
	
295

296

297 298 299 300
/*------------------------------------------------------------------------------*/
/* Imprimindo a moeda que foi verificada                                        */
/*------------------------------------------------------------------------------*/

301
	// ImageType::Pointer output = closingFilter->GetOutput();
302

303 304 305 306 307
	// typedef itk::ImageFileWriter<ImageType> WriterType;
	// WriterType::Pointer outputWriter = WriterType::New();
	// outputWriter->SetFileName("output.png");
	// outputWriter->SetInput(output);
	// outputWriter->Update();
Clarissa's avatar
Clarissa committed
308

309
 
310
	return EXIT_SUCCESS;
311
}
312