#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 读取双目标定的结果
cv::FileStorage fs("stereo_calibration.yml", cv::FileStorage::READ);
cv::Mat cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, T, E, F;
fs["cameraMatrix1"] >> cameraMatrix1;
fs["distCoeffs1"] >> distCoeffs1;
fs["cameraMatrix2"] >> cameraMatrix2;
fs["distCoeffs2"] >> distCoeffs2;
fs["R"] >> R;
fs["T"] >> T;
fs.release();
// 读取左右摄像头的图像
cv::Mat imgLeft = cv::imread("left_image.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat imgRight = cv::imread("right_image.jpg", cv::IMREAD_GRAYSCALE);
// 矫正图像
cv::Mat imgRectLeft, imgRectRight;
cv::remap(imgLeft, imgRectLeft, cameraMatrix1, distCoeffs1, cv::INTER_LINEAR);
cv::remap(imgRight, imgRectRight, cameraMatrix2, distCoeffs2, cv::INTER_LINEAR);
// 使用ORB特征点检测
cv::Ptr<cv::ORB> orb = cv::ORB::create();
std::vector<cv::KeyPoint> keypointsLeft, keypointsRight;
cv::Mat descriptorsLeft, descriptorsRight;
orb->detectAndCompute(imgRectLeft, cv::noArray(), keypointsLeft, descriptorsLeft);
orb->detectAndCompute(imgRectRight, cv::noArray(), keypointsRight, descriptorsRight);
// 使用暴力匹配寻找匹配的特征点对
cv::BFMatcher matcher(cv::NORM_HAMMING);
std::vector<cv::DMatch> matches;
matcher.match(descriptorsLeft, descriptorsRight, matches);
// 提取匹配点对的像素坐标
std::vector<cv::Point2f> imgPointsLeft, imgPointsRight;
for (const auto& match : matches) {
imgPointsLeft.push_back(keypointsLeft[match.queryIdx].pt);
imgPointsRight.push_back(keypointsRight[match.trainIdx].pt);
}
// 使用三角测量将像素坐标转换为世界坐标
cv::Mat points4D;
cv::triangulatePoints(cameraMatrix1 * cv::Mat::eye(3, 4, CV_64F), cameraMatrix2 * cv::Mat::eye(3, 4, CV_64F),
imgPointsLeft, imgPointsRight, points4D);
// 转换为齐次坐标并获取三维坐标
cv::Mat points3D;
cv::convertPointsFromHomogeneous(points4D.t(), points3D);
// 输出三维坐标
for (int i = 0; i < points3D.rows; ++i) {
cv::Point3f worldPoint = points3D.at<cv::Point3f>(i);
std::cout << "World Coordinate " << i << ": " << worldPoint << std::endl;
}
return 0;
}

被折叠的 条评论
为什么被折叠?



