vector<Point2d> 详解

本文介绍如何利用vector&lt;Point2d&gt;处理图像边框坐标,包括获取图像矩形边框的中心点坐标,并演示如何单独操作这些坐标中的x和y值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vector<Point2d>这东西让我找了好久,网上介绍vector的东西很多,但是对于数据类型时Point2dPoint2iPoint2f这样的资料却很好。

先来介绍一下基本概念:

Point2i——表示它保存的数值时int类型咯;

Point2f——float

Point2d——double

在此我将根据自己项目中用到的东西加以说明,当然用我最喜欢的手法:实例,来说明问题咯。

例:如何将得到的“图像矩形边框左上角坐标及它的宽和高”保存在centers(保存图像边框的中心点坐标)中。

vector<Point2d> centers;
double x = p[0];  //矩形边框左上角的x坐标
double y = p[1];  //矩形边框左上角的y坐标
double w = p[2];  //矩形边框宽度
double h = p[3];	//矩形边框高度
Rect r(x, y, w, h);  //这一步很重要
centers.push_back((r.br() + r.tl())*0.5);//br():(x+width, y+height)   tl():(x,y)

特别说明:.br()表示保存(x+width, y+height)

                .tl():表示保存(x,y)

                (r.br() + r.tl())*0.5 恰好等于矩形边框的中心点


那么,如何单独操作一个坐标中的x,y呢?

还是用上面的例子:

for (int i = 0; i<centers.size(); i++)
{
<span style="white-space:pre">	</span>double a = centers[i].x;//第i个中心点的x坐标
<span style="white-space:pre">	</span>double b = centers[i].y;//第i个中心点的y坐标
}

 

好了,你可以尽情的操作了,,,


不要使用动态的输出路径了,请直接利用绝对路径,修改这个函数剩余的部分:void computeNearOriginalEpipolarParams( const CameraParams& cam1, const CameraParams& cam2, const cv::Size& imgSize, EpipolarParams& epi1, EpipolarParams& epi2) { // 计算相对位姿 cv::Mat R_rel = cam2.R * cam1.R.t(); cv::Mat T_rel = cam2.T - R_rel * cam1.T; // 立体校正 cv::Mat R1_rect, R2_rect, P1_rect, P2_rect, Q; cv::stereoRectify(cam1.K, cv::Mat(), cam2.K, cv::Mat(), imgSize, R_rel, T_rel, R1_rect, R2_rect, P1_rect, P2_rect, Q, cv::CALIB_ZERO_DISPARITY, 0, imgSize); // 定义角点 std::vector<cv::Point2d> corners; corners.push_back(cv::Point2d(0, 0)); corners.push_back(cv::Point2d(imgSize.width - 1, 0)); corners.push_back(cv::Point2d(0, imgSize.height - 1)); corners.push_back(cv::Point2d(imgSize.width - 1, imgSize.height - 1)); // 计算单应矩阵 epi1.H = cam1.K.inv().t() * R1_rect * cam1.K; epi2.H = cam2.K.inv().t() * R2_rect * cam2.K; // 计算变换后的角点 std::vector<cv::Point2d> near_corners1, near_corners2; cv::perspectiveTransform(corners, near_corners1, epi1.H); cv::perspectiveTransform(corners, near_corners2, epi2.H); // 合并所有点计算边界 std::vector<cv::Point2d> all_near_points; all_near_points.insert(all_near_points.end(), near_corners1.begin(), near_corners1.end()); all_near_points.insert(all_near_points.end(), near_corners2.begin(), near_corners2.end()); cv::Rect near_bbox = computeBoundingRect(all_near_points); cv::Size near_size(near_bbox.width, near_bbox.height); // 计算主点偏移 double cx = -near_bbox.x; double cy = -near_bbox.y; // 构建平移矩阵 cv::Mat T_near = (cv::Mat_<double>(3, 3) << 1, 0, cx, 0, 1, cy, 0, 0, 1); // 应用平移补偿 epi1.H = T_near * epi1.H; epi2.H = T_near * epi2.H; // 设置输出参数 epi1.size = near_size; epi2.size = near_size; epi1.filename = "C:\\Users\\ASUS\\Desktop\\摄测课设\\相机标定\\相机标定\\results\\near_L.tif"; epi2.filename = "C:\\Users\\ASUS\\Desktop\\摄测课设\\相机标定\\相机标定\\results\\near_L.tif"; }
最新发布
07-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值