将OpenCV凸包求解的Java方法改写为C++代码
OpenCV Java凸包代码转C++版本
我来帮你把这段求解凸包的OpenCV Java代码转换成C++版本,同时拆解下两者的差异,帮你理清OpenCV在不同语言里的用法~
转换后的C++代码
#include <opencv2/opencv.hpp> using namespace cv; vector<Point> convexHull(const vector<Point>& contour) { // 存储凸包点的索引 vector<int> indexes; // 调用OpenCV凸包函数,获取索引 cv::convexHull(contour, indexes); // 根据索引提取凸包点 vector<Point> convexPoints; for (int i = 0; i < indexes.size(); ++i) { int index = indexes[i]; // 直接从原轮廓中取出对应点,C++的Point有x、y成员直接访问 convexPoints.push_back(contour[index]); } return convexPoints; }
关键差异说明
- 类型映射:
- Java的
MatOfPoint对应C的vector<Point>(这是OpenCV C中存储轮廓的常用方式,比Mat更直观) - Java的
MatOfInt对应C++的vector<int>
- Java的
- 函数调用:Java用
Imgproc.convexHull,C++直接用cv::convexHull(如果加了using namespace cv;可以省略cv::前缀) - 元素访问:
- Java中需要用
get(i,0)[0]来获取MatOfInt里的索引值,而C++的vector直接用下标indexes[i]就能访问 - Java中获取轮廓点的坐标需要
contour.get(index,0)[0],C++的Point结构体直接通过.x和.y成员访问,或者直接把contour[index]整个Point对象取出来
- Java中需要用
- 返回值:Java返回
MatOfPoint,C++返回vector<Point>,如果需要转成Mat类型,直接用Mat(convexPoints)即可
如果你的场景需要返回Mat类型的凸包,也可以用这个版本:
Mat convexHullMat(const vector<Point>& contour) { vector<int> indexes; cv::convexHull(contour, indexes); vector<Point> convexPoints; for (int idx : indexes) { convexPoints.push_back(contour[idx]); } return Mat(convexPoints); }
内容的提问来源于stack exchange,提问作者wxrw
相关产品推荐
相关产品推荐

