// Path: desktop/src/main/java/com/cv4j/core/datamodel/ByteProcessor.java
// public class ByteProcessor implements ImageProcessor {
//     private int width;
//     private int height;
// 
//     private byte[] GRAY;
//     private int[] hist;
//     private ImageData image;
// 
//     public ByteProcessor(int width, int height) {
//         this.width = width;
//         this.height = height;
//         this.GRAY = new byte[width*height];
//     }
//     
//     public ByteProcessor(byte[] data, int width, int height) {
//         this.width = width;
//         this.height = height;
//         this.GRAY = data;
//         // setup hist
//         hist = new int[256];
//         for(int i=0; i<data.length; i++) {
//             hist[data[i]&0xff]++;
//         }
//     }
// 
//     protected void setCallBack(ImageData data) {
//         this.image = data;
//     }
// 
//     @Override
//     public int getChannels() {
//         return 1;
//     }
// 
//     public void getPixel(int row, int col, byte[] rgb) {
//         int index = row*width + col;
//         if(rgb != null && rgb.length == 1) {
//             rgb[0] = GRAY[index];
//         }
//     }
// 
//     public byte[] getGray() {
//         return GRAY;
//     }
// 
//     public void putGray(byte[] gray) {
//         System.arraycopy(gray, 0, GRAY, 0, gray.length);
//     }
// 
//     public int[] histogram() {
//         return new int[0];
//     }
// 
//     public int[] getPixels() {
//         int size = width * height;
//         int[] pixels = new int[size];
//         for (int i=0; i < size; i++)
//             pixels[i] = 0xff000000 | ((GRAY[i]&0xff)<<16) | ((GRAY[i]&0xff)<<8) | GRAY[i]&0xff;
//         return pixels;
//     }
// 
//     @Override
//     public float[] toFloat(int index) {
//         float[] data = new float[GRAY.length];
//         for(int i=0; i<data.length; i++)
//             data[i] = GRAY[i]&0xff;
//         return data;
//     }
// 
//     @Override
//     public int[] toInt(int index) {
//         int[] data = new int[GRAY.length];
//         for(int i=0; i<data.length; i++)
//             data[i] = GRAY[i]&0xff;
//         return data;
//     }
// 
//     @Override
//     public byte[] toByte(int index) {
//         return GRAY;
//     }
// 
// 	@Override
// 	public int getWidth() {
// 		return width;
// 	}
// 
// 	@Override
// 	public int getHeight() {
// 		return height;
// 	}
// 
// 	@Override
// 	public ImageData getImage() {
// 
// 		return image;
// 	}
// 
// }
// 
// Path: desktop/src/main/java/com/cv4j/core/datamodel/Line.java
// public class Line {
//     public int x1 = 0;
//     public int y1 = 0;
//     public int x2 = 0;
//     public int y2 = 0;
// 
//     public Line(int x1, int y1, int x2, int y2) {
//         this.x1 = x1;
//         this.y1 = y1;
//         this.x2 = x2;
//         this.y2 = y2;
//     }
// 
//     public Line() {}
// 
//     public double getSlope() {
//         double dy = y2 - y1;
//         double dx = x2 - x1;
//         if(dx == 0) {
//             return Double.NaN;
//         }
//         return (dy/dx);
//     }
// 
//     public Point getPoint1() {
//         return new Point(x1, y1);
//     }
// 
//     public Point getPoint2() {
//         return new Point(x2, y2);
//     }
// 
// }


import com.cv4j.core.datamodel.ByteProcessor;
import com.cv4j.core.datamodel.Line;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
			for (int theta = 0; theta < 180; theta++) {

				value = (int) (((double) acc[r * 180 + theta] / (double) max) * 255.0);
				acc[r * 180 + theta] = 0xff000000 | (value << 16 | value << 8 | value);
			}
		}

		// 发现前N个信号最强的点，转换为平面坐标，得到直线
		findMaxima(acc, lines);

		// filter by min gap
		// TODO: zhigaang


	}

	private void findMaxima(int[] acc, List<Line> lines) {

		// 初始化
		int rmax = (int) Math.sqrt(width * width + height * height);
		int[] results = new int[accSize * 3];
		// 开始寻找前N个最强信号点，记录极坐标坐标位置
		for (int r = 0; r < rmax; r++) {
			for (int theta = 0; theta < 180; theta++) {
				int value = (acc[r * 180 + theta] & 0xff);

				// if its higher than lowest value add it and then sort
				if (value > results[(accSize - 1) * 3]) {

					// add to bottom of array
// Path: desktop/src/main/java/com/cv4j/core/datamodel/ByteProcessor.java
// public class ByteProcessor implements ImageProcessor {
//     private int width;
//     private int height;
// 
//     private byte[] GRAY;
//     private int[] hist;
//     private ImageData image;
// 
//     public ByteProcessor(int width, int height) {
//         this.width = width;
//         this.height = height;
//         this.GRAY = new byte[width*height];
//     }
//     
//     public ByteProcessor(byte[] data, int width, int height) {
//         this.width = width;
//         this.height = height;
//         this.GRAY = data;
//         // setup hist
//         hist = new int[256];
//         for(int i=0; i<data.length; i++) {
//             hist[data[i]&0xff]++;
//         }
//     }
// 
//     protected void setCallBack(ImageData data) {
//         this.image = data;
//     }
// 
//     @Override
//     public int getChannels() {
//         return 1;
//     }
// 
//     public void getPixel(int row, int col, byte[] rgb) {
//         int index = row*width + col;
//         if(rgb != null && rgb.length == 1) {
//             rgb[0] = GRAY[index];
//         }
//     }
// 
//     public byte[] getGray() {
//         return GRAY;
//     }
// 
//     public void putGray(byte[] gray) {
//         System.arraycopy(gray, 0, GRAY, 0, gray.length);
//     }
// 
//     public int[] histogram() {
//         return new int[0];
//     }
// 
//     public int[] getPixels() {
//         int size = width * height;
//         int[] pixels = new int[size];
//         for (int i=0; i < size; i++)
//             pixels[i] = 0xff000000 | ((GRAY[i]&0xff)<<16) | ((GRAY[i]&0xff)<<8) | GRAY[i]&0xff;
//         return pixels;
//     }
// 
//     @Override
//     public float[] toFloat(int index) {
//         float[] data = new float[GRAY.length];
//         for(int i=0; i<data.length; i++)
//             data[i] = GRAY[i]&0xff;
//         return data;
//     }
// 
//     @Override
//     public int[] toInt(int index) {
//         int[] data = new int[GRAY.length];
//         for(int i=0; i<data.length; i++)
//             data[i] = GRAY[i]&0xff;
//         return data;
//     }
// 
//     @Override
//     public byte[] toByte(int index) {
//         return GRAY;
//     }
// 
// 	@Override
// 	public int getWidth() {
// 		return width;
// 	}
// 
// 	@Override
// 	public int getHeight() {
// 		return height;
// 	}
// 
// 	@Override
// 	public ImageData getImage() {
// 
// 		return image;
// 	}
// 
// }
// 
// Path: desktop/src/main/java/com/cv4j/core/datamodel/Line.java
// public class Line {
//     public int x1 = 0;
//     public int y1 = 0;
//     public int x2 = 0;
//     public int y2 = 0;
// 
//     public Line(int x1, int y1, int x2, int y2) {
//         this.x1 = x1;
//         this.y1 = y1;
//         this.x2 = x2;
//         this.y2 = y2;
//     }
// 
//     public Line() {}
// 
//     public double getSlope() {
//         double dy = y2 - y1;
//         double dx = x2 - x1;
//         if(dx == 0) {
//             return Double.NaN;
//         }
//         return (dy/dx);
//     }
// 
//     public Point getPoint1() {
//         return new Point(x1, y1);
//     }
// 
//     public Point getPoint2() {
//         return new Point(x2, y2);
//     }
// 
// }


// Path: desktop/src/main/java/com/cv4j/core/binary/HoughLinesP.java
import com.cv4j.core.datamodel.ByteProcessor;
import com.cv4j.core.datamodel.Line;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

			for (int theta = 0; theta < 180; theta++) {

				value = (int) (((double) acc[r * 180 + theta] / (double) max) * 255.0);
				acc[r * 180 + theta] = 0xff000000 | (value << 16 | value << 8 | value);
			}
		}

		// 发现前N个信号最强的点，转换为平面坐标，得到直线
		findMaxima(acc, lines);

		// filter by min gap
		// TODO: zhigaang


	}

	private void findMaxima(int[] acc, List<Line> lines) {

		// 初始化
		int rmax = (int) Math.sqrt(width * width + height * height);
		int[] results = new int[accSize * 3];
		// 开始寻找前N个最强信号点，记录极坐标坐标位置
		for (int r = 0; r < rmax; r++) {
			for (int theta = 0; theta < 180; theta++) {
				int value = (acc[r * 180 + theta] & 0xff);

				// if its higher than lowest value add it and then sort
				if (value > results[(accSize - 1) * 3]) {

					// add to bottom of array
					results[(accSize - 1) * 3] = value;