void oldPicture(TImage *image) { int x,y,i; Byte *p, grayLevel; int auxvalue; for(y=0;y<image->Picture->Bitmap->Height; y++) { p = (byte *) image->Picture->Bitmap->ScanLine[y]; for(x=0;x<image->Picture->Bitmap->Width*3-1;x+=3) { //p[x] - Blue value (RGB) //p[x+1] - Green value (RGB) //p[x+2] - Red value (RGB) // Replace every value for the correspondent gray value (R*0.3+G0.59+B*0.3) p[x]=p[x+1]=p[x+2]= p[x]*0.11+p[x+1]*0.59+p[x+2]*0.3; auxvalue=p[x]-50; if(auxvalue<0)p[x]=0; else p[x]=auxvalue; } } stretchHistogram(image); image->Picture->Bitmap->PixelFormat=pf24bit; }
int eyelidDistance(Mat eye, double threshold) { int i; int j; int m = eye.rows; int n = eye.cols; Mat strechedEye = stretchHistogram(&eye); vector<int> summary = sum(&strechedEye, 2); vector<int> eyebrowPeaks; vector<int> eyebrowLocs; findPeaks(&summary, &eyebrowLocs, &eyebrowPeaks); Mat eyeBinary = binarize(&strechedEye, 55); if (!eyebrowLocs.empty()) { if (eyebrowLocs[0] != 1 && eyebrowLocs[0] < round(m / 2.2)) { eyeBinary.rowRange(0, eyebrowLocs[0] - 1) = 1; } } vector<double> mBinary = meanValue(&eyeBinary, 2); vector<double> sigmaBinary(m); for (i = 0; i < m; i++) { double tmpSum = 0; for (j = 0; j < n; j++) { tmpSum += (eyeBinary.at<uchar>(i, j) - mBinary[i])*(eyeBinary.at<uchar>(i, j) - mBinary[i]); } sigmaBinary[i] = tmpSum / n; } vector<double> difVarBinary = diff(&sigmaBinary); vector<double> pksBinaryPositive; vector<int> locsBinaryPositive; vector<double> pksBinaryNegative; vector<int> locsBinaryNegative; findPeaks(&difVarBinary, &locsBinaryPositive, &pksBinaryPositive); findPeaks(&(negateVector(difVarBinary)), &locsBinaryNegative, &pksBinaryNegative); vector<double> pksBinary = pksBinaryPositive; vector<double> negatedPeaks = negateVector(pksBinaryNegative); pksBinary.insert(pksBinary.end(), negatedPeaks.begin(), negatedPeaks.end()); vector<int> locsBinary = locsBinaryPositive; locsBinary.insert(locsBinary.end(), locsBinaryNegative.begin(), locsBinaryNegative.end()); int loc1, loc2; getDistance(pksBinary, locsBinary, &loc1, &loc2); int distance = abs(loc2 - loc1); double percent = 0; if (distance < threshold) { return 0; } else { if (loc1 != 0 || loc2 != 0) { if (loc1 < loc2) { Mat extract = eyeBinary.rowRange(loc1, loc2); vector<int> sumH = sum(&invert(&extract), 2); int boundariesH1; int boundariesH2; int boundariesV1; int boundariesV2; getBigInterval(sumH, &boundariesH1, &boundariesH2, 0.85); vector<int> sumV = sum(&invert(&extract), 1); getBigInterval(sumV, &boundariesV1, &boundariesV2, 0.65); Mat cut = extract(Range(boundariesH1, boundariesH2), Range(boundariesV1, boundariesV2)); percent = 100 * (sum(cut))[0] / (double)(cut.rows * cut.cols); } } if (percent > 25) { return 0; } else { return distance; } } }