Я разрабатываю приложение для 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, и это занимает то же время, так что я думаю, что основная проблема не вобработка изображения, это загрузка растрового изображения для обработки из предыдущей операции.