#include <opencv2/opencv.hpp>
#include <opencv2/calib3d/calib3d.hpp>
int main() {
// 读取双目标定的结果
cv::FileStorage fs("stereo_calibration.yml", cv::FileStorage::READ);
cv::Mat cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, P1, P2, Q;
fs["cameraMatrix1"] >> cameraMatrix1;
fs["distCoeffs1"] >> distCoeffs1;
fs["cameraMatrix2"] >> cameraMatrix2;
fs["distCoeffs2"] >> distCoeffs2;
fs["R"] >> R;
fs["P1"] >> P1;
fs["P2"] >> P2;
fs["Q"] >> Q;
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, P1, cv::Mat(), cv::INTER_LINEAR);
cv::remap(imgRight, imgRectRight, P2, cv::Mat(), cv::INTER_LINEAR);
// 进行立体匹配
cv::StereoBM stereo;
int blockSize = 9;
int numDisparities = 16;
stereo = cv::StereoBM::create(numDisparities, blockSize);
cv::Mat disparity;
stereo.compute(imgRectLeft, imgRectRight, disparity);
// 计算物体长度
// 假设你已知物体在场景中的位置,可以根据视差图中的像素值计算实际的物体长度
// 具体的计算方法取决于你的场景和实际需求
// 例如,假设你知道物体在图像中的左右边缘对应的像素坐标
int leftEdgePixel = /* 左边缘的像素坐标 */;
int rightEdgePixel = /* 右边缘的像素坐标 */;
// 计算视差值
float disparityValue = disparity.at<float>(/* 物体的垂直中心像素坐标 */, (leftEdgePixel + rightEdgePixel) / 2);
// 计算实际物体长度
float baseline = Q.at<double>(3, 2); // 基线长度
float focalLength = cameraMatrix1.at<double>(0, 0); // 焦距
float objectLength = baseline * focalLength / disparityValue;
std::cout << "物体长度:" << objectLength << " 米" << std::endl;
return 0;
}