Как начать обработку изображений в реальном времени с помощью Android? - PullRequest
0 голосов
/ 13 марта 2019

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

Я закончил с логикой обработки в режиме реального времени с частотой кадров 3, а время обработки в среднем составляет 0,4 секунды, что хорошо в моем случае.

Проблема в том, что проект будет использоваться в промышленности, и я хочу начать обработку кадра только тогда, когда продукт находится в поле зрения камеры.

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

Вот код для детализации движения:

   @Override
   public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    long e1 = Core.getTickCount();
    contours.clear();
    //gray frame because it requires less resource to process
    mGray = inputFrame.gray();

    //this function converts the gray frame into the correct RGB format for the BackgroundSubtractorMOG apply function
    Imgproc.cvtColor(mGray, mRgb, Imgproc.COLOR_GRAY2RGB);

    //apply detects objects moving and produces a foreground mask
    //the lRate updates dynamically dependent upon seekbar changes
    sub.apply(mRgb, mFGMask, lRate);

    //erode and dilate are used  to remove noise from the foreground mask
    Imgproc.erode(mFGMask, mFGMask, new Mat());
    Imgproc.dilate(mFGMask, mFGMask, new Mat());

    //drawing contours around the objects by first called findContours and then calling drawContours
    //RETR_EXTERNAL retrieves only external contours
    //CHAIN_APPROX_NONE detects all pixels for each contour
    Imgproc.findContours(mFGMask, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_NONE);

    //draws all the contours in red with thickness of 2
    Imgproc.drawContours(mRgb, contours, -1, new Scalar(255, 0, 0), 2);

    long e2 = Core.getTickCount();
    long e = e2 - e1;
    double time = e / Core.getTickFrequency();

    Log.d("timeTAG", "" + contours.size());


    return mRgb;
}

Что вы предлагаете в качестве решения этой проблемы?

...