Subversion Repositories seema-scanner

Rev

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

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