Subversion Repositories seema-scanner

Rev

Rev 172 | Rev 185 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 172 Rev 176
1
#include "SMPointCloudWidget.h"
1
#include "SMPointCloudWidget.h"
2
 
2
 
3
#include <opencv2/opencv.hpp>
3
#include <opencv2/opencv.hpp>
4
#include <opencv2/core/eigen.hpp>
4
#include <opencv2/core/eigen.hpp>
5
 
5
 
6
#include <vtkWindowToImageFilter.h>
6
#include <vtkWindowToImageFilter.h>
7
#include <vtkPNGWriter.h>
7
#include <vtkPNGWriter.h>
8
#include <vtkRenderWindow.h>
8
#include <vtkRenderWindow.h>
9
 
9
 
10
#include <pcl/point_cloud.h>
10
#include <pcl/point_cloud.h>
11
#include <pcl/point_types.h>
11
#include <pcl/point_types.h>
12
#include <pcl/common/io.h>
12
#include <pcl/common/io.h>
13
#include <pcl/visualization/point_cloud_color_handlers.h>
13
#include <pcl/visualization/point_cloud_color_handlers.h>
14
#include <pcl/geometry/quad_mesh.h>
14
#include <pcl/geometry/quad_mesh.h>
15
 
15
 
16
#include <fstream>
16
#include <fstream>
17
 
17
 
18
 
18
 
19
#include <QFileDialog>
19
#include <QFileDialog>
20
#include <QSettings>
20
#include <QSettings>
21
 
21
 
22
#include "SMCalibrationParameters.h"
22
#include "SMCalibrationParameters.h"
23
 
23
 
24
SMPointCloudWidget::SMPointCloudWidget(QWidget *parent) : QVTKWidget(parent) {
24
SMPointCloudWidget::SMPointCloudWidget(QWidget *parent) : QVTKWidget(parent) {
25
 
25
 
26
    visualizer = new pcl::visualization::PCLVisualizer("PCLVisualizer", false);
26
    visualizer = new pcl::visualization::PCLVisualizer("PCLVisualizer", false);
27
    this->SetRenderWindow(visualizer->getRenderWindow());
27
    this->SetRenderWindow(visualizer->getRenderWindow());
28
 
28
 
29
    // Disable double buffering (which causes lag in VTK6)
29
    // Disable double buffering (which causes lag in VTK6)
30
    visualizer->getRenderWindow()->SetDoubleBuffer(0);
30
    visualizer->getRenderWindow()->SetDoubleBuffer(0);
31
 
31
 
32
    visualizer->setShowFPS(false);
32
    visualizer->setShowFPS(false);
33
 
33
 
34
    // Create point cloud viewport
34
    // Create point cloud viewport
35
    visualizer->setBackgroundColor(0, 0, 0);
35
    visualizer->setBackgroundColor(0, 0, 0);
36
    visualizer->addCoordinateSystem(100, "camera0", 0);
36
    visualizer->addCoordinateSystem(100, "camera0", 0);
37
#ifndef __APPLE__
37
#ifndef __APPLE__
38
    // this leads to a segfault on OS X
38
    // this leads to a segfault on OS X
39
    visualizer->setCameraPosition(0,0,-50,0,0,0,0,-1,0);
39
    visualizer->setCameraPosition(0,0,-50,0,0,0,0,-1,0);
40
#endif
40
#endif
41
 
41
 
42
    // Initialize point cloud color handler
42
    // Initialize point cloud color handler
43
    colorHandler = new pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGBNormal>();
43
    colorHandler = new pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGBNormal>();
44
 
44
 
45
    updateCalibrationParameters();
45
    updateCalibrationParameters();
46
    //time.start();
46
    //time.start();
47
}
47
}
48
 
48
 
49
void SMPointCloudWidget::addPointCloud(SMPointCloud pointCloud, int id){
49
void SMPointCloudWidget::addPointCloud(SMPointCloud pointCloud, int id){
50
 
50
 
51
    std::string stringId = QString::number(id).toStdString();
51
    std::string stringId = QString::number(id).toStdString();
52
//    std::string stringId = QString("id%1").arg(id).toStdString();
52
//    std::string stringId = QString("id%1").arg(id).toStdString();
53
 
53
 
54
    // Note: using the color handler makes a copy of the rgb fields
54
    // Note: using the color handler makes a copy of the rgb fields
55
    colorHandler->setInputCloud(pointCloud.pointCloud);
55
    colorHandler->setInputCloud(pointCloud.pointCloud);
56
 
56
 
57
    if(!visualizer->updatePointCloud(pointCloud.pointCloud, *colorHandler, stringId)){
57
    if(!visualizer->updatePointCloud(pointCloud.pointCloud, *colorHandler, stringId)){
58
        visualizer->addPointCloud(pointCloud.pointCloud, *colorHandler, stringId);
58
        visualizer->addPointCloud(pointCloud.pointCloud, *colorHandler, stringId);
59
        visualizer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2.0, stringId);
59
        visualizer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2.0, stringId);
60
     }
60
     }
61
 
61
 
62
    // transformation matrix in Eigen format
62
    // transformation matrix in Eigen format
63
    cv::Mat TransformCV(3, 4, CV_32F);
63
    cv::Mat TransformCV(3, 4, CV_32F);
64
    cv::Mat(pointCloud.R).copyTo(TransformCV.colRange(0, 3));
64
    cv::Mat(pointCloud.R).copyTo(TransformCV.colRange(0, 3));
65
    cv::Mat(pointCloud.T).copyTo(TransformCV.col(3));
65
    cv::Mat(pointCloud.T).copyTo(TransformCV.col(3));
66
    Eigen::Affine3f Transform;
66
    Eigen::Affine3f Transform;
67
    cv::cv2eigen(TransformCV, Transform.matrix());
67
    cv::cv2eigen(TransformCV, Transform.matrix());
68
 
68
 
69
    visualizer->updatePointCloudPose(stringId, Transform.inverse());
69
    visualizer->updatePointCloudPose(stringId, Transform.inverse());
70
 
70
 
71
    this->update();
71
    this->update();
72
 
72
 
73
    emit pointCloudDataChanged();
73
    emit pointCloudDataChanged();
74
 
74
 
75
}
75
}
76
 
76
 
77
void SMPointCloudWidget::updatePointCloud(SMPointCloud pointCloud, int id){
77
void SMPointCloudWidget::updatePointCloud(SMPointCloud pointCloud, int id){
78
 
78
 
79
    std::string stringId = QString::number(id).toStdString();
79
    std::string stringId = QString::number(id).toStdString();
80
//    std::string stringId = QString("id%1").arg(id).toStdString();
80
//    std::string stringId = QString("id%1").arg(id).toStdString();
81
 
81
 
82
    // Note: using the color handler makes a copy of the rgb fields
82
    // Note: using the color handler makes a copy of the rgb fields
83
    colorHandler->setInputCloud(pointCloud.pointCloud);
83
    colorHandler->setInputCloud(pointCloud.pointCloud);
84
 
84
 
85
    if(!visualizer->updatePointCloud(pointCloud.pointCloud, *colorHandler, stringId)){
85
    if(!visualizer->updatePointCloud(pointCloud.pointCloud, *colorHandler, stringId)){
86
        visualizer->addPointCloud(pointCloud.pointCloud, *colorHandler, stringId);
86
        visualizer->addPointCloud(pointCloud.pointCloud, *colorHandler, stringId);
87
        visualizer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2.0, stringId);
87
        visualizer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2.0, stringId);
88
     }
88
     }
89
 
89
 
90
    this->update();
90
    this->update();
91
    emit pointCloudDataChanged();
91
    emit pointCloudDataChanged();
92
 
92
 
93
}
93
}
94
 
94
 
95
void SMPointCloudWidget::removePointCloud(int id){
95
void SMPointCloudWidget::removePointCloud(int id){
96
 
96
 
97
    std::string stringId = QString::number(id).toStdString();
97
    std::string stringId = QString::number(id).toStdString();
98
//    std::string stringId = QString("id%1").arg(id).toStdString();
98
//    std::string stringId = QString("id%1").arg(id).toStdString();
99
 
99
 
100
    visualizer->removePointCloud(stringId);
100
    visualizer->removePointCloud(stringId);
101
 
101
 
102
    this->update();
102
    this->update();
103
    emit pointCloudDataChanged();
103
    emit pointCloudDataChanged();
104
 
104
 
105
}
105
}
106
 
106
 
107
void SMPointCloudWidget::removeAllPointClouds(){
107
void SMPointCloudWidget::removeAllPointClouds(){
108
 
108
 
109
    visualizer->removeAllPointClouds();
109
    visualizer->removeAllPointClouds();
110
 
110
 
111
    this->update();
111
    this->update();
112
    emit pointCloudDataChanged();
112
    emit pointCloudDataChanged();
113
 
113
 
114
}
114
}
115
 
115
 
116
//void SMPointCloudWidget::savePointCloud(){
116
//void SMPointCloudWidget::savePointCloud(){
117
 
117
 
118
//    QString selectedFilter;
118
//    QString selectedFilter;
119
//    QString fileName = QFileDialog::getSaveFileName(this, "Save Point Cloud", QString(), "*.pcd;;*.ply;;*.vtk;;*.png;;*.txt", &selectedFilter);
119
//    QString fileName = QFileDialog::getSaveFileName(this, "Save Point Cloud", QString(), "*.pcd;;*.ply;;*.vtk;;*.png;;*.txt", &selectedFilter);
120
//    QFileInfo info(fileName);
120
//    QFileInfo info(fileName);
121
//    QString type = info.suffix();
121
//    QString type = info.suffix();
122
//    if(type == ""){
122
//    if(type == ""){
123
//        fileName.append(selectedFilter.remove(0,1));
123
//        fileName.append(selectedFilter.remove(0,1));
124
//        type = selectedFilter.remove(0,1);
124
//        type = selectedFilter.remove(0,1);
125
//    }
125
//    }
126
 
126
 
127
//    if(type == "pcd"){
127
//    if(type == "pcd"){
128
//        pcl::io::savePCDFileASCII(fileName.toStdString(), *pointCloudPCL);
128
//        pcl::io::savePCDFileASCII(fileName.toStdString(), *pointCloudPCL);
129
//    } else if(type == "ply"){
129
//    } else if(type == "ply"){
130
//        //pcl::io::savePLYFileBinary(fileName.toStdString(), *pointCloudPCL);
130
//        //pcl::io::savePLYFileBinary(fileName.toStdString(), *pointCloudPCL);
131
//        pcl::PLYWriter w;
131
//        pcl::PLYWriter w;
132
//        // Write to ply in binary without camera
132
//        // Write to ply in binary without camera
133
//        w.write<pcl::PointXYZRGBNormal> (fileName.toStdString(), *pointCloudPCL, true, false);
133
//        w.write<pcl::PointXYZRGBNormal> (fileName.toStdString(), *pointCloudPCL, true, false);
134
//    } else if(type == "vtk"){
134
//    } else if(type == "vtk"){
135
//        pcl::PCLPointCloud2 pointCloud2;
135
//        pcl::PCLPointCloud2 pointCloud2;
136
//        pcl::toPCLPointCloud2(*pointCloudPCL, pointCloud2);
136
//        pcl::toPCLPointCloud2(*pointCloudPCL, pointCloud2);
137
//        pcl::io::saveVTKFile(fileName.toStdString(), pointCloud2);
137
//        pcl::io::saveVTKFile(fileName.toStdString(), pointCloud2);
138
 
138
 
139
////        vtkPolyData polyData;
139
////        vtkPolyData polyData;
140
////        pcl::io::pointCloudTovtkPolyData(*pointCloudPCL, polyData);
140
////        pcl::io::pointCloudTovtkPolyData(*pointCloudPCL, polyData);
141
////        vtkPolyDataWriter::Pointer writer = vtkPolyDataWriter::New();
141
////        vtkPolyDataWriter::Pointer writer = vtkPolyDataWriter::New();
142
////        writer->SetInput(polyData);
142
////        writer->SetInput(polyData);
143
////        writer->SetFileName(fileName.toStdString());
143
////        writer->SetFileName(fileName.toStdString());
144
////        writer->Update();
144
////        writer->Update();
145
//    } else if(type == "png"){
145
//    } else if(type == "png"){
146
//        pcl::io::savePNGFile(fileName.toStdString(), *pointCloudPCL, "rgb");
146
//        pcl::io::savePNGFile(fileName.toStdString(), *pointCloudPCL, "rgb");
147
//    } else if(type == "txt"){
147
//    } else if(type == "txt"){
148
//        std::ofstream s(fileName.toLocal8Bit());
148
//        std::ofstream s(fileName.toLocal8Bit());
149
//        for(unsigned int r=0; r<pointCloudPCL->height; r++){
149
//        for(unsigned int r=0; r<pointCloudPCL->height; r++){
150
//            for(unsigned int c=0; c<pointCloudPCL->width; c++){
150
//            for(unsigned int c=0; c<pointCloudPCL->width; c++){
151
//                pcl::PointXYZRGBNormal p = pointCloudPCL->at(c, r);
151
//                pcl::PointXYZRGBNormal p = pointCloudPCL->at(c, r);
152
//                if(p.x == p.x)
152
//                if(p.x == p.x)
153
//                    s << p.x << " " << p.y << " " << p.z << "\r\n";
153
//                    s << p.x << " " << p.y << " " << p.z << "\r\n";
154
//            }
154
//            }
155
//        }
155
//        }
156
//        std::flush(s);
156
//        std::flush(s);
157
//        s.close();
157
//        s.close();
158
//    }
158
//    }
159
 
159
 
160
//}
160
//}
161
 
161
 
162
void SMPointCloudWidget::saveScreenShot(){
162
void SMPointCloudWidget::saveScreenShot(){
163
 
163
 
164
    vtkWindowToImageFilter* filter = vtkWindowToImageFilter::New();
164
    vtkWindowToImageFilter* filter = vtkWindowToImageFilter::New();
165
    //filter->SetInput(visualizer->getRenderWindow());
165
    //filter->SetInput(visualizer->getRenderWindow());
166
    filter->Modified();
166
    filter->Modified();
167
 
167
 
168
    QString fileName = QFileDialog::getSaveFileName(this, "Save Screen Shot", QString(), "*.png");
168
    QString fileName = QFileDialog::getSaveFileName(this, "Save Screen Shot", QString(), "*.png");
169
    QFileInfo info(fileName);
169
    QFileInfo info(fileName);
170
    QString type = info.suffix();
170
    QString type = info.suffix();
171
    if(type == "")
171
    if(type == "")
172
        fileName.append(".png");
172
        fileName.append(".png");
173
 
173
 
174
    vtkPNGWriter* writer = vtkPNGWriter::New();
174
    vtkPNGWriter* writer = vtkPNGWriter::New();
175
    writer->SetFileName(qPrintable(fileName));
175
    writer->SetFileName(qPrintable(fileName));
176
    writer->SetInputConnection(filter->GetOutputPort());
176
    writer->SetInputConnection(filter->GetOutputPort());
177
    writer->Write();
177
    writer->Write();
178
    writer->Delete();
178
    writer->Delete();
179
}
179
}
180
 
180
 
181
void SMPointCloudWidget::updateCalibrationParameters(){
181
void SMPointCloudWidget::updateCalibrationParameters(){
182
 
182
 
183
    QSettings settings;
183
    QSettings settings;
184
    QVariant calibrationVariant = settings.value("calibration/parameters");
184
    QVariant calibrationVariant = settings.value("calibration/parameters");
185
    SMCalibrationParameters calibration = calibrationVariant.value<SMCalibrationParameters>();
185
    SMCalibrationParameters calibration = calibrationVariant.value<SMCalibrationParameters>();
186
 
186
 
187
    // camera 0 coordinate system
187
    // camera 0 coordinate system
188
    visualizer->removeCoordinateSystem("camera0", 0);
188
    //visualizer->removeCoordinateSystem("camera0", 0);
189
    visualizer->addCoordinateSystem(100, "camera0", 0);
189
    visualizer->addCoordinateSystem(100, "camera0", 0);
190
 
190
 
191
    // camera 1 coordinate system
191
    // camera 1 coordinate system
192
    cv::Mat Transform1CV(3, 4, CV_32F);
192
    cv::Mat Transform1CV(3, 4, CV_32F);
193
    cv::Mat(calibration.R1).copyTo(Transform1CV.colRange(0, 3));
193
    cv::Mat(calibration.R1).copyTo(Transform1CV.colRange(0, 3));
194
    cv::Mat(calibration.T1).copyTo(Transform1CV.col(3));
194
    cv::Mat(calibration.T1).copyTo(Transform1CV.col(3));
195
    Eigen::Affine3f Transform1;
195
    Eigen::Affine3f Transform1;
196
    cv::cv2eigen(Transform1CV, Transform1.matrix());
196
    cv::cv2eigen(Transform1CV, Transform1.matrix());
197
 
197
 
-
 
198
    //visualizer->removeCoordinateSystem("camera1", 0);
198
    visualizer->addCoordinateSystem(100, Transform1.inverse(), "camera1", 0);
199
    visualizer->addCoordinateSystem(100, Transform1.inverse(), "camera1", 0);
199
 
200
 
200
    // rotation axis coordinate system
201
//    // rotation axis coordinate system
201
//    cv::Mat TransformRCV(3, 4, CV_32F);
202
//    cv::Mat TransformRCV(3, 4, CV_32F);
202
//    cv::Mat(calibration.Rr).copyTo(TransformRCV.colRange(0, 3));
203
//    cv::Mat(calibration.Rr).copyTo(TransformRCV.colRange(0, 3));
203
//    cv::Mat(calibration.Tr).copyTo(TransformRCV.col(3));
204
//    cv::Mat(calibration.Tr).copyTo(TransformRCV.col(3));
204
//    Eigen::Affine3f TransformR;
205
//    Eigen::Affine3f TransformR;
205
//    cv::cv2eigen(TransformRCV, TransformR.matrix());
-
 
206
 
206
 
-
 
207
//    cv::cv2eigen(TransformRCV, TransformR.matrix());
207
//    visualizer->addCoordinateSystem(100, TransformR);
208
//    visualizer->removeCoordinateSystem("camera1", 0);
-
 
209
//    visualizer->addCoordinateSystem(100, TransformR.inverse(), "rotation", 0);
208
 
210
 
209
    // rotation axis pointing (0,1,0) in rotation stage frame
211
    // rotation axis pointing (0,1,0) in rotation stage frame
210
    cv::Vec3f O(0.0, 00.0, 0.0);
212
    cv::Vec3f O(0.0, 0.0, 0.0);
211
    cv::Vec3f v(0.0, 600.0, 0.0);
213
    cv::Vec3f v(0.0, 600.0, 0.0);
212
 
214
 
213
    // determine coefficients in camera 0 frame
215
    // determine coefficients in camera 0 frame
214
    O = calibration.Rr.t()*O + -calibration.Rr.t()*calibration.Tr;
216
    O = calibration.Rr.t()*O + -calibration.Rr.t()*calibration.Tr;
215
    v = calibration.Rr.t()*v + -calibration.Rr.t()*calibration.Tr - O;
217
    v = calibration.Rr.t()*v + -calibration.Rr.t()*calibration.Tr - O;
216
 
218
 
217
    pcl::ModelCoefficients lineCoefficients;
219
    pcl::ModelCoefficients lineCoefficients;
218
    lineCoefficients.values.resize(6);
220
    lineCoefficients.values.resize(6);
219
    lineCoefficients.values[0] = O[0];
221
    lineCoefficients.values[0] = O[0];
220
    lineCoefficients.values[1] = O[1];
222
    lineCoefficients.values[1] = O[1];
221
    lineCoefficients.values[2] = O[2];
223
    lineCoefficients.values[2] = O[2];
222
    lineCoefficients.values[3] = v[0];
224
    lineCoefficients.values[3] = v[0];
223
    lineCoefficients.values[4] = v[1];
225
    lineCoefficients.values[4] = v[1];
224
    lineCoefficients.values[5] = v[2];
226
    lineCoefficients.values[5] = v[2];
225
    visualizer->removeShape("line");
227
    visualizer->removeShape("line");
226
    visualizer->addLine(lineCoefficients);
228
    visualizer->addLine(lineCoefficients);
227
 
229
 
228
 
230
 
229
 
231
 
230
}
232
}
231
 
233
 
232
SMPointCloudWidget::~SMPointCloudWidget(){
234
SMPointCloudWidget::~SMPointCloudWidget(){
233
 
235
 
234
    //delete visualizer;
236
    //delete visualizer;
235
 
237
 
236
}
238
}
237
 
239