Как получить изображения с камеры Android в RGB? - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу разработать программу машинного обучения с использованием Tensorflow, OpenCV и Android. Я уже обучил свою модель и загрузил ее на свой мобильный телефон, но у меня возникают проблемы, когда я хочу передать изображение, снятое камерой. Проблема в том, что камера делает снимки в формате RGBa (который имеет 4 канала), а мой вход CNN имеет только 3 канала (форма выглядит примерно так: 100, 100, 3). Также я хочу разработать приложение, которое я буду делать вывод для каждого кадра, без необходимости нажимать кнопку или что-то в этом роде. Я должен сказать, что я новичок в разработке для Android, и это приложение будет только для демонстрации моей дипломной работы бакалавра.

Мой сетевой вход:

    X = tf.placeholder(tf.float32, shape=[1, height, width, channels], name="X")

, где высота = ширина = 100 и каналы = 3

и мой код Android выглядит примерно так:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        javaCameraView = (JavaCameraView)findViewById(R.id.java_camera_view);
        javaCameraView.setVisibility(SurfaceView.VISIBLE);
        javaCameraView.setCvCameraViewListener(this);
        inferenceInterface = new TensorFlowInferenceInterface(getAssets(), MODEL_FILE);

    }

    @Override
    public Mat onCameraFrame(Mat inputFrame) {
        mRgba = inputFrame;
        Mat resizeimage = new Mat(100, 100, CvType.CV_32SC4);
        Imgproc.resize( inputFrame.clone(), resizeimage, new Size(100, 100));
        MatOfInt rgb = new MatOfInt(100, 100, CvType.CV_32SC3);
        resizeimage.convertTo(rgb,CvType.CV_32SC3);
        float[] rgbFloat = new float[(int)(rgb.total()*rgb.channels())];
        rgb.get(0,0,rgbFloat);
        inferenceInterface.feed(INPUT_NODE, rgbFloat, INPUT_SIZE);

        inferenceInterface.run(new String[] {OUTPUT_NODE});
        int size = classes.length;
        float resu[] = new float[size];
        for(int i =0;i< size;i++){
            resu[i] = 0;
        }
        inferenceInterface.fetch(OUTPUT_NODE, resu);
        Log.d("result", convert(resu));
        return mRgba;
    }

Как мне поступить?

...