C++ OpenCV如何获取嵌套矩形顶点在原始全帧下的坐标?
问题排查与修正
你的坐标映射逻辑存在两个核心错误,直接导致绘制的矩形位置偏移:
- 缺失小帧的原点偏移量:当前代码默认小帧的左上角与全帧坐标系的(0,0)点重合,但你明确说明小帧是嵌套在全帧内部的子区域,小帧自身的左上角在全帧下有固定的坐标偏移,你没有把这个偏移叠加到映射后的bbox坐标上,这是位置错误的核心原因。
- 整数除法导致精度丢失:计算缩放比例时你直接用整数值相除,C++中两个int类型运算会得到int结果,直接截断小数部分。哪怕你当前测试用的比例是整数2,一旦后续场景里缩放比不是整数,计算出的坐标会出现明显偏差。
修正逻辑
首先补全你之前缺失的必要参数:小帧本身在全帧坐标系下的左上角坐标(crop_offset_x, crop_offset_y),也就是小帧左上角对应全帧的x、y值。
正确的坐标映射公式为:
全帧下的点坐标 = 小帧下的点坐标 * 对应轴缩放比例 + 小帧在全帧对应轴的偏移量
修正后代码示例
cv::Point2d rawTopLeft, rawBotRight; // 小帧下的bbox左上、右下坐标(x0,y0, x1,y1) // 基础参数定义 const int origin_w = 640; // 全帧宽度 const int origin_h = 400; // 全帧高度 const int crop_w = 320; // 小帧宽度 const int crop_h = 200; // 小帧高度 // 需要根据实际嵌套位置赋值的参数:小帧左上角在全帧下的偏移 const int crop_offset_x = 0; // 替换为实际的小帧左上x坐标 const int crop_offset_y = 0; // 替换为实际的小帧左上y坐标 // 转浮点计算缩放比例,避免整数截断 double xScale = static_cast<double>(origin_w) / crop_w; double yScale = static_cast<double>(origin_h) / crop_h; // 映射坐标:先做缩放,再叠加偏移 cv::Point2d topLeft( rawTopLeft.x * xScale + crop_offset_x, rawTopLeft.y * yScale + crop_offset_y ); cv::Point2d botRight( rawBotRight.x * xScale + crop_offset_x, rawBotRight.y * yScale + crop_offset_y ); // 绘制矩形,推荐直接传两个对角点的重载,避免手动计算宽高出错 // 注意OpenCV原生C++接口函数名为小写开头的rectangle cv::rectangle( your_full_frame_mat, topLeft, botRight, cv::Scalar(0,255,0), // 边框颜色可按需修改 2 // 边框线宽可按需修改 );
注:如果你的小帧是全帧整体缩放后再裁剪得到,而非全帧先裁剪再缩放得到,就调换缩放和偏移的计算顺序:先计算点相对于小帧原点的偏移,加上裁剪偏移量后再乘缩放比例,可根据实际的帧生成逻辑调整。
问题示意图

内容的提问来源于stack exchange,提问作者Archie
相关产品推荐
相关产品推荐

