相关的算法以及理论:图像处理、计算机视觉、机器学习等
版主: bebekifis, chai2010, lswang
4 篇帖子 • 分页:
1 /
1
关于二值化之后圈出白色区域的算法
如图, 请问如果我想用圆圈圈出这些白色大于50*50的区域,在算法上怎么实现?(PS*之前发错版块了
)
想出了几个方法,但是由于边缘的不规则,那几个方法都不太适合,由于着急交作业所以请教哪位大侠给点提示,谢谢各位好心人!
做了个CONTOUR, 然后把较小面积的轮廓滤掉只留大的。但是怎么能用画图工具把剩下的圈出来呢?
想出了几个方法,但是由于边缘的不规则,那几个方法都不太适合,由于着急交作业所以请教哪位大侠给点提示,谢谢各位好心人!
做了个CONTOUR, 然后把较小面积的轮廓滤掉只留大的。但是怎么能用画图工具把剩下的圈出来呢?
- niuniu236
- OpenCV小学生
- 帖子: 16
- 注册: 2009-11-29 12:10
Re: 关于二值化之后圈出白色区域的算法
可以参考下面的代码。
CvSeq* contour=NULL;
cvClearMemStorage( storage );
cvFindContours( mask, storage, &contour, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE );
cvZero(mask);
CvScalar color = CV_RGB( 255,255,255 ); // Color for contour drawing
double contArea;
double imgArea = mask->width * mask->height;
// contour now contains a CvSequence of all of the contours
for( ; contour != 0; contour = contour->h_next )
{
contArea = fabs(cvContourArea( contour, CV_WHOLE_SEQ ));
if (contArea >= 40) {
cvDrawContours( mask, contour, color, color, 0, -1, 8 );
cvSmooth(mask, mask);
CvRect rect = cvBoundingRect( contour, 0 );
cvRectangle( mask, cvPoint(rect.x, rect.y + rect.height), cvPoint(rect.x + rect.width, rect.y), CV_RGB(200, 0, 200), 1, 8, 0 );
cvRectangle( mask, cvPoint(rect.x, rect.y + rect.height), cvPoint(rect.x + rect.width, rect.y), CV_RGB(200, 0, 200), 1, 8, 0 );
}
}
CvSeq* contour=NULL;
cvClearMemStorage( storage );
cvFindContours( mask, storage, &contour, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE );
cvZero(mask);
CvScalar color = CV_RGB( 255,255,255 ); // Color for contour drawing
double contArea;
double imgArea = mask->width * mask->height;
// contour now contains a CvSequence of all of the contours
for( ; contour != 0; contour = contour->h_next )
{
contArea = fabs(cvContourArea( contour, CV_WHOLE_SEQ ));
if (contArea >= 40) {
cvDrawContours( mask, contour, color, color, 0, -1, 8 );
cvSmooth(mask, mask);
CvRect rect = cvBoundingRect( contour, 0 );
cvRectangle( mask, cvPoint(rect.x, rect.y + rect.height), cvPoint(rect.x + rect.width, rect.y), CV_RGB(200, 0, 200), 1, 8, 0 );
cvRectangle( mask, cvPoint(rect.x, rect.y + rect.height), cvPoint(rect.x + rect.width, rect.y), CV_RGB(200, 0, 200), 1, 8, 0 );
}
}