问题
When I run this program that is supposed to detect circles in an image I get Array index out of bounds exception at the last method when I call drawCircles()
findCircle() read the image and searches for circles and drawCircles() draws them using Bresenaham algorithm.
public class Assig1 {
public static void main(String[] args) {
try {
// arg 0 is the input image name
BufferedImage img = ImageIO.read(new File(args[0]));
// arg 1 is the min radius
int minr = Integer.parseInt(args[1]);
// arg 2 is the max radius
int maxr = Integer.parseInt(args[2]);
// if present, arg 3 is the max width we consider
int w = (args.length>3) ? Integer.parseInt(args[3]) : img.getWidth();
// if present, arg 4 is the max height we consider
int h = (args.length>4) ? Integer.parseInt(args[4]) : img.getHeight();
// you can look at pixel values with this API call:
int c = img.getRGB(0,0); // get RGB value of pixel at (0,0)
// you can write out pixels with the setRGB() API. However,
// what you get will depend on the colour model, so here
// we use a Graphics2D object.
// graphical output
Graphics2D g2 = img.createGraphics();
// use red
g2.setColor(Color.RED);
// call circle drawing algorithm
drawCircle(5,5,3,img,g2);
//-----
findCircle(minr,img, w, h);
//----
// write out the image
File outputfile = new File("outputimage1.png");
ImageIO.write(img, "png", outputfile);
} catch (Exception e) {
e.printStackTrace();
}
}
// Bresenham's algorithm to draw a circle
// requires circle center and radius, as well as the
// image and Graphics2D object with drawing colour already set.
static void drawCircle(int cx,int cy,int r,BufferedImage img,Graphics2D g) {
int f = 1-r;
int ddF_x = 1;
int ddF_y = -2 * r;
int x = 0;
int y = r;
// draw cardinal points
g.drawLine(cx,cy+r,cx,cy+r);
g.drawLine(cx,cy-r,cx,cy-r);
g.drawLine(cx+r,cy,cx+r,cy);
g.drawLine(cx-r,cy,cx-r,cy);
// draw 1/8 of the circle, taking advantage of symmetry
while(x < y) {
if(f >= 0) {
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x;
g.drawLine(cx+x,cy+y,cx+x,cy+y);
g.drawLine(cx-x,cy+y,cx-x,cy+y);
g.drawLine(cx+x,cy-y,cx+x,cy-y);
g.drawLine(cx-x,cy-y,cx-x,cy-y);
g.drawLine(cx+y,cy+x,cx+y,cy+x);
g.drawLine(cx-y,cy+x,cx-y,cy+x);
g.drawLine(cx+y,cy-x,cx+y,cy-x);
g.drawLine(cx-y,cy-x,cx-y,cy-x);
}
}
static void findCircle(int r,BufferedImage img, int w, int h) {
//getting all the pixels from an image
int[][] pixels = new int[w][h];
for( int i = 0; i < w; i++ ){
for( int j = 0; j < h; j++ ){
pixels[i][j] = img.getRGB( i, j );
}
}
// graphical output
Graphics2D g2 = img.createGraphics();
// use red
g2.setColor(Color.RED);
for (int i1=0; i1<pixels.length; i1++) {
for (int j1=0; j1<pixels[i1].length; j1++) {
if(pixels[i1][j1] != pixels[i1+r][j1]
|| pixels[i1][j1] != pixels[i1-r][j1]
|| pixels[i1][j1] != pixels[i1][j1+r]
|| pixels[i1][j1] != pixels[i1][j1-r]){
drawCircle(i1,j1,r,img,g2);
}
}
}
}
}
回答1:
In your findCircle method,
if(pixels[i1][j1] != pixels[i1+r][j1]
|| pixels[i1][j1] != pixels[i1-r][j1]
|| pixels[i1][j1] != pixels[i1][j1+r]
|| pixels[i1][j1] != pixels[i1][j1-r]){
drawCircle(i1,j1,r,img,g2);
}
If r is anything but 0 this will cause an array index out of bounds exception since you're basically looping from the 0th to the nth index. Basically anywhere you're adding or subtracting r. For example, this is one of the statements that will cause this error
pixels[i1+r][j1]
来源:https://stackoverflow.com/questions/14487244/array-index-out-of-bounds-exception