2017-01-31 11 views
1

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

Метод, который я пробовал:

  1. Блокировка onCapture() до onCameraFrame называется и вернуть mRbg перед drawContour() называется.
  2. Clone mRgba к новому Мату и использовать новый коврик в качестве параметра subColor

Но оба они не работал.

Я думаю, чтобы приостановить onCapture(), пока onCameraFrame не позвонил и не сделал несколько раз пропуская линии контуров чертежа, чтобы убедиться, что на кадре ничего не нарисовано. Но я не знаю, как обращаться с двумя синхронизированными().

public boolean onTouch(View v, MotionEvent event) { 
    lock = true; 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     //do something 
    } else if (event.getAction() == MotionEvent.ACTION_UP) { 
     //do something 
     //↓to make sure onCameraFrame is pause before the finger left the screen 
     lock = false; 
     synchronized (locker) { locker.notify(); } 
    } 

    return true; 
} 

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    //Pause until onTouch() is done 
    commandLocker(); 

    //Detect the contour 
    mDetector.setHsvColor(txtHsv); 
    if (area) { 
     nRgba = mRgba.submat(ey, sy, sx, ex); 
     mDetector.process(nRgba); 
    } else { 
     mDetector.process(mRgba); 
    } 

    //Skip this when onCapture is called 
    //Draw the contour on the frame 
    if (!capture) { 
     List<MatOfPoint> contours = mDetector.getContours(); 
     if (nRgba != null && area) { 
      Imgproc.rectangle(mRgba, new Point(sx, sy), new Point(ex, ey), areaColor, 3); 
      Imgproc.drawContours(nRgba, contours, -1, contourColor); 
     } else 
      Imgproc.drawContours(mRgba, contours, -1, contourColor); 
    } 

    return mRgba; 
} 

public void onCapture(View view) throws IOException { 
    capture = true; 
    //Pause until onCameraFrame() done 
    if (!area) 
     subColor(mRgba); 
    else 
     subColor(nRgba); 
} 

public void subColor (Mat src) throws IOException { 
    //do something 
} 

private void commandLocker() { 
    synchronized (locker) { 
     while (lock) { 
      try { 
       locker.wait(); 
      } catch (InterruptedException e) { 
       Log.e("Exception", "InterruptedException"); 
      } 
     } 
    } 
} 

Frame captured without processing Processed image

ответ

0

В вашей onCameraFrame(CvCameraViewFrame inputFrame) функции, если условие:

if (nRgba != null)

не устраивает, вы перезаписать оригинальный коврик mRgba делая Imgproc.drawContours(mRgba, contours, -1, contourColor);

Это ваша проблема?

+0

Если область выбрана пользователем, nRgba (submat of mRgba) не имеет значения null, то будет выполнено Imgproc.drawContours (nRgba, контуры, -1, контурColor), иначе Imgproc.drawContours (mRgba, контуры, - 1, контурColor). Это не имеет проблем при рисовании контуров. Проблема заключается в том, что захваченное изображение включает границу контуров, нарисованную этим методом, чего я не хочу. То, что я хочу, это отображение контуров на экране, но не сохраненное изображение. – shisushi

+0

, пожалуйста, проверите мое редактирование – shisushi

+0

Я не понимаю эту часть: «Проблема заключается в том, что захваченное изображение включает границу контуров, нарисованную этим методом». Вы имеете в виду, что у уже захваченного изображения есть контуры, нарисованные до вызова ** Imgproc.drawContours **? – NAmorim

 Смежные вопросы

  • Нет связанных вопросов^_^