Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在opencv中查找对象的凸包?_C++_C_Opencv_Convex Hull - Fatal编程技术网

C++ 在opencv中查找对象的凸包?

C++ 在opencv中查找对象的凸包?,c++,c,opencv,convex-hull,C++,C,Opencv,Convex Hull,我是根据教程编写的,但我无法获得图像的凸包(我使用的是类似于教程中所示的手部图像)。我得到的源和边缘输出很好,但“图纸”输出应该绘制轮廓和凸面外壳线,没有显示任何绘制的内容,而是完全黑色。你知道为什么会这样吗 #include <opencv/cv.h> #include <opencv/highgui.h> #include <opencv/cxcore.h> int main(int argc,char **argv) { cvNamedWind

我是根据教程编写的,但我无法获得图像的凸包(我使用的是类似于教程中所示的手部图像)。我得到的源和边缘输出很好,但“图纸”输出应该绘制轮廓和凸面外壳线,没有显示任何绘制的内容,而是完全黑色。你知道为什么会这样吗

#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;
}
#包括
#包括
#包括
int main(int argc,字符**argv)
{
cvNamedWindow(“来源”,1);
cvNamedWindow(“边缘窗口”,1);
CVD(图纸),1);
IplImage*src=cvLoadImage(“img.jpg”,0);
IplImage*edges=cvCreateImage(cvGetSize(src),8,1);
//寻找边缘
cvThreshold(src,edges,150,255,CV_THRESH_二进制);
CvMemStorage*storage=cvCreateMemStorage();
CvSeq*第一个轮廓=空;
int Nc=cvFindContours(
边缘,
存储
&第一个等高线,
sizeof(CvContour),
履历表);
//寻找凸壳
CvMemStorage*hull_storage=cvCreateMemStorage();
CvSeq*retHulls=NULL;
对于(CvSeq*i=第一个\u轮廓;i!=0;i=i->h\u下一个){
//注:h_next是下一个序列。
retHulls=CVCONVERXHULL2(第一个船体轮廓,船体存储,顺时针,1);
}
//绘制轮廓和船体
IplImage*draw=cvCreateImage(cvGetSize(边),8,3);
对于(CvSeq*i=第一个\u轮廓;i!=0;i=i->h\u下一个){
cvDrawContours(draw,first_Contours,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(“源”,src);
cvShowImage(“边缘窗口”,边缘);
cvShowImage(“图纸”,图纸);
cvWaitKey();
cvallwindows();
cvReleaseImage(&src);
cvReleaseImage(图像和边缘);
cvReleaseImage(绘制和绘制);
返回0;
}
有两种方法

  • opencv凸包
  • cvblob凸壳
  • CvContourPolygon*cvPolygonContourConvexHull(CvContourPolygon常量*p)


    HTH

    您必须执行以下更改:

  • cvFindContours
    函数中将参数从
    CV\u RETR\u列表
    更改为
    CV\u RETR\u外部
  • cvThreshold
    中的
    CV\u THRESH\u BINARY
    更改为
    CV\u THRESH\u OTSU
  • 以下是证据(输入/输出):


    您好,嗯,更改它对我的代码没有影响?您是用我的代码还是自己的代码来尝试的感谢那些为uve提供的图像工作的人,但它对这样的东西不起作用?你知道为什么吗?