Niedawno zacząłem pracować z OpenCV 3.0, a moim celem jest uchwycenie pary stereofonicznych obrazów z zestawu kamer stereoskopowych, stworzenie odpowiednią mapę różnic, przekonwertuj mapę różnicową na chmurę punktów 3D i na koniec pokaż wynikową chmurę punktów w przeglądarce chmur punktów za pomocą PCL.Jak wygenerować poprawną reprezentację chmur punktów w pary stereoskopowych obrazów przy użyciu OpenCV 3.0 StereoSGBM i PCL
już przeprowadzono kalibrację kamery i otrzymaną RMS kalibracji wynosi 0,4
można znaleźć moje par obrazków (lewy obraz) 1 i (prawy obraz) 2 w poniższe linki. Używam StereoSGBM w celu uzyskania obrazu różnicowego. Używam także drążków do regulacji parametrów funkcji StereoSGBM w celu uzyskania lepszego obrazu różnic. Niestety nie mogę opublikować mojego obrazu różnicowego, ponieważ jestem nowy w StackOverflow i nie mam wystarczającej reputacji, aby opublikować więcej niż dwa linki do obrazów!
Po uzyskaniu obrazu różnicowego ("disp" w poniższym kodzie), używam funkcji reprojectImageTo3D() do konwersji informacji o obrazie rozbieżności na współrzędną XYZ 3D, a następnie przekonwertuję wyniki na tablicę "pcl: : PointXYZRGB "wskazuje, że można je wyświetlić w przeglądarce chmur punktów PCL. Po wykonaniu wymaganej konwersji, co dostaję jako chmurę punktów, jest głupia piramida, która nie ma żadnego sensu. Przeczytałem i wypróbowałem wszystkie sugerowane metody w następujących linkach:
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
i żaden z nich nie działał !!!
Poniżej umieszczono część konwersji mojego kodu, byłoby bardzo mile widziane, jeśli możesz mi powiedzieć, co mi brakuje:
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);
proszę sprawdzić zdjęcia, które podałeś, wyglądają tak samo – alexisrozhkov
Niestety, mój zły. Przesłałem odpowiednie ramki! –