测试图片:
测试结果:
int main(int argc, char* argv[])
{
IplImage* src , *srcContours ,*srcHErode,*srcVErode ,*srcLast;
IplImage* srcColor;
int x,y;
src = cvLoadImage("1.jpg" , CV_LOAD_IMAGE_GRAYSCALE);
srcColor = cvLoadImage("1.jpg");
srcContours = cvCreateImage(cvGetSize(src),8,1);
srcHErode = cvCreateImage(cvGetSize(src),8,1);
srcVErode = cvCreateImage(cvGetSize(src),8,1);
srcLast = cvCreateImage(cvGetSize(src),8,1);
cvZero(srcContours);
cvZero(srcHErode);
cvZero(srcVErode);
cvZero(srcLast);
k_means(src);
cvThreshold(src,src,100,255,CV_THRESH_BINARY_INV);
getContours(src,srcContours);
getVerticErode(srcContours , srcHErode);
getHoriErode(srcContours , srcVErode);
for( y=0;y<srcContours->height;y++)
{
for( x=0;x<srcContours->width;x++)
{
int valueHErode,valueVErode,valueSrc;
valueHErode = cvGetReal2D(srcHErode,y,x);
valueVErode = cvGetReal2D(srcVErode ,y ,x);
valueSrc = cvGetReal2D(srcContours,y,x);
if(valueVErode<100 && valueHErode<100)
{
cvSetReal2D(srcLast , y,x,valueSrc);
}
}
}
cvDilate(srcLast,src);
cvErode(src,srcLast);
cvCopy(srcLast,srcContours);
getVerticErode(srcContours , srcHErode);
getHoriErode(srcContours , srcVErode);
cvZero(srcLast);
for( y=0;y<srcContours->height;y++)
{
for( x=0;x<srcContours->width;x++)
{
int valueHErode,valueVErode,valueSrc;
valueHErode = cvGetReal2D(srcHErode,y,x);
valueVErode = cvGetReal2D(srcVErode ,y ,x);
valueSrc = cvGetReal2D(srcContours,y,x);
if(valueVErode<100 && valueHErode<100)
{
cvSetReal2D(srcLast , y,x,valueSrc);
}
}
}
cvDilate(srcLast,src);
cvErode(src,srcLast);
CvRect* rectResult = (CvRect*)malloc(sizeof(CvRect)*30);
int rectCount = removeSmallContours(srcLast,rectResult);
for(int i=0;i<rectCount;i++)
{
cvDrawRect(srcColor,cvPoint(rectResult[i].x,rectResult[i].y)
,cvPoint(rectResult[i].x+rectResult[i].width,rectResult[i].y+rectResult[i].height)
,cvScalar(0,0,255));
}
cvNamedWindow("src");
cvShowImage("src",srcColor);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&srcColor);
cvReleaseImage(&srcContours);
cvReleaseImage(&srcHErode);
cvReleaseImage(&srcVErode);
cvReleaseImage(&srcLast);
return 0;
}