IplImage *process(IplImage **_img) { fprintf(stderr, "Processing image:\n"); IplImage *img = *_img; /* Convert to HSV */ print_time("Converting to HSV"); CvSize size = cvGetSize(img); IplImage *hsv = cvCreateImage(size, IPL_DEPTH_8U, 3); cvCvtColor(img, hsv, CV_BGR2HSV); /* Generate mask */ CvMat *mask = cvCreateMat(size.height, size.width, CV_8UC1); //cvInRangeS(hsv, cvScalar(0.11*256, 0.60*256, 0.20*256, 0),cvScalar(0.14*256, 1.00*256, 1.00*256, 0), mask); cvInRangeS(hsv, cvScalar(0,0.6*256,0.6*256,0),cvScalar(0.21*256,256,256,0), mask); cvReleaseImage(&hsv); /* Perform morphological ops */ print_time("Performing morphologies"); IplConvKernel *se21 = cvCreateStructuringElementEx(21, 21, 10, 10, CV_SHAPE_RECT, NULL); IplConvKernel *se11 = cvCreateStructuringElementEx(11, 11, 5, 5, CV_SHAPE_RECT, NULL); cvClose(mask, mask, se21); cvOpen(mask, mask, se11); cvReleaseStructuringElement(&se21); cvReleaseStructuringElement(&se11); /* Hough transform */ IplImage *hough_in = cvCreateImage(size, 8, 1); cvCopy(mask, hough_in, NULL); int rows=size.height; int cols=size.width; int j,k; int breakflag=0; for(j=0;j<rows;j++) { for(k=0;k<cols;k++) { CvScalar val=cvGet2D(hough_in,j,k); if(val.val[0]==255) { sprintf(dat,"%d-%d:",k,j); int rc = serialport_write(fd, dat); if(rc==-1) return 0; fprintf(fp,"%d %d\n",k,j); breakflag=1; break; } } if(breakflag) break; } return hough_in; }
int filterByHSV(IplImage *src, CvScalar minHSV, CvScalar maxHSV, IplImage *dst) { IplImage *tmp3d = cvCloneImage(src); cvSmooth(tmp3d, tmp3d, CV_GAUSSIAN, 13, 0, 0, 0); cvCvtColor(tmp3d, tmp3d, CV_BGR2HSV); IplImage *tmp1dH_mask = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1); IplImage *tmp1dS_mask = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1); IplImage *tmp1dV_mask = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1); cvSplit(tmp3d, tmp1dH_mask, tmp1dS_mask, tmp1dV_mask, NULL); //printf("\rmin: %03d,%03d,%03d", (int)minHSV.val[0], (int)minHSV.val[1], (int)minHSV.val[2]); //printf("\tmax: %03d,%03d,%03d", (int)maxHSV.val[0], (int)maxHSV.val[1], (int)maxHSV.val[2]); if (minHSV.val[0] < maxHSV.val[0]) { cvInRangeS(tmp1dH_mask, cvScalar(minHSV.val[0], 0, 0), cvScalar(maxHSV.val[0], 0, 0), tmp1dH_mask); } else { IplImage *tmp1d = cvCloneImage(tmp1dH_mask); cvInRangeS(tmp1dH_mask, cvScalar(0, 0, 0), cvScalar(maxHSV.val[0], 0, 0), tmp1d); cvInRangeS(tmp1dH_mask, cvScalar(minHSV.val[0], 0, 0), cvScalar(255, 0, 0), tmp1dH_mask); cvOr(tmp1d, tmp1dH_mask, tmp1dH_mask, NULL); cvReleaseImage(&tmp1d); } cvInRangeS(tmp1dS_mask, cvScalar(minHSV.val[1], 0, 0), cvScalar(maxHSV.val[1], 0, 0), tmp1dS_mask); cvInRangeS(tmp1dV_mask, cvScalar(minHSV.val[2], 0, 0), cvScalar(maxHSV.val[2], 0, 0), tmp1dV_mask); IplImage *tmp1d_mask = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1); cvSet(tmp1d_mask, cvScalarAll(255), NULL); cvAnd(tmp1d_mask, tmp1dH_mask, tmp1d_mask, NULL); cvAnd(tmp1d_mask, tmp1dS_mask, tmp1d_mask, NULL); cvAnd(tmp1d_mask, tmp1dV_mask, tmp1d_mask, NULL); cvReleaseImage(&tmp1dH_mask); cvReleaseImage(&tmp1dS_mask); cvReleaseImage(&tmp1dV_mask); cvClose(tmp1d_mask, tmp1d_mask, NULL, 2); #define CONTROLS_WIDTHA 640/2 #define CONTROLS_HEIGHTA 480/2 #if 1 cvNamedWindow(CONTROL_WINDOW "4", 0); cvResizeWindow(CONTROL_WINDOW "4", CONTROLS_WIDTHA, CONTROLS_HEIGHTA); cvShowImage(CONTROL_WINDOW "4", tmp1d_mask); #endif cvCopy2(src, dst, tmp1d_mask); cvReleaseImage(&tmp1d_mask); return 0; }