gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:52:58 26 4
gpt4 key购买 nike

我是根据教程 here 写的但我无法获得图像的凸包(我使用的是教程中显示的类似手部图像)。我得到源和边缘输出正常,但应该绘制轮廓和凸包线的“绘图”输出不显示任何绘制的内容,而是完全黑色。关于为什么会这样有什么想法吗?

#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;
}

最佳答案

您必须进行以下更改:

  1. cvFindContours 函数中将参数从 CV_RETR_LIST 更改为 CV_RETR_EXTERNAL
  2. cvThreshold 中将 CV_THRESH_BINARY 更改为 CV_THRESH_OTSU

这是证明(输入/输出):

enter image description here enter image description here

关于c++ - 在opencv中查找对象的凸包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11813352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com