Browse Source

Initial commit

Phyks (Lucas Verney) 5 years ago
commit
80a0b2dd97
39 changed files with 1875 additions and 0 deletions
  1. BIN
      29.bmp
  2. BIN
      29.jpg
  3. BIN
      29_grey.jpg
  4. BIN
      30.jpg
  5. BIN
      30_small.jpg
  6. BIN
      31.jpg
  7. BIN
      Algorithm.pdf
  8. BIN
      IMG_0114b.JPG
  9. BIN
      IMG_0114s.JPG
  10. BIN
      IMG_0114s.bmp
  11. BIN
      IMG_0115b.JPG
  12. BIN
      IMG_0115s.JPG
  13. BIN
      Left.JPG
  14. BIN
      Left2.JPG
  15. 3
    0
      Notes valeurs de D, f et deltaX
  16. 30
    0
      RGB2grey.c
  17. BIN
      Rapport/IMG_0114s.JPG
  18. BIN
      Rapport/IMG_0115s.JPG
  19. BIN
      Rapport/Left.JPG
  20. BIN
      Rapport/Right.JPG
  21. 27
    0
      Rapport/biblio.bib
  22. 42
    0
      Rapport/rapport.aux
  23. 30
    0
      Rapport/rapport.bbl
  24. 49
    0
      Rapport/rapport.blg
  25. 6
    0
      Rapport/rapport.out
  26. BIN
      Rapport/rapport.pdf
  27. 101
    0
      Rapport/rapport.tex
  28. BIN
      Right.JPG
  29. BIN
      Right2.JPG
  30. BIN
      Stereoscopy_(Mrovlje).pdf
  31. BIN
      Test.gif
  32. BIN
      TestL.jpg
  33. BIN
      TestR.jpg
  34. BIN
      bmp
  35. 165
    0
      bmp.c
  36. 10
    0
      makefile
  37. 75
    0
      sobel.c
  38. BIN
      stereo
  39. 1337
    0
      stereo.c

BIN
29.bmp View File


BIN
29.jpg View File


BIN
29_grey.jpg View File


BIN
30.jpg View File


BIN
30_small.jpg View File


BIN
31.jpg View File


BIN
Algorithm.pdf View File


BIN
IMG_0114b.JPG View File


BIN
IMG_0114s.JPG View File


BIN
IMG_0114s.bmp View File


BIN
IMG_0115b.JPG View File


BIN
IMG_0115s.JPG View File


BIN
Left.JPG View File


BIN
Left2.JPG View File


+ 3
- 0
Notes valeurs de D, f et deltaX View File

@@ -0,0 +1,3 @@
1
+D = 36mm
2
+f = 38mm
3
+deltaX = 8cm

+ 30
- 0
RGB2grey.c View File

@@ -0,0 +1,30 @@
1
+unsigned char** RGB2grey(unsigned char*** image, int width, int height)
2
+{
3
+	unsigned char** grey;
4
+	int x,y;
5
+	
6
+	if((grey = malloc(sizeof(*grey) * height)) == NULL)
7
+	{
8
+		perror("malloc:");
9
+		return NULL;
10
+	}
11
+	for(y = 0; y <= height; y++)
12
+	{
13
+		if((grey[y] = malloc(sizeof(**grey) * width)) == NULL)
14
+		{
15
+			perror("malloc:");
16
+			return NULL;
17
+		}
18
+	}
19
+	
20
+	for(y = 0; y <= height; y++)
21
+	{
22
+		for(x = 0; x <= width; x++)
23
+		{
24
+			grey[y][x] = (unsigned char) (0.2125*image[y][x][0] + 0.7154*image[y][x][1] + 0.0721*image[y][x][2]);
25
+			//Formula found here : https://fr.wikipedia.org/wiki/Niveau_de_gris
26
+		}
27
+	}
28
+	
29
+	return grey;
30
+}

BIN
Rapport/IMG_0114s.JPG View File


BIN
Rapport/IMG_0115s.JPG View File


BIN
Rapport/Left.JPG View File


BIN
Rapport/Right.JPG View File


+ 27
- 0
Rapport/biblio.bib View File

@@ -0,0 +1,27 @@
1
+@misc{article,
2
+title = {Distance Estimation Algorithm for Stereo Pair Images},
3
+author = {TjandranegaraB, Edwin},
4
+howpublished="\url{http://docs.lib.purdue.edu/ecetr/64/}",
5
+year = {article daté de 2005, dernière consultation en décembre 2012},
6
+}
7
+
8
+@misc{article2,
9
+title = {Distance measuring based on stereoscopic pictures},
10
+author = {Mrovlje1, Jernej and Vranči, Damir},
11
+howpublished="\url{http://photon07.pd.infn.it:5210/users/dazzi/Thesis_doctorate/Info/Chapter_6/Stereoscopy_(Mrovlje).pdf}",
12
+year = {article daté de 2008, dernière consultation en décembre 2012},
13
+}
14
+
15
+@misc{templateMatching,
16
+title = {OpenCV wiki page about template matching},
17
+author = {},
18
+howpublished="\url{http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html}",
19
+year = {dernière consultation en janvier 2013},
20
+}
21
+
22
+@misc{phaseCorrelation,
23
+title = {Wikipedia page about phase correlation},
24
+author = {},
25
+howpublished="\url{http://en.wikipedia.org/wiki/Phase_correlation}",
26
+year = {dernière consultation en janvier 2013},
27
+}

+ 42
- 0
Rapport/rapport.aux View File

@@ -0,0 +1,42 @@
1
+\relax 
2
+\providecommand\hyper@newdestlabel[2]{}
3
+\catcode`:\active
4
+\catcode`;\active
5
+\catcode`!\active
6
+\catcode`?\active
7
+\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
8
+\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
9
+\global\let\oldcontentsline\contentsline
10
+\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
11
+\global\let\oldnewlabel\newlabel
12
+\gdef\newlabel#1#2{\newlabelxx{#1}#2}
13
+\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
14
+\AtEndDocument{\ifx\hyper@anchor\@undefined
15
+\let\contentsline\oldcontentsline
16
+\let\newlabel\oldnewlabel
17
+\fi}
18
+\fi}
19
+\global\let\hyper@last\relax 
20
+\gdef\HyperFirstAtBeginDocument#1{#1}
21
+\providecommand\HyField@AuxAddToFields[1]{}
22
+\providecommand\HyField@AuxAddToCoFields[2]{}
23
+\select@language{french}
24
+\@writefile{toc}{\select@language{french}}
25
+\@writefile{lof}{\select@language{french}}
26
+\@writefile{lot}{\select@language{french}}
27
+\@writefile{toc}{\contentsline {section}{\numberline {1}Objectif}{1}{section.1}}
28
+\@writefile{toc}{\contentsline {section}{\numberline {2}M\IeC {\'e}thode choisie}{1}{section.2}}
29
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Distance euclidienne dans l'espace RGB}{1}{subsection.2.1}}
30
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Cross-correlation \emph  {via} FFT}{1}{subsection.2.2}}
31
+\citation{article}
32
+\citation{article2}
33
+\citation{templateMatching}
34
+\citation{phaseCorrelation}
35
+\bibstyle{plain-fr}
36
+\bibdata{biblio}
37
+\bibcite{templateMatching}{1}
38
+\@writefile{toc}{\contentsline {section}{\numberline {3}R\IeC {\'e}sultats}{2}{section.3}}
39
+\@writefile{toc}{\contentsline {section}{\numberline {4}Optimisations possibles}{2}{section.4}}
40
+\bibcite{phaseCorrelation}{2}
41
+\bibcite{article2}{3}
42
+\bibcite{article}{4}

+ 30
- 0
Rapport/rapport.bbl View File

@@ -0,0 +1,30 @@
1
+\begin{thebibliography}{1}
2
+\expandafter\ifx\csname fonteauteurs\endcsname\relax
3
+\def\fonteauteurs{\scshape}\fi
4
+
5
+\bibitem{templateMatching}
6
+Opencv wiki page about template matching.
7
+\newblock
8
+  \url{http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html},
9
+  dernière consultation en janvier 2013.
10
+
11
+\bibitem{phaseCorrelation}
12
+Wikipedia page about phase correlation.
13
+\newblock \url{http://en.wikipedia.org/wiki/Phase_correlation}, dernière
14
+  consultation en janvier 2013.
15
+
16
+\bibitem{article2}
17
+Jernej \bgroup\fonteauteurs\bgroup Mrovlje1\egroup\egroup{} et Damir
18
+  \bgroup\fonteauteurs\bgroup Vranči\egroup\egroup{} :
19
+\newblock Distance measuring based on stereoscopic pictures.
20
+\newblock
21
+  \url{http://photon07.pd.infn.it:5210/users/dazzi/Thesis_doctorate/Info/Chapter_6/Stereoscopy_(Mrovlje).pdf},
22
+  article daté de 2008, dernière consultation en décembre 2012.
23
+
24
+\bibitem{article}
25
+Edwin \bgroup\fonteauteurs\bgroup TjandranegaraB\egroup\egroup{} :
26
+\newblock Distance estimation algorithm for stereo pair images.
27
+\newblock \url{http://docs.lib.purdue.edu/ecetr/64/}, article daté de 2005,
28
+  dernière consultation en décembre 2012.
29
+
30
+\end{thebibliography}

+ 49
- 0
Rapport/rapport.blg View File

@@ -0,0 +1,49 @@
1
+This is BibTeX, Version 0.99d (TeX Live 2012/Arch Linux)
2
+Capacity: max_strings=35307, hash_size=35307, hash_prime=30011
3
+The top-level auxiliary file: rapport.aux
4
+The style file: plain-fr.bst
5
+Database file #1: biblio.bib
6
+Warning--to sort, need author or key in templateMatching
7
+Warning--to sort, need author or key in phaseCorrelation
8
+You've used 4 entries,
9
+            2238 wiz_defined-function locations,
10
+            554 strings with 5349 characters,
11
+and the built_in function-call counts, 936 in all, are:
12
+= -- 99
13
+> -- 21
14
+< -- 0
15
++ -- 10
16
+- -- 6
17
+* -- 34
18
+:= -- 174
19
+add.period$ -- 8
20
+call.type$ -- 4
21
+change.case$ -- 15
22
+chr.to.int$ -- 0
23
+cite$ -- 6
24
+duplicate$ -- 28
25
+empty$ -- 93
26
+format.name$ -- 6
27
+if$ -- 213
28
+int.to.chr$ -- 0
29
+int.to.str$ -- 4
30
+missing$ -- 0
31
+newline$ -- 23
32
+num.names$ -- 4
33
+pop$ -- 33
34
+preamble$ -- 1
35
+purify$ -- 11
36
+quote$ -- 0
37
+skip$ -- 28
38
+stack$ -- 0
39
+substring$ -- 44
40
+swap$ -- 4
41
+text.length$ -- 0
42
+text.prefix$ -- 0
43
+top$ -- 0
44
+type$ -- 16
45
+warning$ -- 2
46
+while$ -- 4
47
+width$ -- 5
48
+write$ -- 40
49
+(There were 2 warnings)

+ 6
- 0
Rapport/rapport.out View File

@@ -0,0 +1,6 @@
1
+\BOOKMARK [1][-]{section.1}{Objectif}{}% 1
2
+\BOOKMARK [1][-]{section.2}{M\351thode choisie}{}% 2
3
+\BOOKMARK [2][-]{subsection.2.1}{Distance euclidienne dans l'espace RGB}{section.2}% 3
4
+\BOOKMARK [2][-]{subsection.2.2}{Cross-correlation via FFT}{section.2}% 4
5
+\BOOKMARK [1][-]{section.3}{R\351sultats}{}% 5
6
+\BOOKMARK [1][-]{section.4}{Optimisations possibles}{}% 6

BIN
Rapport/rapport.pdf View File


+ 101
- 0
Rapport/rapport.tex View File

@@ -0,0 +1,101 @@
1
+\documentclass[10pt,a4paper]{article}
2
+\usepackage{ifpdf}
3
+\usepackage[utf8]{inputenc}
4
+\usepackage[T1]{fontenc}
5
+\usepackage[francais]{babel}
6
+\usepackage{lmodern}
7
+\usepackage{graphicx}
8
+\usepackage{amsmath}
9
+\usepackage{amsfonts}
10
+\usepackage{amssymb}
11
+\usepackage{enumitem}
12
+\usepackage[margin=1.5cm]{geometry}
13
+\usepackage{hyperref}
14
+\usepackage{url}
15
+
16
+\title{Projet de Physique Numérique : Mesure de distances par stéréoscopie}
17
+\author{Lucas Verney}
18
+\date{2012/2013}
19
+\ifpdf
20
+\pdfinfo {
21
+	/Author (Lucas Verney)
22
+	/Title (Projet de Physique Numérique : Mesure de distances par stéréoscopie)
23
+}
24
+\fi
25
+\begin{document}
26
+	\maketitle
27
+	
28
+	\section{Objectif}
29
+		Le but de ce projet était de déterminer des distances séparant un observateur d'un objet à partir de deux photos de cet objet prises en déplaçant horizontalement l'appareil entre les prises de vue. En utilisant la stéréoscopie, on peut en effet déterminer la distance nous séparant de l'objet, tout comme notre cerveau est capable d'estimer les distances nous séparant des objets à partir des ``images'' captées par nos yeux.
30
+		
31
+		\bigskip
32
+		
33
+		\underline{\emph{Exemple :}}
34
+		\medskip
35
+		
36
+		\begin{center}
37
+			\begin{tabular}{cc}
38
+				\includegraphics[scale=0.25]{IMG_0114s.JPG} & \includegraphics[scale=0.25]{IMG_0115s.JPG} \\
39
+				\emph{Image de gauche} & \emph{Image de droite} \\
40
+			\end{tabular}
41
+		\end{center}
42
+		
43
+	\section{Méthode choisie}
44
+		Il faut, dans un premier temps, déterminer le déplacement en pixels de l'objet entre les deux images. Dans un deuxième temps, il faut traduire ce déplacement en distance réelle nous séparant de l'objet.
45
+		
46
+		\subsection{Distance euclidienne dans l'espace RGB}
47
+			Pour déterminer le déplacement en pixels, on considère une grille de $n\times n$ pixels, qu'on superpose à notre image de gauche (par défaut, $n = 50$ dans le programme). Pour chaque carrés de $n\times n$ pixels, on cherche le carré qui lui correspond le plus dans l'image de droite. Pour ce faire, on va parcourir chaque pixel de l'image de droite et comparer le carré de l'image de gauche et le carré dont le coin supérieur gauche est le pixel courant dans l'image de droite. 
48
+		
49
+			Les images étant chargées en couleur (RGB), on est dans un espace à trois dimensions (R, G et B) dont les coordonnées des pixels sont entre $0$ et $255$ (profondeur de couleur de 8 bits). On peut donc estimer la ``distance'' séparant les deux carrés par la moyenne sur le carré des distances pixel à pixel où la distance pixel à pixel est la distance euclidienne standard ($=\sqrt{(R_2 - R_1)^2 + (G_2 - G_1)^2 + (B_2 - B_1)^2}$).
50
+		
51
+		\subsection{Cross-correlation \emph{via} FFT}
52
+			Une autre possibilité est d'utiliser la cross-correlation (ou la phase correlation) afin de déterminer la position de notre objet.
53
+			
54
+			On commence par charger les images en niveaux de gris et on récupère le carré qu'on considère dans une nouvelle image, de la même taille que l'image de droite. On complète cette image par du noir (des 0) qui n'interviendront donc pas dans la transformation de Fourier.
55
+			
56
+			On effectue ensuite les transformations de fourier de chaque image et on multiplie le spectre de l'image de droite par le conjugué du spectre du carré dont on cherche la position. On normalise ensuite la transformation de Fourier (en divisant chaque la valeur de chaque point par son module) et on repasse en espace réel (\emph{via} une transformation de Fourier inverse.
57
+			
58
+			On cherche ensuite la valeur de la plus grande amplitude sur cette image, qui correspond à la position du carré qu'on cherche.
59
+		
60
+		\bigskip
61
+		
62
+		Une fois cette distance déterminée, on peut en déduire la distance nous séparant de l'objet en utilisant les formules explicitées dans \cite{article}. Connaissant les caractéristiques de l'appareil, il est facile de traduire le déplacement en pixels précédent en distance réelle.
63
+	
64
+	\section{Résultats}
65
+		Le programme obtenu a été testée sur le jeu d'images suivant (les tests ont été effectués en considérant le coin inférieur gauche du carré noir) :
66
+		
67
+		\begin{center}
68
+			\begin{tabular}{cc}
69
+				\includegraphics[scale=0.05]{Left.JPG} & \includegraphics[scale=0.05]{Right.JPG} \\
70
+				\emph{Image de gauche} & \emph{Image de droite} \\
71
+			\end{tabular}
72
+		\end{center}
73
+		
74
+		Le programme décrit précédemment permet de déterminer très précisément le déplacement du coin inférieur gauche et on ne peut obtenir une meilleure précision manuellement. Ce résultat a été obtenu en une vingtaine de secondes en utilisant les $4$ c{\oe}urs du processeur, ce qui est relativement long. En effet, pour parcourir toute l'image avec la méthode précédente et des carrés de $50$ pixels de large, il faudrait environ $30h$.
75
+		
76
+		Après conversion du déplacement en pixels en distance réelle, on trouve une distance réelle de $15cm$ contre $35cm$ en réalité (en utilisant des caractéristiques ``moyennes'' pour l'appareil photo). Cependant, le déplacement étant convenablement détecté, cet écart provient d'une méconnaissance des caractéristiques précises de l'appareil photo utilisé (notamment sa distance focale).
77
+		
78
+		En conclusion, cette technique nous permet de déterminer des distances très précisément mais est très coûteuse en ressources et il est difficilement envisageable de couvrir une photo entière avec cette méthode.
79
+		
80
+		La technique utilisant la transformée de fourier rapide est nettement plus rapide (une vingtaine de secondes par image) et donne des résultats légèrement moins précis mais largement comparables.
81
+		
82
+		\medskip
83
+		\emph{Remarque :} Il faut également noter qu'on ne détermine pas la distance nous séparant d'un objet (ou d'un point) précis mais une moyenne de cette distance sur un carré de $n$ pixels de large. Il faut donc choisir la taille de ce carré petite devant l'échelle caractéristique de variation des distances (liée à la taille transversale des objets).
84
+		
85
+		\emph{Remarque :} On peut également utiliser un algorithme de détection de contours (type filtre de Sobel qui calcule le ``gradient'' de l'image) pour travailler sur une image en niveau de gris et déterminer les distances nous séparant des contours des objets, ceci afin d'obtenir une meilleure précision sur des images chargées.
86
+	
87
+	\section{Optimisations possibles}
88
+		Comme on l'a vu précédemment, la méthode employée est très coûteuse en ressources. On peut envisager diverses optimisations :
89
+		\begin{itemize}
90
+			\item On peut envisager d'appliquer un filtre de détection de contours (type filtre de Sobel) avant de travailler sur l'image. On peut alors se restreindre aux zones d'intérêt, c'est-à-dire aux contours représentés par des pixels blancs.
91
+			\item Pour accélérer le calcul des distances, on peut envisager de paralléliser au maximum les opérations. Dans le code présenté, on utilise jusqu'à $4$ c{\oe}urs du processeur mais l'utilisation de la puce graphique pourrait accélérer le calcul, celle-ci travaillant naturellement avec des calculs parallèles.
92
+			\item Jusqu'ici, on n'a envisagé qu'un déplacement horizontal (ou vertical en travaillant sur une image retournée). On pourrait envisager le cas d'un déplacement quelconque dans l'espace (translation) en adaptant les formules.
93
+		\end{itemize}
94
+	
95
+	\nocite{article2}
96
+	\nocite{templateMatching}
97
+	\nocite{phaseCorrelation}
98
+	
99
+	\bibliographystyle{plain-fr}
100
+	\bibliography{biblio}
101
+\end{document}

BIN
Right.JPG View File


BIN
Right2.JPG View File


BIN
Stereoscopy_(Mrovlje).pdf View File


BIN
Test.gif View File


BIN
TestL.jpg View File


BIN
TestR.jpg View File


BIN
bmp View File


+ 165
- 0
bmp.c View File

@@ -0,0 +1,165 @@
1
+#include <stdio.h>
2
+#include <stdlib.h>
3
+#include <string.h>
4
+
5
+//Note : BMP files are written from left to right but from bottom to top !
6
+
7
+struct file_header
8
+{
9
+	char signature[3];
10
+	int size;
11
+	int reserved;
12
+	int offset;
13
+};
14
+
15
+struct img_header
16
+{
17
+	int headerSize;
18
+	int width;
19
+	int height;
20
+	int planes;
21
+	int depth;
22
+	int compress;
23
+	int imgSize;
24
+	int resX;
25
+	int resY;
26
+	int colors;
27
+	int importantColors;
28
+};
29
+
30
+struct file_header get_file_header(FILE* file)
31
+{
32
+	struct file_header fh={"", 0, 0, 0};
33
+	
34
+	fread(&fh.signature, 2, 1, file);
35
+	fread(&fh.size, 4, 1, file);
36
+	fread(&fh.reserved, 4, 1, file);
37
+	fread(&fh.offset, 4, 1, file);
38
+	
39
+	return fh;
40
+}
41
+
42
+struct img_header get_img_header(FILE* file)
43
+{
44
+	struct img_header ih={0,0,0,0,0,0,0,0,0,0,0};
45
+	
46
+	fread(&ih.headerSize, 4, 1, file);
47
+	fread(&ih.width, 4, 1, file);
48
+	fread(&ih.height, 4, 1, file);
49
+	fread(&ih.planes, 2, 1, file);
50
+	fread(&ih.depth, 2, 1, file);
51
+	fread(&ih.compress, 4, 1, file);
52
+	fread(&ih.imgSize, 4, 1, file);
53
+	fread(&ih.resX, 4, 1, file);
54
+	fread(&ih.resY, 4, 1, file);
55
+	fread(&ih.colors, 4, 1, file);
56
+	fread(&ih.importantColors, 4, 1, file);
57
+	
58
+	return ih;
59
+}
60
+
61
+int main (int argc, char* argv[])
62
+{
63
+	if(argc < 2)
64
+	{
65
+		fprintf(stderr, "Error : you must specify a bmp image to open.\n");
66
+		return EXIT_FAILURE;
67
+	}
68
+	
69
+	//All the variables we'll use
70
+	FILE *file;
71
+	const char* filename;
72
+	filename = argv[1];
73
+	struct file_header fileHeader;
74
+	struct img_header imageHeader;
75
+	int x, y, yImage;
76
+	unsigned char ***image;
77
+	
78
+	file = fopen(filename, "rb"); //First, open the file in binary mode
79
+	
80
+	if(file == NULL)
81
+	{
82
+		fprintf(stderr, "Error : can't open the bmp image.\n");
83
+		return EXIT_FAILURE;
84
+	}
85
+	
86
+	fileHeader = get_file_header(file); //Get the file header and check it is a bmp file
87
+	
88
+	if(strcmp(fileHeader.signature, "BM") != 0 && strcmp(fileHeader.signature, "BA") != 0 && strcmp(fileHeader.signature, "CI") != 0 && strcmp(fileHeader.signature, "CP") != 0 && strcmp(fileHeader.signature, "IC") != 0 && strcmp(fileHeader.signature, "PT") != 0)
89
+	{
90
+		fprintf(stderr, "Error : This file is not a valid BMP image.\n");
91
+		return EXIT_FAILURE;
92
+	}
93
+	
94
+	imageHeader = get_img_header(file); //Get the image header
95
+	
96
+	if(imageHeader.compress != 0)
97
+	{
98
+		fprintf(stderr, "Error : The BMP file is compressed. This program can't open such files.\n");
99
+		return EXIT_FAILURE;
100
+	}
101
+	
102
+	if(imageHeader.depth != 24) //If it is not a "true-color" RGB bmp file (ie 24 bits per pixel)
103
+	{
104
+		fprintf(stderr, "Error : This BMP is not a standard true-color BMP file. It may be a 256 colors BMP file for example.\n");
105
+		return EXIT_FAILURE;
106
+	}
107
+	
108
+	//Allocation dynamique pour l'image
109
+	if((image = malloc(sizeof(*image) * imageHeader.height)) == NULL)
110
+	{
111
+		perror("malloc:");
112
+		return EXIT_FAILURE;
113
+	}
114
+	for(y = 0; y <= imageHeader.height; y++)
115
+	{
116
+		if((image[y] = malloc(sizeof(**image) * imageHeader.width)) == NULL)
117
+		{
118
+			perror("malloc:");
119
+			return EXIT_FAILURE;
120
+		}
121
+	}
122
+	
123
+	for(y = 0; y <= imageHeader.height; y++)
124
+	{
125
+		for(x = 0; x <= imageHeader.width; x++)
126
+		{
127
+			if((image[y][x] = malloc(sizeof(***image) * 3)) == NULL) //image[y][x][R,G,B]
128
+			{
129
+				perror("malloc:");
130
+				return EXIT_FAILURE;
131
+			}
132
+			image[y][x][0] = 0;
133
+			image[y][x][1] = 0;
134
+			image[y][x][2] = 0;
135
+		}
136
+	}
137
+	
138
+	fseek(file, fileHeader.offset, SEEK_SET); //We don't get all the possible headers, so go to the start of the image informations
139
+	
140
+	for(y = 0; y <= imageHeader.height; y++) //Get all the values for all the pixels in the image
141
+	{
142
+		for(x = 0; x <= imageHeader.width; x++)
143
+		{
144
+			yImage = imageHeader.height - y; //Due to the fact that BMP file are written from bottom to top
145
+			fread(&image[yImage][x][2], 1, 1, file);
146
+			fread(&image[yImage][x][1], 1, 1, file);
147
+			fread(&image[yImage][x][0], 1, 1, file);
148
+		}
149
+	}
150
+	
151
+	
152
+	printf("Output is : (Coordinates of the pixel) : value of each channel");
153
+	for(y = 0; y <= imageHeader.height; y++)
154
+	{
155
+		for(x = 0; x <= imageHeader.width; x++)
156
+		{
157
+			printf("(%d,%d) : R = %d,G = %d,B = %d\n", x, y, image[y][x][0], image[y][x][1], image[y][x][2]);
158
+		}
159
+	}
160
+	
161
+	free(image);
162
+	fclose(file);
163
+	
164
+	return EXIT_SUCCESS;
165
+}

+ 10
- 0
makefile View File

@@ -0,0 +1,10 @@
1
+all: stereo bmp
2
+
3
+stereo : stereo.o
4
+	gcc stereo.o -o stereo `pkg-config opencv --libs` -lm -lpthread -lfftw3 -lfftw3_threads
5
+
6
+stereo.o : stereo.c
7
+	gcc -c stereo.c -Wall `pkg-config opencv --cflags` -lm -lpthread -lfftw3 -lfftw3_threads
8
+	
9
+bmp : bmp.c
10
+	gcc -o bmp bmp.c

+ 75
- 0
sobel.c View File

@@ -0,0 +1,75 @@
1
+unsigned char** Sobel(unsigned char*** image, int width, int height)
2
+//cf. http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.html#sobel-derivatives and https://fr.wikipedia.org/wiki/Algorithme_de_Sobel 
3
+{
4
+	unsigned char** sobel;
5
+	int x,y,i;
6
+	unsigned char tempx, tempy;
7
+	
8
+	if((sobel = malloc(sizeof(*sobel) * height)) == NULL)
9
+	{
10
+		perror("malloc:");
11
+		return NULL;
12
+	}
13
+	for(y = 0; y <= height; y++)
14
+	{
15
+		if((sobel[y] = malloc(sizeof(**sobel) * width)) == NULL)
16
+		{
17
+			perror("malloc:");
18
+			return NULL;
19
+		}
20
+		for(x = 0; x <= width; x++)
21
+		{
22
+			sobel[y][x] = 0;
23
+		}
24
+	}
25
+	
26
+	for(y = 1; y < height; y++)
27
+	{
28
+		for(x = 1; x < width; x++)
29
+		{
30
+			tempx = -image[y-1][x-1]+image[y-1][x+1]-2*image[y][x-1]+2*image[y][x+1]-image[y+1][x-1]+image[y+1][x+1];
31
+			tempy = -image[y-1][x-1]-2*image[y-1][x]-image[y-1][x+1]+image[y+1][x-1]+2*image[y+1][x]+image[y+1][x+1];
32
+			sobel[y][x] = (int) floor(sqrt(tempx^2 + tempy^2));
33
+		}
34
+	}
35
+	
36
+	return sobel;
37
+}
38
+
39
+unsigned char*** add2images(unsigned char*** image1, unsigned char*** image2, int width, int height, int nChannels)
40
+{
41
+	unsigned char*** sum;
42
+	int x,y,i;
43
+	
44
+	if((sum = malloc(sizeof(*sum) * height)) == NULL)
45
+	{
46
+		perror("malloc:");
47
+		return NULL;
48
+	}
49
+	for(y = 0; y <= height; y++)
50
+	{
51
+		if((sum[y] = malloc(sizeof(**sum) * width)) == NULL)
52
+		{
53
+			perror("malloc:");
54
+			return NULL;
55
+		}
56
+	}
57
+	
58
+	for(y = 0; y <= height; y++)
59
+	{
60
+		for(x = 0; x <= width; x++)
61
+		{
62
+			if((sum[y][x] = malloc(sizeof(***sum) * nChannels)) == NULL) //sum[y][x][R,G,B]
63
+			{
64
+				perror("malloc:");
65
+				return NULL;
66
+			}
67
+			for(i = 0; i < nChannels; i++)
68
+			{
69
+				sum[y][x] = (unsigned char) ((image1[y][x][i] + image2[y][x][i])/2);
70
+			}
71
+		}
72
+	}
73
+	
74
+	return sum;
75
+}

BIN
stereo View File


+ 1337
- 0
stereo.c
File diff suppressed because it is too large
View File