【问题标题】:A C++ convexityDefects wrapper (OpenCV)?C++ 凸缺陷包装器(OpenCV)?
【发布时间】:2012-01-05 04:40:13
【问题描述】:

我正在尝试为 OpenCV 创建一个 C++ 包装器,但遗憾的是无法使其工作。我一次又一次地收到相同的错误:“OpenCV 错误:错误参数(凸包既不是序列也不是矩阵)”。我真的不明白为什么。

代码如下:

   void convexityDefects (vector <vector<Point> > contour, vector <vector<int> > convexHullPoints, vector <vector<Point> > *convexHullDefects)
   {
        CvSeq *contourSeq;
        CvSeq *convexHullDefectsSeq;
        CvSeq *convexHullSeq;

        CvMemStorage *contourSeqStorage = cvCreateMemStorage (0);
        CvMemStorage *convexHullSeqStorage = cvCreateMemStorage (0);
        CvMemStorage *convexHullDefectsSeqStorage = cvCreateMemStorage (0);
        CvMemStorage *cvConvexityDefectsStorage = cvCreateMemStorage (0);

        contourSeq = cvCreateSeq (CV_SEQ_KIND_GENERIC | CV_32SC2, sizeof (CvSeq), sizeof (CvPoint), contourSeqStorage);
        convexHullDefectsSeq = cvCreateSeq (CV_SEQ_KIND_GENERIC, sizeof (CvSeq), sizeof (CvPoint), convexHullDefectsSeqStorage);
        convexHullSeq = cvCreateSeq (CV_SEQ_KIND_GENERIC, sizeof (CvSeq), sizeof (int), convexHullSeqStorage);

        for (int counter = 0; counter < contour.at (0).size (); counter ++)
        {
             CvPoint element = {contour.at (0).at (counter).x,  contour.at (0).at (counter).y};
             cvSeqPush (contourSeq, &element); 
        }

        int hullArray [convexHullPoints.at (0).size ()];

        for (int counter = 0; counter < convexHullPoints.size (); counter ++)
        {
             hullArray [counter] = convexHullPoints.at (0).at (counter);
        }

        for (int counter = 0; counter < convexHullPoints.size (); counter ++)
        {
             cvSeqPush (convexHullSeq, &(hullArray [counter]));
        }

        convexHullDefectsSeq = cvConvexityDefects (contourSeq, &convexHullSeq, cvConvexityDefectsStorage);

        CvConvexityDefect convexHullDefectsArray [convexHullDefectsSeq -> total];

        cvCvtSeqToArray (convexHullDefectsSeq, &convexHullDefectsArray, CV_WHOLE_SEQ);

        for (int counter = 0; counter < convexHullDefectsSeq -> total; counter ++)
        {
             CvPoint start = {convexHullDefectsArray [counter].start -> x, convexHullDefectsArray [counter].start -> y};
             CvPoint depthPoint = {convexHullDefectsArray [counter].depth_point -> x, convexHullDefectsArray [counter].depth_point -> y};
             CvPoint end = {convexHullDefectsArray [counter].end -> x, convexHullDefectsArray [counter].end -> y};

             vector <Point> convexityDefectVector;
             convexityDefectVector.push_back (start);
             convexityDefectVector.push_back (depthPoint);
             convexityDefectVector.push_back (end);

             convexHullDefects -> push_back (convexityDefectVector);
        }

        cvReleaseMemStorage (&contourSeqStorage);
        cvReleaseMemStorage (&convexHullSeqStorage);
        cvReleaseMemStorage (&convexHullDefectsSeqStorage);
        cvReleaseMemStorage (&cvConvexityDefectsStorage);
  }

【问题讨论】:

标签: c++ image opencv vector


【解决方案1】:

您应该查看this SO 上的其他帖子。看来他已经解决了这个问题。

【讨论】:

  • 谢谢。我已经查看了帖子,但我不能使用他的包装器,因为他在他的程序中使用 CvMat 而不是 CvSeq 来表示凸包。我不能使用 CvMat 有几个我无法提及的原因。不过,您真的发现我的代码有什么问题吗?
猜你喜欢
  • 2011-10-12
  • 2013-02-20
  • 2012-10-10
  • 1970-01-01
  • 2012-06-13
  • 2013-09-03
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多