Приложения обнаруживают определенный цвет на кадре и рисуют контуры с помощью OpenCV. И когда нажата кнопка захвата, изображение кадра будет использоваться для обработки некоторых изображений, в то время как нарисованные контуры также будут захвачены рамкой, которая не является тем, что я хочу. Мой вопрос: как удалить контуры, нарисованные, когда я нажимаю кнопку захвата. Или есть какой-нибудь способ получить рамку без рисунков?OpenCV (Android) - удалить контуры, нарисованные
Метод, который я пробовал:
- Блокировка onCapture() до onCameraFrame называется и вернуть mRbg перед drawContour() называется.
- 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");
}
}
}
}
Если область выбрана пользователем, nRgba (submat of mRgba) не имеет значения null, то будет выполнено Imgproc.drawContours (nRgba, контуры, -1, контурColor), иначе Imgproc.drawContours (mRgba, контуры, - 1, контурColor). Это не имеет проблем при рисовании контуров. Проблема заключается в том, что захваченное изображение включает границу контуров, нарисованную этим методом, чего я не хочу. То, что я хочу, это отображение контуров на экране, но не сохраненное изображение. – shisushi
, пожалуйста, проверите мое редактирование – shisushi
Я не понимаю эту часть: «Проблема заключается в том, что захваченное изображение включает границу контуров, нарисованную этим методом». Вы имеете в виду, что у уже захваченного изображения есть контуры, нарисованные до вызова ** Imgproc.drawContours **? – NAmorim