一个c++凹凸缺陷包装器(OpenCV)

A C++ convexityDefects wrapper (OpenCV)?

本文关键字:OpenCV 包装 c++ 凹凸 缺陷 一个      更新时间:2023-10-16

我试图为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);
  }

你应该看看另一篇关于SO的文章。看来他已经解决了这个问题。