1. pcl 初使用
#pragma warning(disable:4996)
#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
using namespace std;
using namespace cv;
int main() {
Mat depth = imread("D:\\学习资料\\C++\\C++ code\\SGBM\\SGBM\\output_depth.png", 0);
Mat rgb = imread("D:\\学习资料\\C++\\C++ code\\middleburry_dataset\\MiddEval3-data-Q\\MiddEval3\\trainingQ\\Adirondack\\im0.png", -1);
const double camera_cx = 322.037;
const double camera_cy = 243.393;
const double camera_fx = 1038.018;
const double camera_fy = 1038.018;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
for (int i = 0; i < depth.rows; i++) {
for (int j = 0; j < depth.cols; j++) {
uchar d = depth.ptr<uchar>(i)[j];
if (d == 0) {
continue;
}
pcl::PointXYZRGB p;
p.z = -double(d) / 4.;
p.x = -(i - camera_cx) * p.z / camera_fx;
p.y = -(j - camera_cy) * p.z / camera_fy;
p.b = rgb.ptr<uchar>(i)[j * 3];
p.g = rgb.ptr<uchar>(i)[j * 3 + 1];
p.r = rgb.ptr<uchar>(i)[j * 3 + 2];
cloud->points.push_back(p);
}
}
cloud->height = 1;
cloud->width = cloud->points.size();
cout << "point cloud size = " << cloud->points.size() << endl;
pcl::visualization::CloudViewer viewer("cloud viewer");
viewer.showCloud(cloud);
cloud->is_dense = false;
pcl::io::savePCDFile("D:\\学习资料\\C++\\C++ code\\usepcl\\usepcl\\pointcloud.pcd", *cloud);
cloud->points.clear();
cout << "Point cloud saved." << endl;
system("pause");
return 0;
}
2. SGBM + pcl
#pragma warning(disable:4996)
#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
using namespace std;
using namespace cv;
typedef pcl::PointXYZRGBA PointT;
typedef pcl::PointCloud<PointT> PointCloud;
void pointcloud(Mat& depth) {
const double camera_cx = 322.037;
const double camera_cy = 243.393;
const double camera_fx = 1038.018;
const double camera_fy = 1038.018;
Mat rgb;
rgb = imread("D:\\学习资料\\C++\\C++ code\\middleburry_dataset\\MiddEval3-data-Q\\MiddEval3\\trainingQ\\Adirondack\\im0.png", -1);
PointCloud::Ptr cloud(new PointCloud);
for (int i = 0; i < depth.rows; i++) {
for (int j = 0; j < depth.cols; j++) {
double d = depth.ptr<double>(i)[j];
if (d == 0) {
continue;
}
PointT p;
p.z = -d;
p.x = -(i - camera_cx) * p.z / camera_fx;
p.y = -(j - camera_cy) * p.z / camera_fy;
p.b = rgb.ptr<uchar>(i)[j * 3];
p.g = rgb.ptr<uchar>(i)[j * 3 + 1];
p.r = rgb.ptr<uchar>(i)[j * 3 + 2];
cloud->points.push_back(p);
}
}
cloud->height = 1;
cloud->width = cloud->points.size();
cout << "point cloud size = " << cloud->points.size() << endl;
pcl::visualization::CloudViewer viewer("cloud viewer");
viewer.showCloud(cloud);
while (!viewer.wasStopped()) {
}
cloud->is_dense = false;
pcl::io::savePCDFile("D:\\学习资料\\C++\\C++ code\\SGBM\\SGBM\\pointcloud.pcd", *cloud);
cloud->points.clear();
cout << "Point cloud saved." << endl;
}
Mat calc_depth(const Mat& disp) {
double f = 1038.018;
double doffs = 53.271;
double baseline = 176.252;
Mat depth = Mat(disp.rows, disp.cols, CV_64FC1);
for (int i = 0; i < disp.rows; i++) {
for (int j = 0; j < disp.cols; j++) {
depth.at<double>(i, j) = (baseline * f) / (double(disp.at<uchar>(i, j)) / (255. / 73) + doffs);
}
}
pointcloud(depth);
Mat depth8U = Mat(disp.rows, disp.cols, CV_8U);
normalize(depth, depth8U, 0, 255, NORM_MINMAX, CV_8UC1);
return depth8U;
}
int main() {
Mat left_img = imread("D:\\学习资料\\C++\\C++ code\\middleburry_dataset\\MiddEval3-data-Q\\MiddEval3\\trainingQ\\Adirondack\\im0.png", 0);
Mat right_img = imread("D:\\学习资料\\C++\\C++ code\\middleburry_dataset\\MiddEval3-data-Q\\MiddEval3\\trainingQ\\Adirondack\\im1.png", 0);
int mindisparity = 0;
int ndisparities = 73;
int SADWindowSize = 11;
Ptr<StereoSGBM> sgbm = StereoSGBM::create(mindisparity, ndisparities, SADWindowSize);
int P1 = 8 * left_img.channels() * SADWindowSize * SADWindowSize;
int P2 = 32 * left_img.channels() * SADWindowSize * SADWindowSize;
sgbm->setP1(P1);
sgbm->setP2(P2);
sgbm->setPreFilterCap(15);
sgbm->setUniquenessRatio(10);
sgbm->setSpeckleRange(2);
sgbm->setSpeckleWindowSize(50);
sgbm->setDisp12MaxDiff(1);
sgbm->setMode(cv::StereoSGBM::MODE_HH);
Mat disp;
sgbm->compute(left_img, right_img, disp);
disp.convertTo(disp, CV_32F, 1.0 / 16);
Mat disp8U = Mat(disp.rows, disp.cols, CV_8UC1);
disp.convertTo(disp8U, CV_8UC1, 255. / ndisparities);
Mat depth = calc_depth(disp8U);
imshow("disparity", disp8U);
waitKey(0);
imwrite("output_disparity.png", disp8U);
imwrite("output_depth.png", depth);
system("pause");
return 0;
}