Click here to Skip to main content
Rate this: bad
Please Sign up or sign in to vote.
i using this code to make (text) image segmentation
#include <cv.h>
#include <highgui.h>
#include <cvaux.h>
#include <stdio.h>

const char *WIN1="Segmented";  // This will be the window name

IplImage* imagen;
IplImage* imagen_color;
IplImage* smooth;
IplImage* threshold;
IplImage* open_morf;
IplImage* blobResult;
IplImage* img_contornos;
CvMoments moments;
CvHuMoments humoments;
CvSeq* contour;
CvSeq* contourLow;
int main()
	/* Image PATH here */
	char* filename= "C:\\Users\\Mostafa\\Desktop\\Untitled.jpg";
	/* load image  in gray level */
	imagen = cvLoadImage(filename,0); // 0 value here is for gray

	/* to load the image in RGB ||  1 value here is for RGB */
	imagen_color = cvLoadImage(filename,1); // this colored image is the one to be display

	/* Creating the edited images: smooth, threshold and open_morf */
	smooth= cvCreateImage(cvSize(imagen->width, imagen->height), IPL_DEPTH_8U, 1);
	threshold= cvCreateImage(cvSize(imagen->width, imagen->height), IPL_DEPTH_8U, 1);
	open_morf= cvCreateImage(cvSize(imagen->width, imagen->height), IPL_DEPTH_8U, 1);
	//Initializaing the variables for countours
	contour = 0;
	contourLow = 0;
	//Create storage needed for contour detection
	CvMemStorage* storage = cvCreateMemStorage(0);
	//Creating window, WIN1 = "Segmented" the window name we described early in this code :1:
	cvNamedWindow(WIN1); // or cvNamedWindow(WIN1, 0) as u like

	//Smooth image
	cvSmooth(imagen, smooth, CV_GAUSSIAN, 3, 0, 0, 0);
	CvScalar avg;
	CvScalar avgStd;
	cvAvgSdv(smooth, &avg, &avgStd, NULL);
	//threshold image, this is an adaptive threshold
	cvThreshold(smooth, threshold, (int)avg.val[0]-7*(int)(avgStd.val[0]/8), 255, CV_THRESH_TOZERO_INV);
		//CV_THRESH_BINARY_INV);	/*_||_*/

	//Applying Morfologic filters
	cvErode(threshold, open_morf, NULL,1); 
	cvDilate(open_morf, open_morf, NULL,1); 
	//Duplicate image for countour
	img_contornos = cvCloneImage(open_morf);
	//Search countours in preprocesed image
	cvFindContours( img_contornos, storage, &contour, sizeof(CvContour),
	//Optimize contours, reduce points
	contourLow=cvApproxPoly(contour, sizeof(CvContour), storage,CV_POLY_APPROX_DP,1,1);
	//For each contour found
	for( ; contourLow != 0; contourLow = contourLow->h_next )
		CvScalar color = CV_RGB( rand()&200, rand()&200, rand()&200 ); //Generate Random colors which is used to draw the rectangles around the letters

		//We can draw the contour of object
		cvDrawContours( imagen_color, contourLow, color, color, -1, 0, 8, cvPoint(0,0) );
		//Or detect bounding rect of contour	
		CvRect rect;
		CvPoint pt1, pt2;
		rect=cvBoundingRect(contourLow, NULL);
		pt1.x = rect.x;
        pt2.x = (rect.x+rect.width);
        pt1.y = rect.y;
        pt2.y = (rect.y+rect.height);
		cvRectangle(imagen_color, pt1,pt2, color, 1, 8, 0); //the rectangle is drawn on the Colored Image
		/*For calculate objects features we can use hu moments.
		this calculate 7 features that are independent of position, size and orientation*/
		//First calculate object moments
		cvMoments(contourLow, &moments, 0);
		//Now calculate hu moments
		cvGetHuMoments(&moments, &humoments);
	cvShowImage(WIN1, imagen_color);
	//Main Loop
		int c;
		c = cvWaitKey(10);
		if( (char) c == 27 )
		else if((char) c == '3')
			cvShowImage(WIN1, threshold);
		else if((char) c=='1')
			cvShowImage(WIN1, imagen);
		else if((char) c=='2')
			cvShowImage(WIN1, smooth);
		else if((char) c=='4')
			cvShowImage(WIN1, open_morf);
		else if((char) c=='r')
			cvShowImage(WIN1, imagen_color);
	//cvReleaseImage(&imagen_color); // optional :-)

	return 0;
but when i run this code didn't make segmentation to the dark background image
or colored background image
any help in this code
Thanks .
Posted 26-Mar-12 10:19am
nv3 at 26-Mar-12 16:13pm
It is very hard for someone else to analyze your program without any further information. Unfortunately we cannot paste images in this forum, which would make things easier. So my first question would be: Is your image open_morf still correct? If yes, how many contours does cvFindContours return? I would try to draw these contours into the original image, so you can check whether they make sense. If all went ok to this point, we do the next step. How many objects does cvApproxPoly return? If you arrived there, you will probably know what went wrong.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
0 Maciej Los 310
1 OriginalGriff 285
2 Afzaal Ahmad Zeeshan 200
3 Sergey Alexandrovich Kryukov 195
4 BillWoodruff 180
0 OriginalGriff 6,499
1 Sergey Alexandrovich Kryukov 6,048
2 DamithSL 5,193
3 Manas Bhardwaj 4,657
4 Maciej Los 4,120

Advertise | Privacy | Mobile
Web02 | 2.8.1411022.1 | Last Updated 26 Mar 2012
Copyright © CodeProject, 1999-2014
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100