如何通过向上/向下取整将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
相关产品推荐
相关产品推荐

