Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Почему распознавание лица так медленно работает?  [new]
VaneS Ri_lax
Member

Откуда: Русский я
Сообщений: 201
Здравствуйте,
разбираюсь с JavaCV, у меня версия 1.5.3
пытаюсь сделать определение лица, взял пример тут
Если подключаться к веб камере, то работает нормально. Но как только я подключаюсь к IP камере, то люто лагает, не могу понять почему.
Вот мой код:
public static void main(String[] args) {
        try {
            OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
            
            CascadeClassifier classifier = new CascadeClassifier("haarcascade_frontalface_default.xml");
            if (classifier == null) {
                System.err.println("ошибка загрузки классификатора.");
                System.exit(1);
            }
            IPCameraFrameGrabber grabber = new IPCameraFrameGrabber("http://192.168.1.101:8080/video", 5, 10, TimeUnit.SECONDS);
            grabber.start();
            
            Frame frame = grabber.grab();
            CanvasFrame canvasFrame = new CanvasFrame("IP camera");
            canvasFrame.setCanvasSize(frame.imageWidth, frame.imageHeight);
            
            Mat grabbedImage = converter.convert(grabber.grab());
            int height = grabbedImage.rows();
            int width = grabbedImage.cols();
            
            Mat grayImage = new Mat(height, width, CV_8UC1);
            Mat rotatedImage = grabbedImage.clone();
            
            RectVector faces = null;
            
            while(canvasFrame.isVisible() && (frame = grabber.grab())!= null){
                grabbedImage = converter.convert(frame);
                //cvtColor(grabbedImage, grayImage, CV_BGR2GRAY);
                
                faces = new RectVector();

////////////////////////////// Из за этого участка кода работает медленно////////////////////////////////////////

                classifier.detectMultiScale(grabbedImage, faces);
                System.out.println(faces.size());
                
                long total = faces.size();
                for(long i = 0; i < total; i++){
                    Rect r = faces.get(i);
                    int x = r.x(), y = r.y(), w = r.width(), h = r.height();
                    rectangle(grabbedImage, new Point(x, y), new Point(x + w, y + h), Scalar.RED, 1, CV_AA, 0);
                }
/////////////////////////////////////////////////////////////////////////////////                
                canvasFrame.showImage(converter.convert(grabbedImage));
                
                
            }
            canvasFrame.dispose();
        } catch (FrameGrabber.Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

Если тот участок кода убрать и показывать то что захвачено с камеры без определения, то работает отлично.
Может это как то подскажет Вам, но загруженность процессора висит на 100%
Такое чувство что идет где то задержка в секунд 10 примерно.
В качестве IP камеры я использую телефон, на который установил приложение "IP Webcam"
28 апр 20, 16:47    [22124318]     Ответить | Цитировать Сообщить модератору
 Re: Почему распознавание лица так медленно работает?  [new]
mayton
Member

Откуда: loopback
Сообщений: 46600
Как вариант. У камер очень сильно разное разрешение.
28 апр 20, 19:14    [22124420]     Ответить | Цитировать Сообщить модератору
 Re: Почему распознавание лица так медленно работает?  [new]
VaneS Ri_lax
Member

Откуда: Русский я
Сообщений: 201
mayton,

Я тоже так подумал, но я пытался выводить frame.imageWidth, frame.imageHeight, показывают один результат, т.е. разрешение одно у двух камер
28 апр 20, 19:51    [22124450]     Ответить | Цитировать Сообщить модератору
 Re: Почему распознавание лица так медленно работает?  [new]
mayton
Member

Откуда: loopback
Сообщений: 46600
Вот ты написал "люто лагает". Это - не инженерный термин. Он - очень эмоциональный
и не дает никакой подсказки для исследования.

Ты знаком с профайлерами? JProfiler? FlightRecorder? Включай их и смотри их отчот.
Обычно показывают 1 строчку где есть задержка.
28 апр 20, 20:19    [22124476]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить