You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何缩放二维点向量以匹配调整尺寸后的OpenCV图像?

问题原因
  • 缩放因子使用整数类型存储,精度丢失:cv::Size的成员为int类型,计算时会触发整数截断。以你给出的分辨率为例,高度缩放比为1080/240=4.5,使用int存储时会被截断为4,最终计算出的Y轴坐标会比正确值大12.5%,直接导致点位偏移。
  • 坐标转换时未做精度处理:直接对浮点坐标做整数强转时默认截断小数部分,极端场景下会出现1像素的偏移。
正确实现代码

步骤1:计算浮点型缩放因子

cv::Size imgSize(frame.cols, frame.rows); // 原图尺寸
cv::Size resz(320, 240);                  // 目标尺寸

// 计算浮点型缩放因子:新坐标 = 原坐标 * 缩放因子
double scaleX = static_cast<double>(resz.width) / imgSize.width;
double scaleY = static_cast<double>(resz.height) / imgSize.height;

步骤2:缩放图像

cv::resize(frame, frame, resz, 0, 0); // 直接指定目标尺寸,fx/fy设为0即可

步骤3:转换点位并绘制

for (int i = 0; i < keypoints.size(); i++)
{
    // 坐标转换时做四舍五入,避免截断误差
    int newX = static_cast<int>(std::round(keypoints[i].pt.x * scaleX));
    int newY = static_cast<int>(std::round(keypoints[i].pt.y * scaleY));
    cv::drawMarker(frame, cv::Point(newX, newY), Scalar(0, 0, 255), cv::MARKER_CROSS);
}
额外注意事项
  • 如果你的业务要求保持图像宽高比,缩放后做边缘填充,需要额外计算填充的偏移量,在最终坐标上加上对应偏移值即可。
  • 如果后续还要把缩放后图像的点位映射回原图,只需用新坐标除以对应缩放因子即可,同样要使用浮点计算避免精度损失。

内容的提问来源于stack exchange,提问作者anti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:09:03