-
Notifications
You must be signed in to change notification settings - Fork 2
/
zoom.cpp
122 lines (95 loc) · 2.71 KB
/
zoom.cpp
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
Mat imagenOriginal, imagen, imagenMostrar;
int zoomRec = 200;
int mousex, mousey;
Mat zoomIn(int x, int y)
{
int width = zoomRec, height = zoomRec;
int ptoX = x-(zoomRec/2), ptoY = y-(zoomRec/2);
/*Verifica que el ROI este dentro de la la imagen*/
if((x+(zoomRec/2)) > imagen.size().width)
width = width - ((x+(zoomRec/2)) - imagen.size().width);
if((y+(zoomRec/2)) > imagen.size().height)
height = height - ((y+(zoomRec/2)) - imagen.size().height);
if((x-(zoomRec/2)) < 0)
ptoX = 0;
if((y-(zoomRec/2)) < 0)
ptoY = 0;
Rect roi = Rect(ptoX, ptoY, width, height);
Mat imagen_roi = imagen(roi);
resize(imagen_roi, imagen_roi, Size(imagenOriginal.size().width, imagenOriginal.size().height), 0, 0, CV_INTER_AREA);
return imagen_roi;
}
Mat zoomOut(int x, int y)
{
return imagenOriginal;
}
static void onMouse( int event, int x, int y, int /*flags*/, void* /*param*/ )
{
mousex = x;
mousey = y;
if(event == CV_EVENT_LBUTTONDOWN)
imagen = zoomIn(x, y);
else if(event == CV_EVENT_RBUTTONDOWN)
imagen = zoomOut(x, y);
}
void info(){
cout << "\nDemo de Zoom creado por Sebastián González <[email protected]>,\n"
"La versión de Opencv utilizada en este ejemplo es 2.4.5, \n"
"Usted esta corriendo la versión " << CV_VERSION << "\n"
<< endl;
cout << "\nTeclas: \n"
"\tESC - Salir del programa\n"
"\t+ - Aumenta la escala de zoom\n"
"\t- - Disminuye la escala de zoom\n"
"\tCLICK D - zoom\n"
"\tCLICK R - Restaura imagen\n" << endl;
}
int main( int argc, char** argv )
{
info();
if(argc == 1)
imagenOriginal = imread("lena.jpg");
else if(argc > 1)
imagenOriginal = imread(argv[1]);
if(imagenOriginal.empty())
cout << "[ERROR] no se pudo cargar la imagen\n\tUso: ./zoom /ruta/de/la/imagen.png\n" << endl;
namedWindow("Zoom", 1);
setMouseCallback("Zoom", onMouse, 0);
imagenOriginal.copyTo(imagen);
imagenOriginal.copyTo(imagenMostrar);
for(;;)
{
if(imagen.empty())
break;
imagen.copyTo(imagenMostrar);
rectangle(imagenMostrar,
Point(mousex-(zoomRec/2), mousey-(zoomRec/2)),
Point(mousex+(zoomRec/2), mousey+(zoomRec/2)),
cv::Scalar(0,255,0), 1, 8, 0);
imshow("Zoom", imagenMostrar);
char c = (char) waitKey(10);
if(c == 27)
break;
switch(c)
{
case '+':
if(zoomRec < 500)
zoomRec = zoomRec + 10;
break;
case '-':
if(zoomRec > 10)
zoomRec = zoomRec - 10;
break;
default:
;
}
}
return 0;
}