0

我在一个项目中使用 OpenImaj,我需要将 800*600 的视频显示到面板上,但是当我单击按钮时,我必须在 1920,1080 处捕获图像。

我的策略最初是在 1920,1080 处从我的网络摄像头捕获图像,并在我的 panelVideo 中包含的标签图标中调整图像大小。

我的问题是性能非常低。

有没有一种有效的方法可以根据 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)));

                        }
                    });
4

2 回答 2

0

有关可让您调整 MBFImage 大小的 OpenIMAJ 类,请参阅http://openimaj.org/apidocs/org/openimaj/image/processing/resize/package-frame.html 。你必须玩,看看什么是最快的,但在我非常快速的实验中,我发现BilinearInterpolation它比ResizeProcessor使用默认选项更好,但是使用不同的过滤器ResizeProcessor可能会更快。

与其创建一个新的BufferedImage每一帧,不如将 MBFImage 绘制到一个直接显示它们的 Swing 组件中: http: //openimaj.org/apidocs/org/openimaj/image/DisplayUtilities.ScalingImageComponent.htmlhttp: //openimaj.org/apidocs/org/openimaj/image/DisplayUtilities.ImageComponent.html(请注意,从技术上讲,它们都转换为BufferedImage幕后,但它们只分配一次图像,然后重新绘制到其中节省大量时间)。

于 2016-01-12T08:12:57.833 回答
0

您至少可以从循环中删除这样的固定代码 - 即只创建一次

 //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() 是绘制缩放图像的好方法。

于 2016-01-11T12:08:54.817 回答