コード例 #1
0
ファイル: ipFunctions.cpp プロジェクト: SkylineNando/Delphi
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;
}
コード例 #2
0
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;
		}
	}
}