Как изменить размер изображения на панели с помощью OpenImaj

Я использую OpenImaj для проекта, и мне нужно отобразить видео в 800*600 на панели, но я должен захватывать изображения в 1920 1080, когда я нажимаю кнопку.

Первоначально моя стратегия заключалась в том, чтобы сделать снимок с моей веб-камеры в 1920,1080 и изменить размер изображения в виде ярлыка на моей панели Video.

Моя проблема в том, что производительность очень низкая.

Существует ли эффективный способ изменения размера видео в соответствии с размером PanelVideo без изменения размера кадра (который я использую для сохранения изображения в 1920,1080)? Спасибо за ваш ответ. С уважением.

final VideoCapture vc = new VideoCapture(1920,1080);
vc.setFPS(10);
final VideoDisplay<MBFImage> display = VideoDisplay.createVideoDisplay(vc, panelVideo);
display.addVideoListener(new VideoDisplayAdapter<MBFImage>()
                    {
                        @Override
                        public void beforeUpdate(final MBFImage frame)
                        {
                             //here I create a bufferedImage from the resized frame
                                BufferedImage img = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB);
                                Graphics2D g = (Graphics2D) img.getGraphics();
                                g.drawImage(ImageUtilities.createBufferedImageForDisplay(frame), 0, 0, 800, 600, null);

                             //here is the label that I use to display the video
                                labelVideo.setIcon(new ImageIcon(ImageUtilities.createBufferedImageForDisplay(frame)));

                        }
                    });

2 ответа

См. Http://openimaj.org/apidocs/org/openimaj/image/processing/resize/package-frame.html для классов OpenIMAJ, которые позволяют изменить размер MBFImage. Вам придется играть и смотреть, что быстрее, но в своих очень быстрых экспериментах я обнаружил BilinearInterpolation быть лучше чем ResizeProcessor с параметрами по умолчанию, но с использованием другого фильтра в ResizeProcessor может быть быстрее.

Вместо того, чтобы создавать новый BufferedImage В каждом кадре вам, вероятно, лучше будет нарисовать MBFImage в компоненте Swing, который отображает их напрямую: http://openimaj.org/apidocs/org/openimaj/image/DisplayUtilities.ScalingImageComponent.html или http://openimaj.org/apidocs/org/openimaj/image/DisplayUtilities.ImageComponent.html (обратите внимание, что технически они оба преобразуются в BufferedImage за кулисами, но они выделяют изображение только один раз и просто перерисовывают его, что экономит много времени).

Вы можете по крайней мере удалить фиксированный код, подобный этому, из цикла - то есть создать его только один раз.

 //here I create a bufferedImage from the resized frame
 BufferedImage img = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB);
 Graphics2D g = (Graphics2D) img.getGraphics();

а также создать иконку один раз и setImage() по мере необходимости. Кроме того, я не знаю, как конвертировать MBF в BufferedImage, что затрудняет использование различных библиотек. g.drawImage() - это хороший способ нарисовать масштабированное изображение.

Другие вопросы по тегам