拟合已知空间两点坐标的直线并将其可视化的C++代码
以下是一个使用C++代码拟合已知空间两点坐标的直线并将其可视化的示例:
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
using namespace cv;
// 定义点的结构体
struct Point3D {
double x, y, z;
};
// 拟合直线函数
void fitLine(const std::vector<Point3D>& points, double& a, double& b, double& c) {
// 初始化参数
double sum_x = 0, sum_y = 0, sum_z = 0;
double sum_xy = 0, sum_xz = 0, sum_yz = 0;
double sum_xx = 0, sum_yy = 0, sum_zz = 0;
// 计算参数的累加和
for (const auto& point : points) {
sum_x += point.x;
sum_y += point.y;
sum_z += point.z;
sum_xy += point.x * point.y;
sum_xz += point.x * point.z;
sum_yz += point.y * point.z;
sum_xx += point.x * point.x;
sum_yy += point.y * point.y;
sum_zz += point.z * point.z;
}
// 构建矩阵
cv::Mat A = (cv::Mat_<double>(3, 3) <<
sum_xx, sum_xy, sum_x,
sum_xy, sum_yy, sum_y,
sum_x, sum_y, points.size());
cv::Mat B = (cv::Mat_<double>(3, 1) <<
sum_xz, sum_yz, sum_z);
// 求解线性方程组
cv::Mat X;
cv::solve(A, B, X);
// 获取拟合直线的参数
a = X.at<double>(0, 0);
b = X.at<double>(1, 0);
c = X.at<double>(2, 0);
}
int main() {
// 定义已知空间两点坐标
std::vector<Point3D> points = { {1, 2, 3}, {4, 5, 6} };
// 拟合直线
double a, b, c;
fitLine(points, a, b, c);
std::cout << "拟合直线的方程为: " << std::endl;
std::cout << "z = " << a << " * x + " << b << " * y + " << c << std::endl;
// 可视化拟合直线
cv::Mat image(500, 500, CV_8UC3, cv::Scalar(255, 255, 255));
cv::Point3d p1(points[0].x, points[0].y, points[0].z);
cv::Point3d p2(points[1].x, points[1].y, points[1].z);
cv::line(image, cv::Point2d(p1.x, p1.y), cv::Point2d(p2.x, p2.y), cv::Scalar(0, 0, 0), 2);
cv::imshow("Fitted Line", image);
cv::waitKey(0);
return 0;
}
这段代码使用OpenCV库进行直线拟合和图像可视化。输入的已知空间两点坐标存储在points向量中,通过fitLine函数拟合直线参数,并打印拟合直线的方程。然后,使用OpenCV的绘图函数line在图像窗口中绘制拟合直线。最后,通过imshow函数显示图像,并通过waitKey函数等待用户按下键盘任意键关闭窗口
原文地址: https://www.cveoy.top/t/topic/hL0P 著作权归作者所有。请勿转载和采集!