OpenCV inRange не находит цвета - PullRequest
0 голосов
/ 27 марта 2020

Здравствуйте, я пишу программу, которая может обнаружить игральные карты. Одним из атрибутов карты является его цвет. Я пытаюсь запустить 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. Должен дважды проверить себя. После изменения значений все работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...