Ситуация: Я пытаюсь получить point cloud
с pcl::AdaptiveCostSOStereoMatching
, который использует два выпрямленного изображения (фотографии являются ОК).Понимание StereoMatching в Облако точек Библиотека
Я использовал этих учебники, чтобы узнать, как это сделать:
First tutorial
Second tutorial
Ошибка: сбой программы во время выполнения при вызове "compute"
метода AdaptiveCostSOStereoMatching
Вопроса: как правильно передать изображения методу "compute"
?
Я попытался:
1) Изображения, преобразованные png2pcd (командной строки:"png2pcd.exe in.png out.pcd"
)
2) Изображения, преобразованные с функцией ниже от cv::Mat
Но не повезло.
Функция, которая преобразует резюме :: Mat в PCl :: PointCloud
void MatToPointCloud(Mat& mat, pcl::PointCloud<RGB>::Ptr cloud)
{
int width = mat.cols;
int height = mat.rows;
pcl::RGB val;
val.r = 0; val.g = 0; val.b = 0;
for (int i = 0; i < mat.rows; i++)
for (int j = 0; j < mat.cols; j++)
{
auto point = mat.at<Vec3b>(i, j);
//std::cout << j << " " << i << "\n";
val.b = point[0];
val.g = point[1];
val.r = point[2];
cloud->at(j, i) = val;
}
}
ПКЛ :: AdaptiveCostSOStereoMatching (вычисления) информация
// Input
Mat leftMat, rightMat;
leftMat = imread("left.png");
rightMat = imread("right.png");
int width = leftMat.cols;
int height = rightMat.rows;
pcl::RGB val;
val.r = 0; val.g = 0; val.b = 0;
pcl::PointCloud<pcl::RGB>::Ptr left_cloud(new pcl::PointCloud<pcl::RGB>(width, height, val));
pcl::PointCloud<pcl::RGB>::Ptr right_cloud(new pcl::PointCloud<pcl::RGB>(width, height, val));
MatToPointCloud(leftMat, left_cloud);
MatToPointCloud(rightMat, right_cloud);
// Calculation
pcl::AdaptiveCostSOStereoMatching stereo;
stereo.setMaxDisparity(60);
//stereo.setXOffest(0); Почему-то не распознается
stereo.setRadius(5);
stereo.setSmoothWeak(20);
stereo.setSmoothStrong(100);
stereo.setGammaC(25);
stereo.setGammaS(10);
stereo.setRatioFilter(20);
stereo.setPeakFilter(0);
stereo.setLeftRightCheck(true);
stereo.setLeftRightCheckThreshold(1);
stereo.setPreProcessing(true);
stereo.compute(*left_cloud, *right_cloud); // <-- CRASHING THERE
stereo.medianFilter(4);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr out_cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
stereo.getPointCloud(318.11220, 224.334900, 368.534700, 0.8387445, out_cloud, left_cloud);
Ошибка:
Выход log: HEAP [App.exe]:
Блок кучи при 0000006B0F828460 изменен в 0000006B0F8284A8 прошлый запрошенный размер 38
App.exe вызвал точку останова.
left_cloud (право облако выглядит left_cloud)
Mini вопрос: если AdaptiveCostSOStereoMatching
действительно позволяет построить облако точек от 2-х изображений, как ACSSM
делать это без insintric и excentic параметров?
мог Вы dd фактическая строка ошибки – chris
Я добавил информацию об ошибке. (Сообщение обновлено) –
в моем опыте с PCL указатели не настолько интуитивно понятны. 'compute' принимает указатели на облако, и вы используете встроенный' Ptr'. несколько советов, чтобы попытаться: либо удалить разыменование (т.е. 'left_cloud' не' * left_cloud'), передать его как ссылку и '&' вместо '*', либо просто использовать облако прямых точек, а не 'Ptr 'и передать их как ссылки с' & ' – chris