2015-08-24 7 views
1

Ситуация: Я пытаюсь получить 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) enter image description here

Mini вопрос: если AdaptiveCostSOStereoMatching действительно позволяет построить облако точек от 2-х изображений, как ACSSM делать это без insintric и excentic параметров?

+0

мог Вы dd фактическая строка ошибки – chris

+0

Я добавил информацию об ошибке. (Сообщение обновлено) –

+0

в моем опыте с PCL указатели не настолько интуитивно понятны. 'compute' принимает указатели на облако, и вы используете встроенный' Ptr'. несколько советов, чтобы попытаться: либо удалить разыменование (т.е. 'left_cloud' не' * left_cloud'), передать его как ссылку и '&' вместо '*', либо просто использовать облако прямых точек, а не 'Ptr 'и передать их как ссылки с' & ' – chris

ответ

0

Задача: Я загрузил и установил старую версию PCL без stereo.
После этого я скачал stereo из другого пакета PCL и добавил эту библиотеку в свой пакет PCL. И это сработало неправильно.

Решение: Я собрал PCL 1.8, и моя программа в порядке.
OS: Windows
IDE: MSVS 12 2013 x64

Если вы будете пытаться собрать PCL, эти ссылки могут помочь вам:
Official-tutorial-1
Official-tutorial-2
Good help with FLANN and VTK

Example to verify installation

Смежные вопросы