Subversion Repositories seema-scanner

Rev

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

Rev 186 Rev 187
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
    visualizer->setCameraPosition(0,0,-50,0,0,0,0,-1,0);
37
    visualizer->setCameraPosition(0,0,-50,0,0,0,0,-1,0);
38
 
38
 
39
 
39
 
40
    // Initialize point cloud color handler
40
    // Initialize point cloud color handler
41
    colorHandler = new pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGBNormal>();
41
    colorHandler = new pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGBNormal>();
42
 
42
 
43
    updateCalibrationParameters();
43
    updateCalibrationParameters();
44
    //time.start();
44
    //time.start();
45
}
45
}
46
 
46
 
47
void SMPointCloudWidget::addPointCloud(SMPointCloud pointCloud, int id){
47
void SMPointCloudWidget::addPointCloud(SMPointCloud pointCloud, int id){
48
 
48
 
49
    std::string stringId = QString::number(id).toStdString();
49
    std::string stringId = QString::number(id).toStdString();
50
//    std::string stringId = QString("id%1").arg(id).toStdString();
50
//    std::string stringId = QString("id%1").arg(id).toStdString();
51
 
51
 
52
    // Note: using the color handler makes a copy of the rgb fields
52
    // Note: using the color handler makes a copy of the rgb fields
53
    colorHandler->setInputCloud(pointCloud.pointCloud);
53
    colorHandler->setInputCloud(pointCloud.pointCloud);
54
 
54
 
55
    if(!visualizer->updatePointCloud(pointCloud.pointCloud, *colorHandler, stringId)){
55
    if(!visualizer->updatePointCloud(pointCloud.pointCloud, *colorHandler, stringId)){
56
        visualizer->addPointCloud(pointCloud.pointCloud, *colorHandler, stringId);
56
        visualizer->addPointCloud(pointCloud.pointCloud, *colorHandler, stringId);
57
        visualizer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2.0, stringId);
57
        visualizer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2.0, stringId);
58
     }
58
     }
59
 
59
 
60
    // transformation matrix in Eigen format
60
    // transformation matrix in Eigen format
61
    cv::Mat TransformCV(3, 4, CV_32F);
61
    cv::Mat TransformCV(3, 4, CV_32F);
62
    cv::Mat(pointCloud.R).copyTo(TransformCV.colRange(0, 3));
62
    cv::Mat(pointCloud.R).copyTo(TransformCV.colRange(0, 3));
63
    cv::Mat(pointCloud.T).copyTo(TransformCV.col(3));
63
    cv::Mat(pointCloud.T).copyTo(TransformCV.col(3));
64
    Eigen::Affine3f Transform;
64
    Eigen::Affine3f Transform;
65
    cv::cv2eigen(TransformCV, Transform.matrix());
65
    cv::cv2eigen(TransformCV, Transform.matrix());
66
 
66
 
67
    visualizer->updatePointCloudPose(stringId, Transform.inverse());
67
    visualizer->updatePointCloudPose(stringId, Transform.inverse());
68
 
68
 
69
    this->update();
69
    this->update();
70
 
70
 
71
    emit pointCloudDataChanged();
71
    emit pointCloudDataChanged();
72
 
72
 
73
}
73
}
74
 
74
 
75
void SMPointCloudWidget::updatePointCloud(SMPointCloud pointCloud, int id){
75
void SMPointCloudWidget::updatePointCloud(SMPointCloud pointCloud, int id){
76
 
76
 
77
    std::string stringId = QString::number(id).toStdString();
77
    std::string stringId = QString::number(id).toStdString();
78
//    std::string stringId = QString("id%1").arg(id).toStdString();
78
//    std::string stringId = QString("id%1").arg(id).toStdString();
79
 
79
 
80
    // Note: using the color handler makes a copy of the rgb fields
80
    // Note: using the color handler makes a copy of the rgb fields
81
    colorHandler->setInputCloud(pointCloud.pointCloud);
81
    colorHandler->setInputCloud(pointCloud.pointCloud);
82
 
82
 
83
    if(!visualizer->updatePointCloud(pointCloud.pointCloud, *colorHandler, stringId)){
83
    if(!visualizer->updatePointCloud(pointCloud.pointCloud, *colorHandler, stringId)){
84
        visualizer->addPointCloud(pointCloud.pointCloud, *colorHandler, stringId);
84
        visualizer->addPointCloud(pointCloud.pointCloud, *colorHandler, stringId);
85
        visualizer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2.0, stringId);
85
        visualizer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2.0, stringId);
86
     }
86
     }
87
 
87
 
88
    this->update();
88
    this->update();
89
    emit pointCloudDataChanged();
89
    emit pointCloudDataChanged();
90
 
90
 
91
}
91
}
92
 
92
 
93
void SMPointCloudWidget::removePointCloud(int id){
93
void SMPointCloudWidget::removePointCloud(int id){
94
 
94
 
95
    std::string stringId = QString::number(id).toStdString();
95
    std::string stringId = QString::number(id).toStdString();
96
//    std::string stringId = QString("id%1").arg(id).toStdString();
96
//    std::string stringId = QString("id%1").arg(id).toStdString();
97
 
97
 
98
    visualizer->removePointCloud(stringId);
98
    visualizer->removePointCloud(stringId);
99
 
99
 
100
    this->update();
100
    this->update();
101
    emit pointCloudDataChanged();
101
    emit pointCloudDataChanged();
102
 
102
 
103
}
103
}
104
 
104
 
105
void SMPointCloudWidget::removeAllPointClouds(){
105
void SMPointCloudWidget::removeAllPointClouds(){
106
 
106
 
107
    visualizer->removeAllPointClouds();
107
    visualizer->removeAllPointClouds();
108
 
108
 
109
    this->update();
109
    this->update();
110
    emit pointCloudDataChanged();
110
    emit pointCloudDataChanged();
111
 
111
 
112
}
112
}
113
 
113
 
114
void SMPointCloudWidget::saveScreenShot(){
114
void SMPointCloudWidget::saveScreenShot(){
115
 
115
 
116
    vtkWindowToImageFilter* filter = vtkWindowToImageFilter::New();
116
    vtkWindowToImageFilter* filter = vtkWindowToImageFilter::New();
117
    //filter->SetInput(visualizer->getRenderWindow());
117
    //filter->SetInput(visualizer->getRenderWindow());
118
    filter->Modified();
118
    filter->Modified();
119
 
119
 
120
    QString fileName = QFileDialog::getSaveFileName(this, "Save Screen Shot", QString(), "*.png");
120
    QString fileName = QFileDialog::getSaveFileName(this, "Save Screen Shot", QString(), "*.png");
121
    QFileInfo info(fileName);
121
    QFileInfo info(fileName);
122
    QString type = info.suffix();
122
    QString type = info.suffix();
123
    if(type == "")
123
    if(type == "")
124
        fileName.append(".png");
124
        fileName.append(".png");
125
 
125
 
126
    vtkPNGWriter* writer = vtkPNGWriter::New();
126
    vtkPNGWriter* writer = vtkPNGWriter::New();
127
    writer->SetFileName(qPrintable(fileName));
127
    writer->SetFileName(qPrintable(fileName));
128
    writer->SetInputConnection(filter->GetOutputPort());
128
    writer->SetInputConnection(filter->GetOutputPort());
129
    writer->Write();
129
    writer->Write();
130
    writer->Delete();
130
    writer->Delete();
131
}
131
}
132
 
132
 
133
void SMPointCloudWidget::updateCalibrationParameters(){
133
void SMPointCloudWidget::updateCalibrationParameters(){
134
 
134
 
135
    QSettings settings;
135
    QSettings settings;
136
    QVariant calibrationVariant = settings.value("calibration/parameters");
136
    QVariant calibrationVariant = settings.value("calibration/parameters");
137
    SMCalibrationParameters calibration = calibrationVariant.value<SMCalibrationParameters>();
137
    SMCalibrationParameters calibration = calibrationVariant.value<SMCalibrationParameters>();
138
 
138
 
139
    // camera 0 coordinate system
139
    // camera 0 coordinate system
140
    //visualizer->removeCoordinateSystem("camera0", 0);
140
    visualizer->removeCoordinateSystem("camera0", 0);
141
    visualizer->addCoordinateSystem(100, "camera0", 0);
141
    visualizer->addCoordinateSystem(100, "camera0", 0);
142
 
142
 
143
    // camera 1 coordinate system
143
    // camera 1 coordinate system
144
    cv::Mat Transform1CV(3, 4, CV_32F);
144
    cv::Mat Transform1CV(3, 4, CV_32F);
145
    cv::Mat(calibration.R1).copyTo(Transform1CV.colRange(0, 3));
145
    cv::Mat(calibration.R1).copyTo(Transform1CV.colRange(0, 3));
146
    cv::Mat(calibration.T1).copyTo(Transform1CV.col(3));
146
    cv::Mat(calibration.T1).copyTo(Transform1CV.col(3));
147
    Eigen::Affine3f Transform1;
147
    Eigen::Affine3f Transform1;
148
    cv::cv2eigen(Transform1CV, Transform1.matrix());
148
    cv::cv2eigen(Transform1CV, Transform1.matrix());
149
 
149
 
150
    //visualizer->removeCoordinateSystem("camera1", 0);
150
    visualizer->removeCoordinateSystem("camera1", 0);
151
    visualizer->addCoordinateSystem(100, Transform1.inverse(), "camera1", 0);
151
    visualizer->addCoordinateSystem(100, Transform1.inverse(), "camera1", 0);
152
 
152
 
153
//    // rotation axis coordinate system
153
//    // rotation axis coordinate system
154
//    cv::Mat TransformRCV(3, 4, CV_32F);
154
//    cv::Mat TransformRCV(3, 4, CV_32F);
155
//    cv::Mat(calibration.Rr).copyTo(TransformRCV.colRange(0, 3));
155
//    cv::Mat(calibration.Rr).copyTo(TransformRCV.colRange(0, 3));
156
//    cv::Mat(calibration.Tr).copyTo(TransformRCV.col(3));
156
//    cv::Mat(calibration.Tr).copyTo(TransformRCV.col(3));
157
//    Eigen::Affine3f TransformR;
157
//    Eigen::Affine3f TransformR;
158
 
158
 
159
//    cv::cv2eigen(TransformRCV, TransformR.matrix());
159
//    cv::cv2eigen(TransformRCV, TransformR.matrix());
160
//    visualizer->removeCoordinateSystem("camera1", 0);
160
//    visualizer->removeCoordinateSystem("camera1", 0);
161
//    visualizer->addCoordinateSystem(100, TransformR.inverse(), "rotation", 0);
161
//    visualizer->addCoordinateSystem(100, TransformR.inverse(), "rotation", 0);
162
 
162
 
163
    // rotation axis pointing (0,1,0) in rotation stage frame
163
    // rotation axis pointing (0,1,0) in rotation stage frame
164
    cv::Vec3f O(0.0, 0.0, 0.0);
164
    cv::Vec3f O(0.0, 0.0, 0.0);
165
    cv::Vec3f v(0.0, 600.0, 0.0);
165
    cv::Vec3f v(0.0, 600.0, 0.0);
166
 
166
 
167
    // determine coefficients in camera 0 frame
167
    // determine coefficients in camera 0 frame
168
    O = calibration.Rr.t()*O + -calibration.Rr.t()*calibration.Tr;
168
    O = calibration.Rr.t()*O + -calibration.Rr.t()*calibration.Tr;
169
    v = calibration.Rr.t()*v + -calibration.Rr.t()*calibration.Tr - O;
169
    v = calibration.Rr.t()*v + -calibration.Rr.t()*calibration.Tr - O;
170
 
170
 
171
    pcl::ModelCoefficients lineCoefficients;
171
    pcl::ModelCoefficients lineCoefficients;
172
    lineCoefficients.values.resize(6);
172
    lineCoefficients.values.resize(6);
173
    lineCoefficients.values[0] = O[0];
173
    lineCoefficients.values[0] = O[0];
174
    lineCoefficients.values[1] = O[1];
174
    lineCoefficients.values[1] = O[1];
175
    lineCoefficients.values[2] = O[2];
175
    lineCoefficients.values[2] = O[2];
176
    lineCoefficients.values[3] = v[0];
176
    lineCoefficients.values[3] = v[0];
177
    lineCoefficients.values[4] = v[1];
177
    lineCoefficients.values[4] = v[1];
178
    lineCoefficients.values[5] = v[2];
178
    lineCoefficients.values[5] = v[2];
179
    visualizer->removeShape("line");
179
    visualizer->removeShape("line");
180
    visualizer->addLine(lineCoefficients);
180
    visualizer->addLine(lineCoefficients);
181
 
181
 
182
 
182
 
183
 
183
 
184
}
184
}
185
 
185
 
186
SMPointCloudWidget::~SMPointCloudWidget(){
186
SMPointCloudWidget::~SMPointCloudWidget(){
187
 
187
 
188
    //delete visualizer;
188
    //delete visualizer;
189
 
189
 
190
}
190
}
191
 
191