Подтвердить что ты не робот

Как сопоставить координаты кадра с наложением на видение

Я чувствую, что этот Вопрос уже решен много раз, но я не могу понять это. Я в основном придерживался этого небольшого учебника о мобильном видении и завершил его. После этого я попытался обнаружить объекты самостоятельно, начиная с ColorBlob и рисовать его границы.

Идея состоит в том, чтобы начать посередине кадра (специально удерживая объект посередине камеры) и обнаруживая края этого объекта по его цвету. Он работает до тех пор, пока я держу телефон в ландшафтном режиме (Frame.ROTATION_0). Как только я нахожусь в режиме портрета (Frame.Rotation_90), ограничивающее Rect получает обратное вращение, поэтому объект с большей высотой получает больше ширины, а также бит.

docs говорят, что детектор всегда обеспечивает согласования с невращающимся вертикальным фреймом, и как я могу вычислить прямоугольные прямоугольные координаты в соответствии с его вращением? Я не думаю, что это имеет большое значение, но вот как я нахожу цвет Rect

    public Rect getBounds(Frame frame){
        int w = frame.getMetadata().getWidth();
        int h = frame.getMetadata().getHeight();
        int scale = 50;
        int scaleX = w / scale;
        int scaleY = h / scale;
        int midX = w / 2;
        int midY = h / 2;
        float ratio = 10.0
        Rect mBoundary = new Rect();
        float[] hsv = new float[3];
        Bitmap bmp = frame.getBitmap();
        int px = bmp.getPixel(midX, midY);
        Color.colorToHSV(px, hsv);
        Log.d(TAG, "detect: mid hsv: " + hsv[0] + ", " + hsv[1] + ", " + hsv[2]);
        float hue = hsv[0];
        float nhue;
        int x, y;
        for (x = midX + scaleX; x < w; x+=scaleX){
            px = bmp.getPixel(x, midY);
            Color.colorToHSV(px, hsv);
            nhue = hsv[0];
            if (nhue <= (hue + ratio) && nhue >= (hue - ratio)){
                mBoundary.right = x
            } else {
                break;
            }
        }

        for (x = midX - scaleX; x >= 0; x-= scaleX){
            px = bmp.getPixel(x, midY);
            Color.colorToHSV(px, hsv);
            nhue = hsv[0];
            if (nhue <= (hue + ratio) && nhue >= (hue - ratio)){
                mBoundary.left = x
            } else {
                break;
            }
        }

        for (y = midY + scaleY; y < h; y+=scaleY){
            px = bmp.getPixel(midX, y);
            Color.colorToHSV(px, hsv);
            nhue = hsv[0];
            if (nhue <= (hue + ratio) && nhue >= (hue - ratio)){
                mBoundary.bottom = y;
            } else {
                break;
            }
        }

        for (y = midY - scaleY; y >= 0; y-=scaleY){
            px = bmp.getPixel(midX, y);
            Color.colorToHSV(px, hsv);
            nhue = hsv[0];
            if (nhue <= (hue + ratio) && nhue >= (hue - ratio)){
                mBoundary.top = y
            } else {
                break;
            }
        }
        return mBoundary;
    }

Затем я просто рисую его в методе GraphicOverlay.Graphic на холсте. Я уже использую методы transformX/Y на графике и думаю, что он также будет учитывать поворот. Я также использую класс CameraSource и CameraSourcePreview, предоставленный из образцов.

4b9b3361