package biomav;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
{
int[] image;
byte[] imageBytes;
boolean usingByteImage;
int width = 320;
int height = 240;
int[] orangePixelCountColumns;
double RG = 2;
double RB = 3.9;
double GB = 1.95;
double allowedDelta = 0.2;
double cameraAngle = 93;
double poleWidth = 0.15;
int minimalOrangePixelsForPoleColumn = 15;
double[] angleDistancePole = new double[2];
{
readImage("side1.png");
detectOrangePixels();
System.out.println("pole angle in radions from function: " + getPositionPole());
}
{
angleDistancePole = new double[2];
setImage(image);
detectOrangePixels();
return angleDistancePole;
}
{
double nColumns = 0;
int[] columnNumbers = new int[100];
double meanColumn;
boolean leftOfMiddle;
double percentagePoleInView = 0;
double viewWidthAtPole = 0;
double viewDistanceAtPole = 0;
double poleDistance = 0;
double poleAngle = 0;
double pixelsFromCenter = 0;
double distanceFromCenter = 0;
for(int i=0;i<orangePixelCountColumns.length; i++)
{
if(orangePixelCountColumns[i] > minimalOrangePixelsForPoleColumn)
{
columnNumbers[(int) nColumns] = i;
nColumns++;
}
}
meanColumn = 0;
for(int i=0;i<nColumns;i++)
{
meanColumn += columnNumbers[i];
}
meanColumn /= nColumns;
leftOfMiddle = meanColumn <= (double) (width/2);
if(Math.abs(meanColumn - (double) width/2) < nColumns/2 )
{
System.out.println("pole in middle");
percentagePoleInView = nColumns / (double) (width);
System.out.println("perc pole in view: " + percentagePoleInView);
viewWidthAtPole = poleWidth / percentagePoleInView;
System.out.println("view width at pole: " + viewWidthAtPole);
viewDistanceAtPole = (viewWidthAtPole/2.0) / Math.tan(Math.toRadians(cameraAngle/2.0));
pixelsFromCenter = Math.abs(((double) width/2) - meanColumn);
distanceFromCenter = pixelsFromCenter * (viewWidthAtPole / ((double) width));
poleDistance = Math.sqrt(Math.pow(viewDistanceAtPole, 2) + Math.pow(distanceFromCenter, 2));
poleAngle = Math.atan(distanceFromCenter/viewDistanceAtPole);
}
else
{
System.out.println("pole along sides");
percentagePoleInView = nColumns / (double) (width / 2);
viewWidthAtPole = poleWidth / percentagePoleInView;
viewDistanceAtPole = viewWidthAtPole / Math.tan(Math.toRadians(cameraAngle / 2.0));
pixelsFromCenter = Math.abs(((double) width/2) - meanColumn);
distanceFromCenter = pixelsFromCenter * (viewWidthAtPole / ((double) width / 2.0));
poleDistance = Math.sqrt(Math.pow(viewDistanceAtPole, 2) + Math.pow(distanceFromCenter, 2));
poleAngle = Math.atan(distanceFromCenter/viewDistanceAtPole);
}
System.out.println("view distance at pole: " + viewDistanceAtPole);
System.out.println("pole distance: " + poleDistance);
System.out.println("pole angle in degrees: " + Math.toDegrees(poleAngle));
angleDistancePole[0] = poleAngle;
angleDistancePole[1] = poleAngle;
if(leftOfMiddle)
{
return -poleAngle;
}
else
{
return poleAngle;
}
}
{
orangePixelCountColumns = new int[width];
for(int i=0; i<width; i++)
{
for(int j=0; j<height; j++)
{
if(isOrange(i, j))
{
orangePixelCountColumns[i]++;
}
}
}
}
{
double r, g, b;
if(usingByteImage)
{
r = imageBytes[(j*width + 1) * 3];
g = imageBytes[(j*width + 1) * 3 + 1];
b = imageBytes[(j*width + 1) * 3 + 2];
}
else
{
int pixel = image[j*width + i];
r = ((pixel & 0x00ff0000) >> 16);
g = ((pixel & 0x0000ff00) >> 8);
b = pixel & 0x000000ff;
}
if(g == 0)
{
g = 0.01;
}
if(b == 0)
{
b = 0.01;
}
double rg, rb, gb;
rg = r/g;
rb = r/b;
gb = g/b;
if((Math.abs(rg - RG) < allowedDelta) && (Math.abs(rb - RB) < allowedDelta) && (Math.abs(gb - GB) < allowedDelta))
{
return true;
}
return false;
}
{
try
{
File file = new File(filename);
BufferedImage tempImage = ImageIO.read(file);
width = tempImage.getWidth();
height = tempImage.getHeight();
image = tempImage.getRGB(0, 0, width, height, image, 0, width);
usingByteImage = false;
}
catch (IOException e) {}
}
{
image = _image;
usingByteImage = false;
}
{
imageBytes = _image;
usingByteImage = true;
}
public static void main(String[] args)
{
@SuppressWarnings("unused")
PoleDetectorOud blaat = new PoleDetectorOud();
}
}