凸性缺陷 C++ OpenCv

如果你能帮我解决这个问题,我将不胜感激:)

关于这个问题OpenCV 2.X/C++中的cvConvexityDefects?,我有同样的问题.OpenCV的C++包装器没有C版本出现的函数cvConvexityDefects,所以我试着写了自己的版本.

部分代码是(请注意countour和hull都是vector,分别计算:

Part of the code is (please note that both countour and hull are vector< Point >,calculated separately :

CvSeq* contourPoints;
CvSeq* hullPoints;
CvSeq* defects;
CvMemStorage* storage;
CvMemStorage* strDefects;
CvMemStorage* contourStr;
CvMemStorage* hullStr;
CvConvexityDefect *defectArray = 0;

strDefects = cvCreateMemStorage();
defects = cvCreateSeq( CV_SEQ_KIND_GENERIC|CV_32SC2,sizeof(CvSeq),sizeof(CvPoint),strDefects );

//We start converting vector<Point> resulting from findContours
contourStr = cvCreateMemStorage();
contourPoints = cvCreateSeq(CV_SEQ_KIND_GENERIC|CV_32SC2,contourStr);
printf("Metiendo valores
");
for(int i=0; i<(int)contour.size(); i++) {
    CvPoint cp = {contour[i].x,contour[i].y};
    cvSeqPush(contourPoints,&cp);
}
//Now,the hull points obtained from convexHull c++
hullStr = cvCreateMemStorage(0);
hullPoints = cvCreateSeq(CV_SEQ_KIND_GENERIC|CV_32SC2,hullStr);
for(int i=0; i<(int)hull.size(); i++) {
    CvPoint cp = {hull[i].x,hull[i].y};
    cvSeqPush(hullPoints,&cp);
}

//And we compute convexity defects
storage = cvCreateMemStorage(0);
defects = cvConvexityDefects(contourPoints,hullPoints,storage);

输出是凸包必须表示为函数cvConvexityDefects中的索引序列或指针序列.我真的不知道如何以正确的方式进行转换,我一直在网上搜索并尝试改编/复制/理解一些代码,但它总是使用 C 语法.

我希望我说的很清楚.提前谢谢你!

ooxiaoping 回答:凸性缺陷 C++ OpenCv

我提出这个问题是因为我没有想出解决方案(不仅仅是今天我在处理这件事呵呵),但是之后我所能解决的问题!

我不得不改变计算凸包的方式,使用索引数组形式.所以现在我们有一个向量 而是一个向量<点 >.

I had to change the way I calculated the convex hull, using the index array form. So now we have a vector< int > instead a vector< Point >.

这是我使用的代码(我在图像上绘制了点):

void HandDetection::findConvexityDefects(vector<Point>& contour, vector<int>& hull, vector<Point>& convexDefects){
    if(hull.size() > 0 && contour.size() > 0){
    CvSeq* contourPoints;
    CvSeq* defects;
    CvMemStorage* storage;
    CvMemStorage* strDefects;
    CvMemStorage* contourStr;
    CvConvexityDefect *defectArray = 0;

    strDefects = cvCreateMemStorage();
    defects = cvCreateSeq( CV_SEQ_KIND_GENERIC|CV_32SC2, sizeof(CvSeq),sizeof(CvPoint), strDefects );

    //We transform our vector<Point> into a CvSeq* object of CvPoint.
    contourStr = cvCreateMemStorage();
    contourPoints = cvCreateSeq(CV_SEQ_KIND_GENERIC|CV_32SC2, sizeof(CvSeq), sizeof(CvPoint), contourStr);
    for(int i=0; i<(int)contour.size(); i++) {
        CvPoint cp = {contour[i].x,  contour[i].y};
        cvSeqPush(contourPoints, &cp);
    }

    //Now, we do the same thing with the hull index
    int count = (int)hull.size();
    //int hullK[count];
    int* hullK = (int*)malloc(count*sizeof(int));
    for(int i=0; i<count; i++){hullK[i] = hull.at(i);}
    CvMat hullMat = cvMat(1, count, CV_32SC1, hullK);

    //We calculate convexity defects
    storage = cvCreateMemStorage(0);
    defects = cvConvexityDefects(contourPoints, &hullMat, storage);
    defectArray = (CvConvexityDefect*)malloc(sizeof(CvConvexityDefect)*defects->total);
    cvCvtSeqToArray(defects, defectArray, CV_WHOLE_SEQ);
    //printf("DefectArray %i %i
",defectArray->end->x, defectArray->end->y);

    //We store defects points in the convexDefects parameter.
    for(int i = 0; i<defects->total; i++){
        CvPoint ptf;
        ptf.x = defectArray[i].depth_point->x;
        ptf.y = defectArray[i].depth_point->y;
        convexDefects.push_back(ptf);
    }

    //We release memory
    cvReleaseMemStorage(contourStr);
    cvReleaseMemStorage(strDefects);
    cvReleaseMemStorage(storage);
    }
}

这对我有用.如果您发现问题或其他管理方法,请告诉我!

这篇关于凸性缺陷 C++ OpenCv的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持前端之家!

本文链接:https://www.f2er.com/3187852.html

大家都在问