Я недавно начал работать с OpenCV 3.0, и моя цель - захватить пару стереоизображений из набора стереокамер, создать правильную карту несоответствия, преобразуйте карту несоответствий в облако 3D-точек и, наконец, покажите полученное облако точек в средстве просмотра облачных точек с помощью PCL.Как создать допустимое представление облачной точки пары стереоизображений с использованием OpenCV 3.0 StereoSGBM и PCL
я уже выполнил калибровку камеры и в результате калибровки RMS составляет 0,4
Вы можете найти свои пары изображений (левое изображение) 1 и (правое изображение) 2 в приведенных ниже ссылок. Я использую StereoSGBM, чтобы создать изображение несоответствия. Я также использую дорожки для настройки параметров функции StereoSGBM, чтобы получить лучшее изображение несоответствия. К сожалению, я не могу опубликовать свое изображение несоответствия, так как я новичок в StackOverflow и не имею достаточной репутации, чтобы размещать более двух ссылок на изображения!
После получения изображения несоответствия («disp» в приведенном ниже коде), я использую функцию repjectImageTo3D() для преобразования информации о несоответствии изображения в координату XYZ 3D, а затем преобразовываю результаты в массив «pcl: : PointXYZRGB ", чтобы они могли отображаться в средстве просмотра облачных точек PCL. После выполнения требуемого преобразования то, что я получаю как облако точек, - это глупое облако точек формы пирамиды, которое не имеет никакого смысла. Я уже прочитал и попробовал все предложенные методы по следующим ссылкам:
1- http: //blog.martinperis.com/2012/01/3d-reconstruction-with-opencv-and-point.html
2- HTTP: //stackoverflow.com/questions/13463476/opencv-stereorectifyuncalibrated-to-3d-point-cloud
3- HTTP: //stackoverflow.com/questions/22418846/reprojectimageto3d-in- opencv
и не из них работали !!!
Ниже я представил часть преобразования моего кода, было бы весьма признателен, если бы вы могли сказать мне, что я пропускаю:
pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointcloud(new pcl::PointCloud<pcl::PointXYZRGB>());
Mat xyz;
reprojectImageTo3D(disp, xyz, Q, false, CV_32F);
pointcloud->width = static_cast<uint32_t>(disp.cols);
pointcloud->height = static_cast<uint32_t>(disp.rows);
pointcloud->is_dense = false;
pcl::PointXYZRGB point;
for (int i = 0; i < disp.rows; ++i)
{
uchar* rgb_ptr = Frame_RGBRight.ptr<uchar>(i);
uchar* disp_ptr = disp.ptr<uchar>(i);
double* xyz_ptr = xyz.ptr<double>(i);
for (int j = 0; j < disp.cols; ++j)
{
uchar d = disp_ptr[j];
if (d == 0) continue;
Point3f p = xyz.at<Point3f>(i, j);
point.z = p.z; // I have also tried p.z/16
point.x = p.x;
point.y = p.y;
point.b = rgb_ptr[3 * j];
point.g = rgb_ptr[3 * j + 1];
point.r = rgb_ptr[3 * j + 2];
pointcloud->points.push_back(point);
}
}
viewer.showCloud(pointcloud);
уточняйте, пожалуйста, фотографии, которые вы предоставили, они выглядят одинаково – alexisrozhkov
Sorry, My bad. Я загрузил правильные рамки! –