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

将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用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返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:02:16