Поиск выпуклой оболочки объекта в opencv?

Я написал это на основе учебника здесь, но Я не могу получить выпуклую оболочку изображения (я использую похожее изображение руки, как показано в уроке). Я получаю вывод источника и краев в порядке, но вывод «Рисунков», который должен рисовать контур и выпуклые линии корпуса, не показывает ничего нарисованного и вместо этого полностью черный. Любые идеи относительно того, почему это может быть?

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv/cxcore.h>

int main(int argc,char **argv)
{
    cvNamedWindow( "Source", 1 );
    cvNamedWindow( "edges window", 1 );
    cvNamedWindow( "Drawings", 1 );

    IplImage* src = cvLoadImage( "img.jpg", 0 );
    IplImage* edges = cvCreateImage( cvGetSize(src), 8, 1 );

    // Finding edges
    cvThreshold( src, edges, 150, 255, CV_THRESH_BINARY );

    CvMemStorage* storage = cvCreateMemStorage();
    CvSeq* first_contour = NULL;

    int Nc = cvFindContours(
        edges,
        storage,
        &first_contour,
        sizeof(CvContour),
        CV_RETR_LIST );

    // Finding convex Hull
    CvMemStorage* hull_storage = cvCreateMemStorage();
    CvSeq* retHulls = NULL;

    for(CvSeq* i = first_contour; i != 0; i = i->h_next){
    // note h_next is next sequence.
    retHulls = cvConvexHull2(first_contour,hull_storage,CV_CLOCKWISE,1);

    }

    // drawing contours and hull
    IplImage* draw = cvCreateImage(cvGetSize(edges), 8, 3 );

    for(CvSeq* i = first_contour; i != 0; i = i->h_next){
        cvDrawContours(draw,first_contour,cvScalar(255,0,0,0),cvScalar(255,0,0,0),0,1,8);
        cvDrawContours(draw,retHulls,cvScalar(255,0,0,0),cvScalar(255,0,0,0),0,1,8);

    }

    cvShowImage( "Source", src );
    cvShowImage( "edges window", edges );
    cvShowImage( "Drawings", draw );
    cvWaitKey();

    cvDestroyAllWindows();

    cvReleaseImage( &src );
    cvReleaseImage( &edges );
    cvReleaseImage( &draw );

    return 0;
}

person silent    schedule 05.08.2012    source источник


Ответы (2)


Вы должны сделать следующие изменения:

  1. Измените параметр с CV_RETR_LIST на CV_RETR_EXTERNAL в функции cvFindContours.
  2. Измените CV_THRESH_BINARY на CV_THRESH_OTSU в cvThreshold.

Вот доказательство (ввод/вывод):

введите здесь описание изображениявведите здесь описание изображения

person ArtemStorozhuk    schedule 05.08.2012
comment
Привет, хм, изменение не повлияло на мой код? Вы пробовали это с моим кодом или со своим? - Спасибо - person silent; 06.08.2012
comment
ура, это сработало для изображения, которое вы предоставили, но оно не работает для чего-то вроде этого? i.imgur.com/1nYN7.jpg есть идеи, почему? - person silent; 08.08.2012

есть 2 метода,

  1. выпуклая оболочка opencv

http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/hull/hull.html

http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ShapeDescriptors/hull_demo.cpp

  1. cvblob выпуклая оболочка

https://code.google.com/p/cvblob/

https://code.google.com/p/cvblob/source/browse/trunk/cvBlob/cvblob.h?r=398

CvContourPolygon *cvPolygonContourConvexHull(CvContourPolygon const *p);

ХТН

person plan9assembler    schedule 05.08.2012