Как нарисовать стрелку, поставить на рамку и отобразить в реальном времени? - PullRequest
0 голосов
/ 12 сентября 2018

Мне нужно создать четыре стрелки (вверх, вниз, влево и вправо) и поместить их на кадр в режиме реального времени. Я выполняю некоторую работу с обработкой изображений в реальном времени и на основе результатов функции мне нужно показать стрелку в режиме реального времени на кадре. После получения кадра из:

 public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

    mRgba = inputFrame.rgba();
    mGray = inputFrame.gray();
    if(state){

        myTask= new MyTask();
        myTask.execute(mRgba);
        //need to write method to display arrow
        return mRgba;
    }
    return mRgba;
}

Вызывает асинхронную задачу, чтобы метод распознал и установил, какая стрелка должна отображаться. На данный момент он возвращает 1, если начальный кадр и другие кадры совпадают. Мне нужно знать, как сделать стрелку и отобразить ее на Позже я сделаю алгоритм для определения направления, поэтому давайте предположим, что когда return равен 1, мне нужно отобразить стрелку вверх в кадре. Моя асинктивная задача:

class MyTask extends AsyncTask<Mat, Void, Integer> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Integer doInBackground(Mat... mats) {
        if(!isCancelled())
        return recognize(mats[0]);
        else return 0;
    }

    @Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);
        directionOfCamera=integer;
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
    }
}

Метод распознавания:

public int recognize(Mat inputFrame) {

    if (startedFrame){

        deskriptor.detect(inputFrame,keypoints1);
        deskriptor.compute(inputFrame,keypoints1,deskriptor1);

        startedFrame=false;
        return 0;
    }

    deskriptor.detect(inputFrame,keypoints2);

    Size size;
    size=keypoints2.size();

    if(size.height!= 0) {
    deskriptor.compute(inputFrame,keypoints2,deskriptor2);

    List<MatOfDMatch> matches = new LinkedList<MatOfDMatch>();

    matcher.knnMatch(deskriptor1, deskriptor2, matches,2);

        //Calculating good match list...
        LinkedList<DMatch> goodMatchesList = new LinkedList<DMatch>();

        for (int i = 0; i < matches.size(); i++) {
            MatOfDMatch matofDMatch = matches.get(i);
            DMatch[] dmatcharray = matofDMatch.toArray();
            DMatch m1 = dmatcharray[0];
            DMatch m2 = dmatcharray[1];

            if (m1.distance <= m2.distance * nndrRatio) {
                goodMatchesList.addLast(m1);

            }
        }

        if (goodMatchesList.size() >= 7) {

            List<KeyPoint> controlKeypointlist = keypoints1.toList();
            List<KeyPoint> liveKeypointlist = keypoints2.toList();

            LinkedList<Point> objectPoints = new LinkedList<>();
            LinkedList<Point> scenePoints = new LinkedList<>();

            for (int i = 0; i < goodMatchesList.size(); i++) {
                objectPoints.addLast(controlKeypointlist.get(goodMatchesList.get(i).queryIdx).pt);
                scenePoints.addLast(liveKeypointlist.get(goodMatchesList.get(i).trainIdx).pt);
            }

            MatOfPoint2f objMatOfPoint2f = new MatOfPoint2f();
            objMatOfPoint2f.fromList(objectPoints);

            MatOfPoint2f scnMatOfPoint2f = new MatOfPoint2f();
            scnMatOfPoint2f.fromList(scenePoints);

            return 1;

        }
    }

    return 0;
}

В основном это должно выглядеть так:

enter image description here

Если отсутствует какой-либо код, который помогает, дайте мне знать, и я добавлю его.

1 Ответ

0 голосов
/ 12 сентября 2018

Как решение - нарисуйте стрелки в Adobe After Effects и используйте эту библиотеку AirBnB для ее реализации

...