forked from wangyida/model-render
-
Notifications
You must be signed in to change notification settings - Fork 0
/
contestShapenet.cpp
188 lines (183 loc) · 6.78 KB
/
contestShapenet.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#include "vtkBMPReader.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkOBJImporter.h"
#include "vtkOBJReader.h"
#include "vtkPNGWriter.h"
#include "vtkPlane.h"
#include "vtkPlaneSource.h"
#include "vtkPointData.h"
#include "vtkPolyDataWriter.h"
#include "vtkPolyDataMapper.h"
#include "vtkImageReader.h"
#include "vtkJPEGReader.h"
#include "vtkImageCanvasSource2D.h"
#include "vtkImageCast.h"
#include <vtkLight.h>
#include "vtkCamera.h"
#include "vtkTexture.h"
#include "vtkWindowToImageFilter.h"
#include "vtksys/SystemTools.hxx"
#include <opencv2/viz/vizcore.hpp>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include "sphereview.hpp"
using namespace cv;
using namespace std;
void listDir(const char *path, std::vector<String>& files, bool r)
{
DIR *pDir;
struct dirent *ent;
char childpath[512];
pDir = opendir(path);
memset(childpath, 0, sizeof(childpath));
while ((ent = readdir(pDir)) != NULL)
{
if (ent->d_type & DT_DIR)
{
if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0 || strcmp(ent->d_name, ".DS_Store") == 0)
{
continue;
}
if (r)
{
sprintf(childpath, "%s/%s", path, ent->d_name);
listDir(childpath,files,false);
}
}
else
{
if (strcmp(ent->d_name, ".DS_Store") != 0)
files.push_back(ent->d_name);
}
}
sort(files.begin(),files.end());
};
int main( int argc, char * argv [] )
{
const String keys = "{help | | demo :$ ./sphereview_test -ite_depth=2 -plymodel=../data/3Dmodel/ape.ply -imagedir=../data/images_all/ -labeldir=../data/label_all.txt -num_class=6 -label_class=0, then press 'q' to run the demo for images generation when you see the gray background and a coordinate.}"
"{ite_depth | 0 | Iteration of sphere generation, suggested: 3.}"
"{objmodel | | Path of the '.obj' file for image rendering. }"
"{imagedir | ../data/images_all/ | Path of the generated images for one particular .ply model. }"
"{labeldir | ../data/label_all.txt | Path of the generated images for one particular .ply model. }"
"{bakgrdir | | Path of the backgroud images sets. }"
"{center_gen | 0 | Find center from all points. }"
"{image_size | 227 | Size of captured images. }"
"{label_class | | Class label of current .obj model. }"
"{label_item | | Item label of current .obj model. }"
"{rgb_use | 0 | Use RGB image or grayscale. }"
"{view_region | 0 | Take a special view of front or back angle}"
"{cam_rot | 0 | Rotating the up direction of camera}";
/* Get parameters from comand line. */
cv::CommandLineParser parser(argc, argv, keys);
parser.about("Generating training data for CNN with triplet loss");
if (parser.has("help"))
{
parser.printMessage();
return 0;
}
int ite_depth = parser.get<int>("ite_depth");
string objmodel = parser.get<String>("objmodel");
string imagedir = parser.get<String>("imagedir");
string labeldir = parser.get<String>("labeldir");
string bakgrdir = parser.get<string>("bakgrdir");
int label_class = parser.get<int>("label_class");
int label_item = parser.get<int>("label_item");
int center_gen = parser.get<int>("center_gen");
int image_size = parser.get<int>("image_size");
int view_region = parser.get<int>("view_region");
int cam_rot = parser.get<int>("cam_rot");
double bg_dist;
cv::Mat cam_up;
if (cam_rot == 1) {
cam_up = (Mat_<int>(3,3) << 0, 1, 0, 0, -1, 0, 0, 0, -1);
} else {
cam_up = (Mat_<int>(1,3) << 0, 1, 0);
}
icoSphere ViewSphere(10,ite_depth);
std::vector<cv::Point3d> campos = ViewSphere.CameraPos;
// Reader of OBJ file
std::string filenameOBJ(objmodel);
vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New();
reader->SetFileName(filenameOBJ.data());
reader->Update();
// Create a mapper.
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(reader->GetOutputPort());
mapper->ScalarVisibilityOn();
// Create the actor.
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renWin->AddRenderer(ren);
ren->TexturedBackgroundOn();
ren->GetActiveCamera()->SetFocalPoint(0,0,0);
ren->AddActor(actor);
iren->SetRenderWindow(renWin);
renWin->SetSize(227,227);
renWin->Render();
vtkSmartPointer<vtkJPEGReader> imReader = vtkSmartPointer<vtkJPEGReader>::New();
vtkSmartPointer<vtkTexture> atext = vtkSmartPointer<vtkTexture>::New();
atext->SetInputConnection(imReader->GetOutputPort());
atext->InterpolateOn();
ren->SetBackground(0,0,0);
ren->SetBackgroundTexture(atext); //add background
vtkSmartPointer<vtkPNGWriter> writer = vtkSmartPointer<vtkPNGWriter>::New();
vtkSmartPointer<vtkWindowToImageFilter> wintoimg = vtkSmartPointer<vtkWindowToImageFilter>::New();
wintoimg->SetInput(renWin);
writer->SetInputConnection(wintoimg->GetOutputPort());
char temp[128];
char* bgname = new char;
std::vector<String> name_bkg;
std::fstream imglabel;
char* p=(char*)labeldir.data();
imglabel.open(p, fstream::app|fstream::out);
if (bakgrdir.size() != 0)
{
/* List the file names under a given path */
listDir(bakgrdir.c_str(), name_bkg, false);
for (unsigned int i = 0; i < name_bkg.size(); i++)
{
name_bkg.at(i) = bakgrdir + name_bkg.at(i);
}
}
/* Images will be saved as .png files. */
int cnt_img;
/* Real random related to time */
//srand((int)time(0));
double dist_cam_factor=1.8;
do
{
cnt_img = 0;
for(int pose = 0; pose < static_cast<int>(campos.size()); pose++){
int label_x, label_y, label_z;
label_x = static_cast<int>(campos.at(pose).x*100);
label_y = static_cast<int>(campos.at(pose).y*100);
label_z = static_cast<int>(campos.at(pose).z*100);
for(int camup = 0; camup < cam_up.rows; camup++){
sprintf (temp,"%08i_%06i_%02i", label_class, label_item, cnt_img);
String filename = temp;
filename += ".png";
imglabel << filename << ' ' << label_class << endl;
filename = imagedir + filename;
imReader->SetFileName(name_bkg.at(rand()%name_bkg.size()).c_str());
ren->GetActiveCamera()->SetPosition(campos.at(pose).x*dist_cam_factor,campos.at(pose).z*dist_cam_factor,campos.at(pose).y*dist_cam_factor);
ren->GetActiveCamera()->SetViewUp(cam_up.at<int>(camup,0),cam_up.at<int>(camup,1),cam_up.at<int>(camup,2));
wintoimg->Modified();
wintoimg->Update();
writer->SetFileName(filename.c_str());
writer->Write();
cv::Mat grayimg = cv::imread(filename,0);
cv::imwrite(filename,grayimg);
iren->Initialize();
cnt_img++;
}
}
} while (cnt_img != campos.size()*cam_up.rows);
imglabel.close();
return 1;
}