opencv拟合椭圆出现一个意外的多余的圆形

轮回xc 2015-07-27 11:02:04

我用的就是最普通网上随处可见的拟合程序,但是最外面那个大圆是怎么回事,他和轮廓没有关系,而且无论我怎么改阈值他都存在,int main( int argc, char** argv )
{
const char* filename = argc == 2 ? argv[1] : (char*)"rice.png";

// 读入图像,强制为灰度图像
if( (image03 = cvLoadImage(filename, 0)) == 0 )
return -1;

// Create the destination images
image02 = cvCloneImage( image03 );
image04 = cvCloneImage( image03 );

// Create windows.
cvNamedWindow("Source", 1);
cvNamedWindow("Result", 1);

// Show the image.
cvShowImage("Source", image03);

// Create toolbars. HighGUI use.
cvCreateTrackbar( "Threshold", "Result", &slider_pos, 255, process_image );

process_image(0);
cvSaveImage("D:\\saveImage.jpg",image04);
// Wait for a key stroke; the same function arranges events processing
cvWaitKey(0);
cvReleaseImage(&image02);
cvReleaseImage(&image03);

cvDestroyWindow("Source");
cvDestroyWindow("Result");

return 0;
}

// Define trackbar callback functon. This function find contours,
// draw it and approximate it by ellipses.
void process_image(int h)
{
CvMemStorage* stor;
CvSeq* cont;
CvBox2D32f* box;
CvPoint* PointArray;
CvPoint2D32f* PointArray2D32f;

// 创建动态结构序列
stor = cvCreateMemStorage(0);
cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint) , stor);

// 二值话图像.
cvThreshold( image03, image02, slider_pos, 255, CV_THRESH_BINARY );

// 寻找所有轮廓.
cvFindContours( image02, stor, &cont, sizeof(CvContour),
CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0,0));

// Clear images. IPL use.
cvZero(image02);
cvZero(image04);

// 本循环绘制所有轮廓并用椭圆拟合.
for(;cont;cont = cont->h_next)
{
int i; // Indicator of cycle.
int count = cont->total; // This is number point in contour
CvPoint center;
CvSize size;

// Number point must be more than or equal to 6 (for cvFitEllipse_32f).
if( count < 6 )
continue;

// Alloc memory for contour point set.
PointArray = (CvPoint*)malloc( count*sizeof(CvPoint) );
PointArray2D32f= (CvPoint2D32f*)malloc( count*sizeof(CvPoint2D32f) );

// Alloc memory for ellipse data.
box = (CvBox2D32f*)malloc(sizeof(CvBox2D32f));

// Get contour point set.
cvCvtSeqToArray(cont, PointArray, CV_WHOLE_SEQ);

// Convert CvPoint set to CvBox2D32f set.
for(i=0; i<count; i++)
{
PointArray2D32f[i].x = (float)PointArray[i].x;
PointArray2D32f[i].y = (float)PointArray[i].y;
}

//拟合当前轮廓.
cvFitEllipse(PointArray2D32f, count, box);

// 绘制当前轮廓.
cvDrawContours(image04,cont,CV_RGB(255,255,255),
CV_RGB(255,255,255),0,1,8,cvPoint(0,0));

// Convert ellipse data from float to integer representation.
center.x = cvRound(box->center.x);
center.y = cvRound(box->center.y);
size.width = cvRound(box->size.width*0.5);
size.height = cvRound(box->size.height*0.5);
box->angle = -box->angle;

// Draw ellipse.
cvEllipse(image04, center, size,
box->angle, 0, 360,
CV_RGB(0,0,255), 1, CV_AA, 0);

// Free memory.
free(PointArray);
free(PointArray2D32f);
free(box);
}

// Show image. HighGUI use.
cvShowImage( "Result", image04 );
}
...全文
1237 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
serf 2017-09-29
  • 打赏
  • 举报
回复
图片边框的点被识别成轮廓了。要把那个轮廓滤除掉。
三百杯 2015-08-07
  • 打赏
  • 举报
回复
同问?知道为啥吗

4,446

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧