OpenCV中Mat.at()调用抛出异常的参数问题咨询
问题分析与解决建议
参数存在明显问题,直接导致了程序异常,具体分析如下:
u_img的值为-28.672,这是负数,完全超出了1024×1024图像的列索引范围(有效列索引是0到1023),OpenCV的cv::Mat::at<>方法会对越界索引直接抛出异常,这是核心原因。v_img的值为578.815,虽然数值落在0到1023之间,但at<>方法要求传入整数类型的索引,直接用浮点数会触发隐式类型转换,可能导致索引截断(比如变成578),采样结果不符合预期,同样存在风险。
问题根源
输入的u参数为负数(计算得u ≈ -28.672 / 1024 ≈ -0.028),超出了常规纹理采样中u∈[0,1]的范围;而v参数的计算结果是正常的,但浮点数索引本身不符合API要求。
修正方案
需要对输入参数做范围约束,并将浮点数坐标转为合法的整数索引,示例代码如下:
Eigen::Vector3f getColor(float u, float v) { // 先将u、v裁剪到[0,1]的有效范围 u = std::clamp(u, 0.0f, 1.0f); v = std::clamp(v, 0.0f, 1.0f); // 转换为整数索引,这里采用四舍五入保证采样精度 int u_img = static_cast<int>(std::round(u * width)); int v_img = static_cast<int>(std::round((1 - v) * height)); // 双重保险,确保索引严格落在图像有效范围内 u_img = std::clamp(u_img, 0, width - 1); v_img = std::clamp(v_img, 0, height - 1); auto color = image_data.at<cv::Vec3b>(v_img, u_img); return Eigen::Vector3f(color[0], color[1], color[2]); }
内容的提问来源于stack exchange,提问作者ChinGL
相关产品推荐
相关产品推荐

