Processamento de Arquivo de Vídeo
Este exemplo demonstra como utilizar Marvin Framework para processar arquivos de vídeo (wmv, mpeg). O programa abaixo não atualiza os pixels de cor verde, desta forma mudanças na mesa de sinuca são mantidas por múltiplos frames, permitindo a visualização do caminho percorrido pela bola branca. package video.snookerBallPath; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import marvin.gui.MarvinImagePanel; import marvin.image.MarvinImage; import marvin.video.MarvinJavaCVAdapter; import marvin.video.MarvinVideoInterface; import marvin.video.MarvinVideoInterfaceException; public class MediaFileExample extends JFrame implements Runnable{ private MarvinVideoInterface videoAdapter; private MarvinImage imageIn, imageOut, imageBuffer; private MarvinImagePanel videoPanelLeft, videoPanelRight; private static FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER); public MediaFileExample(){ super("Media File Example"); try{ // Create the VideoAdapter used to load the video file videoAdapter = new MarvinJavaCVAdapter(); videoAdapter.loadResource("./res/snooker.wmv"); imageOut = new MarvinImage(videoAdapter.getImageWidth(), videoAdapter.getImageHeight()); imageBuffer = new MarvinImage(videoAdapter.getImageWidth(), videoAdapter.getImageHeight()); // Set up the Graphical User Interface loadGUI(); // Start the thread for requesting the video frames new Thread(this).start(); setSize((videoAdapter.getImageWidth()*2)+10,videoAdapter.getImageHeight()+80); setVisible(true); } catch(MarvinVideoInterfaceException e){ e.printStackTrace(); } } public static void main(String[] args) { MediaFileExample m = new MediaFileExample(); m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @Override public void run() { try{ while(true){ // Request a video frame imageIn = videoAdapter.getFrame(); if(imageIn != null){ // Post the original frame in the left video panel videoPanelLeft.setImage(imageIn); // Image processing processImage(imageIn, imageOut); // Post the processed image in the right video panel videoPanelRight.setImage(imageOut); } else{ break; } try{Thread.sleep(30);}catch(Exception e){} } } catch(MarvinVideoInterfaceException e){ e.printStackTrace(); } } /** * Just buffer every pixels that are not green * @param imgIn * @param imgOut */ int fc=0; private void processImage(MarvinImage imgIn, MarvinImage imgOut){ if(++fc == 8){ for(int y=0; y<imgIn.getHeight(); y++){ for(int x=0; x<imgIn.getWidth(); x++){ int red = imgIn.getIntComponent0(x, y); int green = imgIn.getIntComponent1(x, y); int blue = imgIn.getIntComponent2(x, y); // Is it not green? if (!(green > 120 && green > red * 1.4 && blue < 50)){ imageBuffer.setIntColor(x, y, 255, red, green, blue); } } } fc=0; } for(int y=0; y<imgIn.getHeight(); y++){ for(int x=0; x<imgIn.getWidth(); x++){ if(imageBuffer.getAlphaComponent(x, y) == 255){ imgOut.setIntColor(x, y, imageBuffer.getIntColor(x, y)); } else{ imgOut.setIntColor(x, y, imageIn.getIntColor(x, y)); } } } } private void loadGUI(){ // Create VideoPanel videoPanelLeft = new MarvinImagePanel(); videoPanelRight = new MarvinImagePanel(); setLayout(new BorderLayout()); add(videoPanelLeft, BorderLayout.WEST); add(videoPanelRight, BorderLayout.EAST); // Panel GridLayout grid = new GridLayout(1,2); JPanel panelTop = new JPanel(grid); JPanel p1 = new JPanel(flowLayout); p1.add(new JLabel("ORIGINAL")); JPanel p2 = new JPanel(flowLayout); p2.add(new JLabel("PROCESSED")); panelTop.add(p1); panelTop.add(p2); add(panelTop, BorderLayout.NORTH); } } |
||