Я разрабатываю приложение для 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;
}
Что вы предлагаете в качестве решения этой проблемы?