Я пытаюсь получить 3D-координаты с помощью стереокамеры.
Первый метод заключается в расчете непосредственно по этой формуле.
Второй способ — использовать reprojectImageTo3D в opencv.
Но я не знаю принципа этого метода.
Результат не в миллиметрах, поэтому трудно подобрать размер.
Пожалуйста, объясните мне разницу между этими двумя методами.
(Первый из этих кодов предназначен для преобразования точечного объекта в 3D-координаты после сопоставления.) (Второй код предназначен для вычисления несоответствия всего стереоизображения с помощью SGBM и вычисления 3D-координат точечного объекта с помощью reprojectImageTo3D.)
*Первый способ
cv::Mat depth(m_input.m_leftImg.size(), CV_32FC3, cv::Scalar::all(0));
int size = feOutput.m_leftKp.size();
for (int i = 0; i < size; i++)
{
cv::Point pt = cv::Point((int)(feOutput.m_leftKp.at(i).pt.x + 0.5f), (int)(feOutput.m_leftKp.at(i).pt.y + 0.5f));
depth.at<cv::Vec3f>(pt)[2] = fX * baseLine / (feOutput.m_leftKp.at(i).pt.x - feOutput.m_rightKp.at(i).pt.x); // Z
depth.at<cv::Vec3f>(pt)[0] = (feOutput.m_leftKp.at(i).pt.x - cX) * depth.at<cv::Vec3f>(pt)[2] / fX; // X
depth.at<cv::Vec3f>(pt)[1] = (feOutput.m_leftKp.at(i).pt.y - cY) * depth.at<cv::Vec3f>(pt)[2] / fY; // Y
}
depth /= 1000.f; //milli-meter to meter
*Второй способ
cv::Mat disparity16S(m_input.m_leftImg.size(), CV_16S);
sgbm->compute(m_input.m_leftImg, m_input.m_rightImg, disparity16S);
cv::Mat xyz;
cv::Matx44d Q = cv::Matx44d(
1.0, 0.0, 0.0, -cX,
0.0, 1.0, 0.0, -cY,
0.0, 0.0, 0.0, fX,
0.0, 0.0, -1.0 / baseLine, 0/*(CX - CX) / baseLine*/
);
cv::reprojectImageTo3D(disparity16S, xyz, Q, true);
cv::Mat pointXYZ(xyz.size(), xyz.type(), cv::Scalar::all(0));
for (int i = 0; i < size; i++)
{
cv::Point pt = cv::Point((int)(feOutput.m_leftKp.at(i).pt.x + 0.5f), (int)(feOutput.m_leftKp.at(i).pt.y + 0.5f));
pointXYZ.at<cv::Vec3f>(pt) = xyz.at<cv::Vec3f>(pt) / 1000.f;
}
Добавить+ Розовый — это размер метода reprojectImageTo3D, масштабированный до 1/100, а желтый — это размер 1/1000 (мм 2 метра) в первом методе. Если эти два метода одинаковы, почему существует разница в масштабе?