如何缩放二维点向量以匹配调整尺寸后的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
相关产品推荐
相关产品推荐

