我正在创建一个与从图像中提取车牌相关的 android 应用程序。我遵循的提取车牌的算法是基于图像中对象(blob)的连接组件标签。在 matlab 中,我可以使用 bwlabel() 轻松执行 CCL,但在 android (eclipse IDE) 中找不到类似 bwlabel 的东西
是否有一些预定义的方法或任何其他方式可以帮助我在 Android 中标记图像中的对象?
我正在创建一个与从图像中提取车牌相关的 android 应用程序。我遵循的提取车牌的算法是基于图像中对象(blob)的连接组件标签。在 matlab 中,我可以使用 bwlabel() 轻松执行 CCL,但在 android (eclipse IDE) 中找不到类似 bwlabel 的东西
是否有一些预定义的方法或任何其他方式可以帮助我在 Android 中标记图像中的对象?
伙计,我真的不擅长 Java,但我创建了自己的连接组件标签类。使用 TwoPass 功能:
public class ConnectedComponentsLabelling {
public static int[][] twoPass(int[][] matrix) {
int nextLabel = 1;
int rowLength = matrix.length;
int columnLength = matrix[0].length;
List<Set<Integer>> linked = new ArrayList<Set<Integer>>();
int[][] labels = new int[rowLength][columnLength];
//Primeiro Passo
for (int row = 0; row < rowLength; row++) {
for (int column = 0; column < columnLength; column++) {
if (matrix[row][column] != 0) {
int[] neibours = neibours(row, column, labels);
if (neibours.length == 0) {
linked.add(new HashSet());
linked.get(nextLabel - 1).add(nextLabel);
labels[row][column] = nextLabel;
nextLabel += 1;
} else {
Arrays.sort(neibours);
labels[row][column] = neibours[0];
for (int i = 0; i < neibours.length; i++) {
for (int j = 0; j < neibours.length; j++) {
linked.get(neibours[i] - 1).add(neibours[j]);
}
}
}
}
}
}
//Segundo Passo
int[] vector = new int[nextLabel];
for (int i= 0; i < nextLabel - 1; i++){
vector[i] = Collections.min(linked.get(i), null);
}
for (int row = 0; row < rowLength; row++) {
for (int column = 0; column < columnLength; column++) {
if (matrix[row][column] != 0) {
labels[row][column] = vector[labels[row][column] - 1];
}
}
}
return labels;
}
public static int[] neibours(int row, int column, int[][] matrix) {
int[] neibours = {};
int rowLength = matrix.length;
int columnLength = matrix[0].length;
if (row ==0 && column ==0) { return neibours;
}
else if (row == 0) {
neibours = add_element(matrix[row][column - 1], neibours);
} else if (column == 0) {
neibours = add_element(matrix[row - 1][column], neibours);
} else if ((row > 0) && (column > 0) && (column < columnLength - 1)) {
neibours = add_element(matrix[row][column - 1], neibours);
neibours = add_element(matrix[row - 1][column - 1], neibours);
neibours = add_element(matrix[row - 1][column], neibours);
neibours = add_element(matrix[row - 1][column + 1], neibours);
} else if (row > 0 && column > 0) {
neibours = add_element(matrix[row][column - 1], neibours);
neibours = add_element(matrix[row - 1][column - 1], neibours);
neibours = add_element(matrix[row - 1][column], neibours);
}
int[] neibours2 = {};
for (int i = 0; i < neibours.length; i++) {
if (neibours[i] != 0) {
neibours2 = add_element(neibours[i], neibours2);
}
}
return neibours2;
}
public static int max(int[] vector){
int max = 0;
for (int number = 0; number < vector.length; number++) {
if (number > max){max = number;}
}
return max;
}
public static int[] areaCount(int[][] matrix){
int[] vectorLabel = {};
int[] vectorArea = {};
int positionNew = 0;
boolean teste;
int rowLength = matrix.length;
int columnLength = matrix[0].length;
for (int row = 0; row < rowLength; row++) {
for (int column = 0; column < columnLength; column++) {
teste = true;
for (int position = 0; position < vectorLabel.length; position++){
if (vectorLabel[position] == matrix[row][column]) {positionNew = position; teste = false;}
}
if (teste){
vectorLabel = add_element(matrix[row][column], vectorLabel);
vectorArea = add_element(1, vectorArea);
} else {
vectorArea[positionNew] = vectorArea[positionNew] + 1;
}
}
}
return vectorArea;
}
public static int[] add_element(int element, int[] neibours) {
neibours = Arrays.copyOf(neibours, neibours.length + 1);
neibours[neibours.length - 1] = element;
return neibours;
}
}
但我不推荐使用它,因为它太慢了......更好地导入 OPENCV 并使用与想法相似但它是用 C 编写的 findCountours。
我在一个代码中使用它来查找图像中不同元素的区域:
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat imgMat = new Mat();
List<Double> areasList = new ArrayList<Double>();
Imgproc.findContours(imgMat, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_NONE);
//matrix = ConnectedComponentsLabelling.twoPass(matrix);
for (int idx = 0; idx < contours.size(); idx++) {
Mat contour = contours.get(idx);
double contourarea = Imgproc.contourArea(contour);
areasList.add(contourarea);
}