2011-12-14 22 views
1

Javaで「クロマキー」エフェクトを実装できるライブラリも必要です。ビデオには、新しいビデオを作成するために、レンダリング中にピクチャと置き換えられる緑色の部分が含まれています。Javaのクロマキー効果

私はすでに答えた同様の質問ではなくuncomplete答え(Looking for Chromakey library in Java)と私の質問をリンクしています。あなたは何かをしてすぐに働くためにどのようにしたのですか?私は同じ問題と戦って数ヶ月失敗しました。

  • JavaCV
  • あなたのための仕事をした1 JAI(Javaの高度な画像処理API)
  • のJava画像処理クックブック
    • c00kiemon5terには、いくつかのリソースを指摘しましたか?

    +1

    '私はすでに答えた同様の質問ではなくuncomplete answer.'で私の質問をリンクしています。私はそのようなリンクを見ません。 –

    +0

    申し訳ありませんが、私は両方の質問をリンクする方法を知らなかった。最後に私は体の中にリンクを追加しました。 –

    +2

    [Chromakey library in Java](http://stackoverflow.com/questions/7283861/looking-for-chromakey-library-in-java) –

    答えて

    0

    JavaCVは、ビデオストリームを処理する方法の多くが含まれています。

    このコードは、あなたが始める必要があります。http://tech.groups.yahoo.com/group/OpenCV/message/59118が、それはおそらく、Javaであまりにも遅いです。このアプローチを試してみてください:

    マスクにすべての緑のピクセルをオンフィルタを作成します(「色で選ぶ」というものを探してください)。

    マスクを使用して背景画像をビデオにコピーします。

    +0

    申し訳ありませんAaron、私はそれを行う方法がわかりません。いくつかのコードの抜粋やリンクは、利用可能であれば評価されるでしょう。 –

    +1

    申し訳ありません。あなたは数時間を自分で投資しなければなりません。 –

    0

    私は私にかなり良い結果が得られたコードの一部に貢献したいと思います。私はAaron Digullaが提案したクラスとメソッドを使用したのだろうかと思います。

    は、私は、背景画像と黒の色を交換しています理由です、このケースでは、私のビデオは、黒の背景を持っていることに注意してください。ビデオの主な文字の中で黒い色が使用され、間違ったピクセルを置き換えるとかなりひどい効果が生じるので、私は緑色の背景を持つようにビデオを編集することができます。

    -

    package transparentvideo; 
    
    import java.awt.BorderLayout; 
    import java.awt.Color; 
    import java.awt.Component; 
    import java.awt.Container; 
    import java.awt.Dimension; 
    import java.awt.Graphics2D; 
    import java.awt.Image; 
    import java.awt.Rectangle; 
    import java.awt.Toolkit; 
    import java.awt.image.BufferedImage; 
    import java.awt.image.FilteredImageSource; 
    import java.awt.image.ImageFilter; 
    import java.awt.image.ImageProducer; 
    import java.awt.image.RGBImageFilter; 
    import java.io.File; 
    import javax.media.Manager; 
    import javax.media.Player; 
    import javax.swing.ImageIcon; 
    import javax.swing.JComponent; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 
    
    
    public class TransparentVideo 
    { 
    Player mediaPlayer; 
    
    JFrame invisibleFrame; 
    JFrame visibleFrame; 
    JLabel videoScreen; 
    JPanel offScreenVideo; 
    
    String backgroundImageFile="nature.jpg"; 
    
    String videoFile="girl.mov"; 
    
    public TransparentVideo() 
    { 
    
        invisibleFrame = new JFrame(); 
    
        invisibleFrame.setSize(400, 400); 
    
        Container container=invisibleFrame.getContentPane(); 
        offScreenVideo = getvidComp(); 
        offScreenVideo.setPreferredSize(container.getSize()); 
        offScreenVideo.setVisible(true); 
    
        container.add(offScreenVideo); 
        invisibleFrame.setVisible(true); 
    
        visibleFrame=new JFrame(); 
        visibleFrame.setSize(container.getSize()); 
        visibleFrame.setLocationRelativeTo(null); 
    
        videoScreen = new JLabel(); 
    
        visibleFrame.getContentPane().add(videoScreen); 
    
        visibleFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        visibleFrame.setVisible(true); 
    
        invisibleFrame.setVisible(false); 
    
        try 
        { 
         while(true) 
         { 
    
          if(mediaPlayer.getState()==Player.Started) 
           reDraw(); 
          Thread.sleep(100); 
         } 
        } 
        catch (Exception ex) 
        { 
         System.out.println(ex.getMessage()); 
        } 
    } 
    
    
    public void reDraw() 
    { 
         BufferedImage bi=new BufferedImage(videoScreen.getWidth(), videoScreen.getHeight(), 
           BufferedImage.TYPE_INT_ARGB); 
    
         bi.getGraphics().drawImage(new ImageIcon(backgroundImageFile).getImage(), 0 , 0 , 
           videoScreen.getWidth(), videoScreen.getHeight(), null); 
    
         BufferedImage screenShot = createImage((JComponent) offScreenVideo, 
           new Rectangle(invisibleFrame.getBounds())); 
         Image im = makeColorTransparent(new ImageIcon(screenShot).getImage(), Color.BLACK); 
    
         bi.getGraphics().drawImage(im, 0 ,0 , videoScreen.getWidth(), videoScreen.getHeight(), null); 
    
         videoScreen.setIcon(new ImageIcon(bi)); 
    
    } 
    
    
    
    public static BufferedImage createImage(Component component, Rectangle region) 
    { 
    
        if (!component.isDisplayable()) { 
         Dimension d = component.getSize(); 
    
         if (d.width == 0 || d.height == 0) { 
          d = component.getPreferredSize(); 
          component.setSize(d); 
         } 
    
         layoutComponent(component); 
        } 
    
        BufferedImage image = new BufferedImage(region.width, region.height, BufferedImage.TYPE_INT_RGB); 
        Graphics2D g2d = image.createGraphics(); 
    
        if (!component.isOpaque()) 
        { 
         g2d.setColor(component.getBackground()); 
         g2d.fillRect(region.x, region.y, region.width, region.height); 
        } 
    
        g2d.translate(-region.x, -region.y); 
        component.paint(g2d); 
        g2d.dispose(); 
        return image; 
    } 
    
    
    public static void layoutComponent(Component component) 
    { 
        synchronized (component.getTreeLock()) 
        { 
         component.doLayout(); 
    
         if (component instanceof Container) 
         { 
          for (Component child : ((Container) component).getComponents()) 
          { 
           layoutComponent(child); 
          } 
         } 
        } 
    } 
    
    
    public JPanel getvidComp() 
    { 
    
         Manager.setHint(Manager.LIGHTWEIGHT_RENDERER,true); 
    
         try 
         { 
          mediaPlayer = Manager.createRealizedPlayer(new File(videoFile).toURL()); 
    
          mediaPlayer.realize(); 
    
          mediaPlayer.prefetch(); 
    
          JPanel video=new JPanel(new BorderLayout()); 
          video.add(mediaPlayer.getVisualComponent()) ; 
    
          mediaPlayer.start(); 
    
          return video; 
    
         } 
    
         catch(Exception d) 
         { 
          return null; 
    
         } 
    } 
    
    
    
    public static Image makeColorTransparent(Image im, final Color color) 
    { 
        ImageFilter filter = new RGBImageFilter() 
        { 
          public int markerRGB = color.getRGB() | 0xFF000000; 
    
    
          public final int filterRGB(int x, int y, int rgb) 
          { 
           Color c=new Color(rgb); 
    
           int red=c.getRed(); 
           int green=c.getGreen(); 
           int blue=c.getBlue(); 
    
           //if(red<140 && green<140 && blue<140) 
           { 
            int alpha=Math.max(Math.max(red , green), Math.max(green, blue))*3; 
            c=new Color(red , green , blue , alpha>255 ?255 :alpha); 
           } 
    
           return c.getRGB(); 
          } 
         }; 
    
        ImageProducer ip = new FilteredImageSource(im.getSource(), filter); 
        return Toolkit.getDefaultToolkit().createImage(ip); 
    } 
    
    
    public static void main(String[] args) { 
        new TransparentVideo(); 
    } 
    
    }