Как я могу сократить время, чтобы обнаружить ограничивающие риты, используя Opencv? - PullRequest
0 голосов
/ 22 февраля 2019

Я разрабатываю приложение для Android для обнаружения ограничивающих сторон изображений с помощью Android и Opencv, а затем применяю ORB для нахождения сходства с другими изображениями.

Вот что я уже сделал:

   for (int i = contours.size() - 1 ; i >= 0 ; i--) {
        double area= Imgproc.contourArea(contours.get(i),false);  //  Find the area of contour
        if(area<min_area)
            contours.remove(i);
    }

  private void process_detect_edges(Bitmap imageToProcess) {
    Mat mRGBA = new Mat();
    imageToProcess = getResizedBitmap(imageToProcess, 500);
    Utils.bitmapToMat(imageToProcess, mRGBA);

    Mat mGray = new Mat();
    Imgproc.cvtColor(mRGBA, mGray, Imgproc.COLOR_BGR2GRAY);
    Imgproc.GaussianBlur(mGray, mGray, new Size(3, 3), 2);
    Imgproc.Canny(mGray, mGray, 20, 80, 3, false);
    Mat kernell = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(9,9));
    Imgproc.morphologyEx(mGray, mGray, Imgproc.MORPH_CLOSE, kernell);

    //find the contours
    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
    Mat hierarchy = new Mat();
    Imgproc.findContours(mGray, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

    for (int i = contours.size() - 1 ; i >= 0 ; i--) {
        double area= Imgproc.contourArea(contours.get(i),false);  //  Find the area of contour
        if(area<min_area)
            contours.remove(i);
    }
    MatOfPoint2f approxCurve = new MatOfPoint2f();
    for (int idx = 0; idx < contours.size() ; idx++) {

        //Convert contours(i) from MatOfPoint to MatOfPoint2f
        MatOfPoint2f contour2f = new MatOfPoint2f( contours.get(idx).toArray() );
        //Processing on mMOP2f1 which is in type MatOfPoint2f
        double approxDistance = Imgproc.arcLength(contour2f, true)*0.02;
        Imgproc.approxPolyDP(contour2f, approxCurve, approxDistance, true);

        //Convert back to MatOfPoint
        MatOfPoint points = new MatOfPoint( approxCurve.toArray() );

        // Get bounding rect of contour
        Rect rect = Imgproc.boundingRect(points);
        rectList.add(rect);
        Mat miniature = new Mat(mRGBA, new Rect(rect.tl(), rect.br()));
        mats.add(miniature);

        // draw enclosing rectangle (all same color, but you could use variable i to make them unique)
        Imgproc.rectangle(mRGBA, rect.tl(), rect.br(), new Scalar(0, 255, 0));
    }

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что время, которое требуется приложению для нахождения этих ограничивающих ритов, немного велико (до 2 секунд)

Что можно сделать, чтобы сократить время, затрачиваемое на обработкуизображение менее чем за 1 секунду?

РЕДАКТИРОВАТЬ:

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

...