16 #include "vtkTIFFReader.h"
17 #include "vtkJPEGReader.h"
18 #include "vtkPNGReader.h"
19 #include "vtkRenderer.h"
20 #include "vtkRenderWindow.h"
21 #include "vtkRenderWindowInteractor.h"
22 #include "vtkPolyData.h"
23 #include "vtkPoints.h"
24 #include "vtkIntArray.h"
25 #include "vtkCellArray.h"
26 #include "vtkPolyDataMapper.h"
27 #include "vtkLookupTable.h"
29 #include "vtkFloatArray.h"
30 #include "vtkTexture.h"
31 #include "vtkImageResample.h"
32 #include "vtkImageClip.h"
33 #include "vtkCamera.h"
34 #include "vtkImageShiftScale.h"
41 #include "SimpleOpt.h"
47 {
OPT_Xm, _T(
"-xm"), SO_REQ_SEP },
48 {
OPT_Ym, _T(
"-ym"), SO_REQ_SEP },
49 {
OPT_XM, _T(
"-xM"), SO_REQ_SEP },
50 {
OPT_YM, _T(
"-yM"), SO_REQ_SEP },
51 {
OPT_OUT, _T(
"-nof"), SO_NONE },
52 {
OPT_OUT, _T(
"--no-output-file"), SO_NONE },
53 {
OPT_IN, _T(
"-i"), SO_REQ_SEP },
54 {
OPT_IN, _T(
"--input"), SO_REQ_SEP },
66 #include "pixelpos.help"
86 if (args.LastError() == SO_SUCCESS)
90 else if (args.OptionId() ==
OPT_OUT)
94 else if (args.OptionId() ==
OPT_Xm)
97 o << args.OptionArg();
98 std::istringstream
in(o.str().c_str());
100 }
else if (args.OptionId() ==
OPT_Ym)
102 std::ostringstream o;
103 o << args.OptionArg();
104 std::istringstream
in(o.str().c_str());
106 }
else if (args.OptionId() ==
OPT_XM)
108 std::ostringstream o;
109 o << args.OptionArg();
110 std::istringstream
in(o.str().c_str());
112 }
else if (args.OptionId() ==
OPT_YM)
114 std::ostringstream o;
115 o << args.OptionArg();
116 std::istringstream
in(o.str().c_str());
118 }
else if (args.OptionId() ==
OPT_IN)
125 std::cerr <<
"Invalid argument: " << args.OptionText() << std::endl;
126 return error(args.LastError());
131 if (args.FileCount() != 1)
return error(-3);
138 auto val =
new int[6];
139 val[0] = 0; val[1] = dim[0]-1;
140 val[2] = 0; val[3] = dim[1]-1;
141 val[4] = 0; val[5] = 0;
142 if ((
xm>0)&&(
xm<dim[0]-1))
147 if ((
xM>
xm)&&(
xM<dim[0]-1))
152 if ((
ym>0)&&(
ym<dim[1]-1))
157 if ((
yM>
ym)&&(
yM<dim[1]-1))
168 std::string::const_iterator p = s.begin();
169 std::string::const_iterator p2 = s2.begin();
170 while (p != s.end() && p2 != s2.end())
172 if (toupper(*p) != toupper(*p2))
173 return (toupper(*p) < toupper(*p2)) ? -1 : 1;
177 return (s2.size() == s.size()) ? 0 : (s.size() < s2.size()) ? -1 : 1;
180 int main(
int argc,
char ** argv)
183 if (val != 0)
return val;
184 std::string ext =
name.substr(
name.find_last_of(
'.')+1,
name.size());
185 vtkImageReader2 * reader;
187 reader = (vtkImageReader2 *)vtkTIFFReader::New();
189 reader = (vtkImageReader2 *)vtkJPEGReader::New();
191 reader = (vtkImageReader2 *)vtkPNGReader::New();
192 else return error(-3);
193 reader->SetFileName(
name.c_str());
195 int * dim = reader->GetOutput()->GetDimensions();
199 std::cerr <<
"Dimensions: " << dim[0] <<
" " << dim [1] <<
" [";
200 std::cerr << reader->GetNumberOfScalarComponents() <<
" x ";
202 int dtype = reader->GetDataScalarType();
205 if (dtype == VTK_UNSIGNED_CHAR)
206 std::cerr <<
"unsigned char (8bits)";
207 else if (dtype == VTK_UNSIGNED_SHORT)
208 std::cerr <<
"unsigned short (16bits)";
210 std::cerr <<
"type (" << reader->GetDataScalarType() <<
")";
212 std::cerr <<
"]" << std::endl;
215 vtkRenderer *
ren = vtkRenderer::New();
216 vtkRenderWindow *renWin = vtkRenderWindow::New();
217 renWin->AddRenderer(
ren);
225 vtkImageClip * clip = vtkImageClip::New();
226 clip->SetInputConnection(reader->GetOutputPort());
227 clip->SetOutputWholeExtent(dim2);
229 if (reader->GetDataScalarType()==5)
233 vtkImageShiftScale * cast = vtkImageShiftScale::New();
234 cast->SetInputConnection(clip->GetOutputPort());
237 cast->SetScale(scale);
238 cast->ClampOverflowOn();
239 cast->SetOutputScalarTypeToUnsignedChar();
240 vtkTexture * texture = vtkTexture::New();
241 texture->SetInputConnection(cast->GetOutputPort());
243 texture->InterpolateOff();
244 vtkFloatArray * tcoords = vtkFloatArray::New();
245 tcoords->SetNumberOfComponents(2);
246 tcoords->SetNumberOfTuples(4);
248 tcoords->SetTuple(0,p);
250 tcoords->SetTuple(1,p);
252 tcoords->SetTuple(2,p);
254 tcoords->SetTuple(3,p);
259 vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
260 iren->SetRenderWindow(renWin);
261 iren->SetInteractorStyle(style);
264 float x[4][3]={{
static_cast<float>(dim2[0]),
static_cast<float>(dim2[2]),0.f},
265 {
static_cast<float>(dim2[1]),
static_cast<float>(dim2[2]),0.f},
266 {
static_cast<float>(dim2[1]),
static_cast<float>(dim2[3]),0.f},
267 {
static_cast<float>(dim2[0]),
static_cast<float>(dim2[3]),0.f}};
268 vtkIdType pts[1][4]={{0,1,2,3}};
270 vtkPoints * points = vtkPoints::New();
271 for (
int i=0; i<4; i++) points->InsertPoint(i,x[i]);
272 vtkCellArray * polys = vtkCellArray::New();
273 polys->InsertNextCell(4,pts[0]);
274 vtkPolyData * plane = vtkPolyData::New();
275 plane->SetPoints(points);
277 plane->SetPolys(polys);
278 plane->GetPointData()->SetTCoords(tcoords);
279 vtkPolyDataMapper * map = vtkPolyDataMapper::New();
280 map->SetInputData(plane);
282 vtkActor * actor = vtkActor::New();
283 actor->SetMapper(map);
284 actor->DragableOff();
286 actor->SetTexture(texture);
288 ren->AddActor(actor);
291 style->
set(points,clip,dim[0],dim[1]);
295 vtkImageResample * resample = vtkImageResample::New();
296 resample->SetInputConnection(reader->GetOutputPort());
297 resample->SetAxisMagnificationFactor(0,.1);
298 resample->SetAxisMagnificationFactor(1,.1);
299 vtkTexture * texture2 = vtkTexture::New();
300 texture2->SetInputConnection(resample->GetOutputPort());
302 float x2[4][3]={{0.f,0.f,0.f},
303 {
static_cast<float>(dim[0]),0.f,-.5f},
304 {
static_cast<float>(dim[0]),
static_cast<float>(dim[1]),-.5f},
305 {0.f,
static_cast<float>(dim[1]),-.5f}};
306 vtkPoints * points2 = vtkPoints::New();
307 for (
int i=0; i<4; i++) points2->InsertPoint(i,
x2[i]);
308 vtkIntArray * scalars = vtkIntArray::New();
309 scalars->SetNumberOfComponents(1);
310 scalars->SetNumberOfTuples(4);
311 for (
int i=0; i<4; i++) scalars->SetTuple1(i,8);
313 vtkPolyData * plane2 = vtkPolyData::New();
314 plane2->SetPoints(points2);
316 plane2->SetPolys(polys);
317 plane2->GetPointData()->SetScalars(scalars);
319 plane2->GetPointData()->SetTCoords(tcoords);
320 vtkLookupTable * lut = vtkLookupTable::New();
321 lut->SetHueRange(0.6,0);
322 lut->SetSaturationRange(.2,.2);
323 lut->SetValueRange(1,1);
324 vtkPolyDataMapper * map2 = vtkPolyDataMapper::New();
325 map2->SetInputData(plane2);
327 map2->SetScalarRange(0,10);
328 map2->SetLookupTable(lut);
330 vtkActor *actor2 = vtkActor::New();
331 actor2->SetMapper(map2);
332 actor2->DragableOff();
334 actor2->SetTexture(texture2);
336 ren->AddActor(actor2);
341 vtkActor * actor2 = vtkActor::New();
342 ren->AddActor(actor2);
349 vtkCamera * cam =
ren->GetActiveCamera();
350 cam->SetFocalPoint(dim[0]/2,dim[1]/2,0);
351 cam->SetPosition(dim[0]/2,dim[1]/2,1);
352 cam->ParallelProjectionOn();
353 cam->SetParallelScale(dim[1]/2);
354 ren->ResetCameraClippingRange();
356 renWin->SetSize(800,
int(800*(
double(dim[1])/
double(dim[0]))));
358 renWin->SetSize(
int(800*(
double(dim[0])/
double(dim[1]))),800);
369 renWin->SetWindowName(
const_cast<char *
>((std::string(
"PixelPos : ")+
name).c_str()));
382 std::cerr << std::endl <<
"no point extracted" << std::endl;
386 std::cerr << std::endl <<
"one point extracted" << std::endl;
388 std::cerr << std::endl << coord.
size() <<
" points extracted" << std::endl;
389 std::cerr << std::endl;
static a_subpixel_interactor * New()
void setpos(pixelpos_points *pos)
void setscale(vtkImageShiftScale *scale, double scale0)
void SetImage(vtkImageReader2 *image)
void set(vtkPoints *points, vtkImageClip *clip, int maxu, int maxv)
int * window(int xm, int ym, int xM, int yM, int *dim)
CSimpleOpt::SOption g_rgOptions[]
int main(int argc, char **argv)
std::string input_file("")
int cmp_nocase(const std::string &s, const std::string &s2)
int error_tests(int argc, char **argv)