Как изменить размер изображения на панели с помощью 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() - это хороший способ нарисовать масштабированное изображение.