Здравствуйте, я пишу программу, которая может обнаружить игральные карты. Одним из атрибутов карты является его цвет. Я пытаюсь запустить inRange с тремя возможными цветами и определить, какой цвет он использует, исходя из количества белых пикселей, возвращаемых inRange. Цвет с наибольшим количеством белых пикселей, вероятно, является цветом карты.
Проблема: inRange возвращает полный черный мат. не находит цвета.
Метод определения цвета карты.
public String matchCardColor(Mat wrap){
//The Mat format is bgr so we convert it to hsv to better find the colors.
Mat hsv = new Mat();
Imgproc.cvtColor(wrap,hsv,Imgproc.COLOR_BGR2HSV,0);
//Defining the colors boundaries.
Boundaries[] colors = {new Boundaries(Card.Color.GREEN),
new Boundaries(Card.Color.PURPLE),
new Boundaries(Card.Color.RED)};
//Finding the color with the most pixels found.
Mat coloredPixels = new Mat();
Mat mask = new Mat();
int foundPixels;
int maxPixels = 0;
String color = "N/A";
for (Boundaries b :
colors) {
Core.inRange(hsv,b.getLowerBoundary(),b.getUpperBoundary(),coloredPixels);
foundPixels = getWhitePixles(coloredPixels);
if (foundPixels>maxPixels){
maxPixels = foundPixels;
color = b.getColor();
mask = coloredPixels.clone();
}
}
//mainImgView.setImage(mat2Image(mask));
System.out.println("Max pixels found: " + maxPixels);
return color;
}
Границы - это класс, созданный для описания границ цвета.
public class Boundaries {
private Scalar lowerBoundary, upperBoundary;
private String name;
public Boundaries(String name){
this.name = name;
switch (name){
case Card.Color.GREEN: lowerBoundary = new Scalar(50,100,20);
upperBoundary = new Scalar(70,255,255);
break;
case Card.Color.PURPLE: lowerBoundary = new Scalar(140,100,20);
upperBoundary = new Scalar(160,255,255);
break;
case Card.Color.RED: lowerBoundary = new Scalar(170,100,20);
upperBoundary = new Scalar(10,255,255);
break;
default: name = "Wrong color name entered!";
break;
}
}
public String getColor(){
return name;
}
public Scalar getLowerBoundary(){
return lowerBoundary;
}
public Scalar getUpperBoundary(){
return upperBoundary;
}
}
getWhitePixels просто считает количество пикселей со значением 255.
private int getWhitePixles(Mat mat) {
int whitePixels = 0;
for(int i=0; i<mat.size().height; i++)
for (int j=0; j<mat.size().width; j++)
if (mat.get(i,j)[0]==255)
whitePixels++;
return whitePixels;
}
Мат, который я тестирую: Обтекание
Цветные пиксели сохраняют полный черный мат на каждой итерации и maxPixels остается 0, хотя карта имеет красный.
РЕДАКТИРОВАТЬ: Я дал цвета неправильные границы HSV. Должен дважды проверить себя. После изменения значений все работает!