ObjectDetection Android с использованием yolo в openCV - PullRequest
0 голосов
/ 23 января 2020

Я новичок в использовании OpenCV в android. Я хочу обнаружить объекты, используя Йоло. Дело в том, что я не хочу использовать прослушиватель камеры OpenCV onCameraFrame для получения кадров. Я хочу использовать onPreviewFrame слушатель. Как вы знаете, мы go кадры в byte[]. Поэтому я не знаю, как соединить кадры в byte[] с Yolo с использованием OpenCV.

Вот код, который я использовал, и он работает хорошо

 @Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

        Mat frame = inputFrame.rgba();
        Imgproc.cvtColor(frame, frame, Imgproc.COLOR_RGBA2RGB);
        Mat imageBlob = Dnn.blobFromImage(frame, 0.00392, new Size(416, 416), new Scalar(0, 0, 0), false, false);

        tinyYOLO.setInput(imageBlob);

        List<Mat> result = new ArrayList<>(2);
        List<String> outBlobNames = new ArrayList<>();
        outBlobNames.add(0, "yolo_16");
        outBlobNames.add(1, "yolo_23");

        tinyYOLO.forward(result, outBlobNames);
        .
        .
        .//SOME CODE HERE
        .

А теперь я хочу использовать onPreviewFrame:

 @Override
public void onPreviewFrame(byte[] data, Camera camera) {
    if (data == null)
        throw new NullPointerException();

// --------------- ------ ЗДЕСЬ Я не знаю, что делать ---------------------

        Camera.Size size = camera.getParameters().getPreviewSize();
        Mat frame = new Mat(size.width,size.width CvType.CV_8UC1);
        frame.put(0, 0, data);
        Imgproc.cvtColor(frame, frame, Imgproc.COLOR_RGBA2RGB);
  //---------------------UP-------------------------------
        Mat imageBlob = Dnn.blobFromImage(frame, 0.00392, new Size(416, 416), new Scalar(0, 0, 0),false, false);

        tinyYOLO.setInput(imageBlob);

        final List<Mat> result = new ArrayList<>(2);
        final List<String> outBlobNames = new ArrayList<>();
        outBlobNames.add(0, "yolo_16");
        outBlobNames.add(1, "yolo_23");

        tinyYOLO.forward(result, outBlobNames);
        .
        .
        .//SOME CODE HERE
        .

И со вторым кодом я получил ошибки:

2020-01-23 15: 26: 55.279 30268-30268 / com.thelonecoder.camera E / AndroidRuntime: FATAL EXCEPTION: main Процесс: com.thelonecoder.camera, PID: 30268 CvException [org.opencv.core .CvException: cv :: Exception: OpenCV (3.4.5) /build/3_4_pack-android/opencv/modules/imgproc/src/color.hpp:255: ошибка: (-2: неопределенная ошибка) в функции 'cv :: CvtHelper :: CvtHelper (cv :: InputArray, cv :: OutputArray, int) [with VScn = cv :: Set <3, 4>; VDcn = cv :: Set <3, 4>; VDepth = cv :: Set <0, 2, 5>; cv :: SizePolicy sizePolicy = (cv :: SizePolicy) 2u; cv :: InputArray = const cv :: _ InputArray &; cv :: OutputArray = const cv :: _ OutputArray &] 'Неверное количество каналов во входном изображении:' VScn :: contains (scn) ', где' scn 'равно 1]

1 Ответ

0 голосов
/ 23 января 2020

Наконец я нашел свой ответ:
Я должен был использовать 3 канала.

Mat frame = new Mat(size.height + size.height / 2, size.width, CvType.CV_8UC3); frame.put(0, 0, data); Imgproc.cvtColor(frame, frame, Imgproc.COLOR_RGBA2RGB);

...