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

如何通过向上/向下取整将cv::Vec2d转换为cv::Vec2i

问题:OpenCV中cv::Vec2d的向上/向下取整转换需求

直接将cv::Vec2d转换为cv::Vec2i时,OpenCV采用四舍五入方式,无法满足向上取整(如1.3和1.7均转为2)或向下取整(如1.3和1.7均转为1)的需求,且希望无需循环遍历元素完成转换。

原示例代码:

#include <opencv2/core.hpp>
#include <vector>
#include <iostream>
using namespace std;

int main() {
    cv::Vec2d v(1.3, 1.3);
    cout << v[0] << ";" << v[1] << endl;
    cv::Vec2i vi = cv::Vec2i(v);

    cout << vi[0] << ";" << vi[1] << endl; // 输出 "1;1"

    v = cv::Vec2d(1.7,1.7);
    vi = cv::Vec2i(v);
    cout << vi[0] << ";" << vi[1] << endl; // 输出 "2;2"
    return 0;
}
解决方案

1. 向下取整转换

利用OpenCV的cv::floor函数,它支持向量级批量操作,返回浮点型向量后直接转换为cv::Vec2i即可:

#include <opencv2/core.hpp>
#include <iostream>
using namespace std;

int main() {
    cv::Vec2d v(1.3, 1.3);
    cv::Vec2i vi = cv::Vec2i(cv::floor(v));
    cout << vi[0] << ";" << vi[1] << endl; // 输出 "1;1"

    v = cv::Vec2d(1.7, 1.7);
    vi = cv::Vec2i(cv::floor(v));
    cout << vi[0] << ";" << vi[1] << endl; // 输出 "1;1"
    return 0;
}

2. 向上取整转换

使用OpenCV的cv::ceil函数,同样支持向量级操作,转换逻辑与向下取整一致:

#include <opencv2/core.hpp>
#include <iostream>
using namespace std;

int main() {
    cv::Vec2d v(1.3, 1.3);
    cv::Vec2i vi = cv::Vec2i(cv::ceil(v));
    cout << vi[0] << ";" << vi[1] << endl; // 输出 "2;2"

    v = cv::Vec2d(1.7, 1.7);
    vi = cv::Vec2i(cv::ceil(v));
    cout << vi[0] << ";" << vi[1] << endl; // 输出 "2;2"
    return 0;
}

说明

  • cv::floor和cv::ceil均为OpenCV内置的批量操作函数,无需手动遍历元素,内部已做性能优化。
  • 两个函数返回的是浮点型向量(cv::Vec2d),转换为cv::Vec2i时会截断小数部分,结合floor/ceil的处理结果,正好符合向上/向下取整的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:10:49