ともさんのHP >プロブラミング >USBカメラ+JAVAでスリットカメラ自作 >スリットカメラアプリケーション

スリットカメラアプリケーション

SlitCamera.jarは普通のUSBカメラをソフトウエア的にスリット カメラ 楽天 にするJavaアプリです。
ダウンロード、使用、改変はご自由になさってください。
サポートはほとんど出来ません。自己責任でお使いください。あしからず。

2011/2/17ソフトウエアをアップデートしました。画像サイズ固定→ UBSカメラ 楽天 の画像サイズに合わせて可変

スリットカメラアプリの仕様

USBカメラをスリットカメラ、スキャンカメラ(スキャナーのようなもの)として使用するためのソフトウエア。
撮影画像サイズ
 USBカメラの横サイズ×USBカメラの縦サイズ(スキャンモード)
 USBカメラの横サイズ×可変(スリットモード縦)
 可変×USBカメラの縦サイズ(スリットモード横)

広告

必要なもの
パソコン(Windowsのみ動作、画面解像度1280×800以上)
USBカメラ(最近生産されたもの)
撮影速度:30ライン/秒固定(USBカメラの仕様上これ以上早く出来ません)
三脚等カメラを固定するもの
JAVA無料でインストールできます。普通はすでにPCにインストールされていると思います。
JMFこちらにインストール方法を書いておきました。
アプリケーションソフトSlitCamera.jar こちらでダウンロードします。


スリットカメラアプリの使い方

WINDOWSパソコンに Java 楽天 とJMFをインストールしておきます。
USBカメラを繋ぎます。
SlitCamera.jarを適当なフォルダにおいてダブルクリックします。
すると下のようなウインドウが開きます。
スリットカメラ撮影ソフト


メニューから撮影したいモードを選び、撮影ボタンを押します。 スリットカメラ撮影ソフト


撮影を開始すると、ウインドウ右側に撮影中の画像が現れ、状態がrun と表示されます。状態がyetになれば撮影終了。
撮影した画像は、jarファイルを置いたフォルダに作成されます。
画像の形式はjpgで、ファイル名は撮影ボタン楽天 を押した時刻(例:20100430074112.jpg)になります。
また、撮影ボタンを押した瞬間のUSBカメラの普通の画像も (例:20100430074112_.jpg)こんな名前で保存されます。



スリットカメラアプリのソースコード

以下はSlitCamera.javaのソースコードです。
Jikoku.javaのソースコードはこちら


package tomojavalib.usbcamera;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.media.Buffer;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;
import javax.swing.ButtonGroup;
import javax.swing.Jbutton;
import javax.swing.Jframe;
import javax.swing.Jlabel;
import javax.swing.Jpanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;


public class SlitCamera extends javax.swing.Jframe implements Runnable{
    private Jpanel jPanel1;
    private Jbutton jButton1;
    private Jlabel jLabel1;
    private Jpanel jPanel4;
    private JRadioButton jRadioButton6;
    private Jlabel jLabel2;
    private Jpanel jPanel7;
    private Jpanel jPanel6;
    private JTextField jTextField2;
    private Jpanel jPanel5;
    private JTextField jTextField1;
    private JRadioButton jRadioButton5;
    private JRadioButton jRadioButton4;
    private JRadioButton jRadioButton3;
    private JRadioButton jRadioButton2;
    private ButtonGroup buttonGroup1;
    private JRadioButton jRadioButton1;
    private Jpanel jPanel3;
    private Jpanel jPanel2;
     Player player = null;
     private JScrollPane jScrollPane1;
     private JTextField jTextField3;
     private Jlabel jLabel3;
     private Jpanel jPanel8;
     Thread timer;
     String selectbutton = null;
     java.awt.image.BufferedImage img = null;
     public java.awt.image.BufferedImage ssimg = null;
     String satueifulug = "yet";
     int I;
     int xsize,ysize;
     String jikoku ="test";
     
    /**
    * Auto-generated main method to display this Jframe
    */
    public static void main(String[] args) {
         //SwingUtilities.invokeLater(new Runnable() {
         //     public void run() {
                   SlitCamera inst = new SlitCamera();
                   inst.setLocationRelativeTo(null);
                   inst.setVisible(true);
         //     }
         //});
    }
    
    public SlitCamera() {
         super();
         initGUI();
          //タイマースタート
          timer = new Thread(this);
          timer.start();
    }
    
    private void initGUI() {
         try {
              getJScrollPane1().getHorizontalScrollBar().setFocusCycleRoot(false);
              setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
              this.addWindowListener(new WindowAdapter() {
                   public void windowClosed(WindowEvent evt) {
                        thisWindowClosed(evt);
                   }
              });
              {
                   jPanel1 = new Jpanel();
                   BorderLayout jPanel1Layout = new BorderLayout();
                   getContentPane().add(jPanel1, BorderLayout.CENTER);
                   jPanel1.setLayout(jPanel1Layout);
                   {
                        jPanel2 = new Jpanel();
                        FlowLayout jPanel2Layout = new FlowLayout();
                        jPanel2Layout.setAlignment(FlowLayout.LEFT);
                        jPanel1.add(jPanel2, BorderLayout.NORTH);
                        jPanel2.setLayout(jPanel2Layout);
                        jPanel2.setPreferredSize(new java.awt.Dimension(1272, 33));
                        jPanel2.setSize(1280, 33);
                        {
                             jButton1 = new Jbutton();
                             jPanel2.add(jButton1);
                             jButton1.setText("\u64ae\u5f71");
                             jButton1.addMouseListener(new MouseAdapter() {
                                  public void mouseClicked(MouseEvent evt) {
                                       jButton1MouseClicked(evt);
                                  }
                             });
                        }
                        {
                             jRadioButton1 = new JRadioButton();
                             jPanel2.add(jRadioButton1);
                             jPanel2.add(getJRadioButton2());
                             jPanel2.add(getJRadioButton3());
                             jPanel2.add(getJRadioButton4());
                             jPanel2.add(getJRadioButton5());
                             jPanel2.add(getJRadioButton6());
                             jPanel2.add(getJPanel4());
                             jPanel2.add(getJPanel5());
                             jPanel2.add(getJPanel8());
                             jRadioButton1.setText("\u2192");
                             jRadioButton1.setSelected(true);
                             jRadioButton1.setActionCommand("hidari");
                             getButtonGroup1();
                        }
                   }
                   {
                        jPanel3 = new Jpanel();
                        BorderLayout jPanel3Layout = new BorderLayout();
                        jPanel1.add(jPanel3, BorderLayout.CENTER);
                        jPanel3.setLayout(jPanel3Layout);
                        jPanel3.add(getJPanel6(), BorderLayout.WEST);
                        jPanel3.add(getJScrollPane1(), BorderLayout.CENTER);

                   }
              }
              pack();
              //setBounds(50, 50, 600,800);
              this.setSize(1280, 800);
         } catch (Exception e) {
              e.printStackTrace();
         }
    }
    
    private ButtonGroup getButtonGroup1() {
         if(buttonGroup1 == null) {
              buttonGroup1 = new ButtonGroup();
              buttonGroup1.add(jRadioButton1);
              buttonGroup1.add(jRadioButton2);
              buttonGroup1.add(jRadioButton3);
              buttonGroup1.add(jRadioButton4);
              buttonGroup1.add(jRadioButton5);
              buttonGroup1.add(jRadioButton6);
         }
         return buttonGroup1;
    }
    
    private JRadioButton getJRadioButton2() {
         if(jRadioButton2 == null) {
              jRadioButton2 = new JRadioButton();
              jRadioButton2.setText("\u2190");
              jRadioButton2.setActionCommand("migi");
         }
         return jRadioButton2;
    }
    
    private JRadioButton getJRadioButton3() {
         if(jRadioButton3 == null) {
              jRadioButton3 = new JRadioButton();
              jRadioButton3.setText("\u2193");
              jRadioButton3.setActionCommand("ue");
         }
         return jRadioButton3;
    }
    
    private JRadioButton getJRadioButton4() {
         if(jRadioButton4 == null) {
              jRadioButton4 = new JRadioButton();
              jRadioButton4.setText("\u2191");
              jRadioButton4.setActionCommand("sita");
         }
         return jRadioButton4;
    }
    
    private JRadioButton getJRadioButton5() {
         if(jRadioButton5 == null) {
              jRadioButton5 = new JRadioButton();
              jRadioButton5.setText("\u2503");
              jRadioButton5.setActionCommand("tate");
         }
         return jRadioButton5;
    }
    
    private JRadioButton getJRadioButton6() {
         if(jRadioButton6 == null) {
              jRadioButton6 = new JRadioButton();
              jRadioButton6.setText("\u2501");
              jRadioButton6.setActionCommand("yoko");
         }
         return jRadioButton6;
    }
    
    private Jpanel getJPanel4() {
         if(jPanel4 == null) {
              jPanel4 = new Jpanel();
              jPanel4.add(getJLabel1());
              jPanel4.add(getJTextField1());
         }
         return jPanel4;
    }
    
    private Jlabel getJLabel1() {
         if(jLabel1 == null) {
              jLabel1 = new Jlabel();
              jLabel1.setText("\u5e45");
         }
         return jLabel1;
    }
    
    private JTextField getJTextField1() {
         if(jTextField1 == null) {
              jTextField1 = new JTextField();
              jTextField1.setText("640");
              jTextField1.setPreferredSize(new java.awt.Dimension(38, 20));
         }
         return jTextField1;
    }
    
    private Jpanel getJPanel5() {
         if(jPanel5 == null) {
              jPanel5 = new Jpanel();
              jPanel5.add(getJLabel2());
              jPanel5.add(getJTextField2());
         }
         return jPanel5;
    }
    
    private Jlabel getJLabel2() {
         if(jLabel2 == null) {
              jLabel2 = new Jlabel();
              jLabel2.setText("\u9ad8");
         }
         return jLabel2;
    }
    
    private JTextField getJTextField2() {
         if(jTextField2 == null) {
              jTextField2 = new JTextField();
              jTextField2.setText("480");
              jTextField2.setPreferredSize(new java.awt.Dimension(38, 20));
         }
         return jTextField2;
    }

    /**
     * usbカメラの起動
     */
    public void startCamera()
    {
         //USBカメラとの接続
         try{
        player = Manager.createRealizedPlayer(new MediaLocator("vfw://0"));
        jPanel6.add(player.getVisualComponent());
        player.start();
         }catch(Exception e){};
    }
    
    private Jpanel getJPanel6() {
         if(jPanel6 == null) {
              jPanel6 = new Jpanel();
              FlowLayout jPanel6Layout = new FlowLayout();
              jPanel6Layout.setAlignment(FlowLayout.LEFT);
              jPanel6Layout.setHgap(0);
              jPanel6Layout.setVgap(0);
              jPanel6.setLayout(jPanel6Layout);
              jPanel6.setPreferredSize(new java.awt.Dimension(640, 490));
              jPanel6.setSize(320, 240);
//               jPanel6.setBounds(0, 0, 320, 240);
         }
         startCamera();
         return jPanel6;
    }
    
    /**
     * 撮影ボタンを押したときの処理
     * @param evt
     */
    private void jButton1MouseClicked(MouseEvent evt) {
         //System.out.println("jButton1.mouseClicked, event="+evt);
         //TODO add your code for jButton1.mouseClicked
         //ラジオボタン選択の確認
         selectbutton = buttonGroup1.getSelection().getActionCommand();
          System.out.println( selectbutton );
          if(satueifulug.equals("yet")){satueiIni();}
          else if(satueifulug.equals("run")){ jTextField3.setText("yet");satueifulug = "yet"; saveJpg( ssimg , jikoku );}
    }
    
    /**
     * 撮影開始前にデータの初期化を行う
     */
    void satueiIni()
    {
         //現在時刻の文字列を作成
         tomojavalib.util.Jikoku j = new tomojavalib.util.Jikoku();
         jikoku = j.stringNow();     
         //通常撮影
         satueiNow(jikoku);
         i=0;//カウンタ
         xsize = 640; ysize = 480;
         if( selectbutton.equals( "yoko" ) ){
              ysize =  Integer.parseInt( jTextField2.getText() );
         }
         if( selectbutton.equals( "tate" ) ){
              xsize =  Integer.parseInt( jTextField1.getText() );
         }
         ssimg = new java.awt.image.BufferedImage( xsize, ysize ,java.awt.image.BufferedImage.TYPE_INT_RGB );          
         jTextField3.setText("run");
         satueifulug = "run";
    }

    //実行関数
    public void run()
    {
            
         //無限ループ
          do{
               // 1/33秒休憩
               try{ timer.sleep(30);}catch(InterruptedException e){}
               //撮影開始フラグの場合
               if( satueifulug.equals("run") ){
               i++;
               if( selectbutton.equals( "hidari" ) ){
                    scanHidari( i ); //スキャンモード左からスキャン
               }else  if( selectbutton.equals( "migi" ) ){
                    scanMigi( i ); //スキャンモード右からスキャン               
               }else  if( selectbutton.equals( "ue" ) ){
                    scanUe( i ); //スキャンモード上からスキャン
               }else  if( selectbutton.equals( "sita" ) ){
                    scanSita( i ); //スキャンモード下からスキャン
               }else  if( selectbutton.equals( "tate" ) ){
                    slitTate( i ); //スキャンモード左からスキャン
               }else  if( selectbutton.equals( "yoko" ) ){
                    slitYoko( i ); //スキャンモード左からスキャン
               }}
               //撮影が終了した場合
               if( satueifulug.equals("end") ){
                    satueifulug = "yet";
                    jTextField3.setText("yet");
                    saveJpg( ssimg , jikoku );
               }
          }while(true);

    }

    //画像の保存
    public void saveJpg(java.awt.image.BufferedImage ssimg ,String fname )
    {
    try {
          java.io.File f = new java.io.File( fname + ".jpg" );
          javax.imageio.ImageIO.write( ssimg , "jpg", f );
          f=null;
         }catch (Exception e) {  e.printStackTrace(); }
    }     
    
    /**
     * 通常撮影
     * @param i
     */
    public void satueiNow( String fname ) 
    {
         //画像をバファードイメージに入れる
        FrameGrabbingControl frameGrabber  = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
        Buffer buf = frameGrabber.grabFrame();
        BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
        img = (java.awt.image.BufferedImage) b2i.createImage(buf);
        saveJpg( img , fname + "_" );
    }     
    
    /**
     * スリット撮影モード横
     * @param i
     */
    public void slitYoko(int i)
    {
         //画像をバファードイメージに入れる
        FrameGrabbingControl frameGrabber  = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
        Buffer buf = frameGrabber.grabFrame();
        BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
        img = (java.awt.image.BufferedImage) b2i.createImage(buf);
         if( img == null){}else{
        for(int ii=0;ii<640;ii++)
             {
                  ssimg.setRGB( ii , i-1 , img.getRGB( ii , 240 ) );
             }}
        
         jPanel7.getGraphics().drawImage((java.awt.Image)ssimg, 0, 0, java.awt.Color.white, null);
         if(i>( ysize - 1 )){
              satueifulug = "end";
         }
    }     
    
    
    /**
     * スリット撮影モード縦
     * @param i
     */
    public void slitTate(int i)
    {
         //画像をバファードイメージに入れる
        FrameGrabbingControl frameGrabber  = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
        Buffer buf = frameGrabber.grabFrame();
        BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
        img = (java.awt.image.BufferedImage) b2i.createImage(buf);
         if( img == null){}else{
        for(int ii=0;ii<480;ii++)
             {
                  ssimg.setRGB( i-1 , ii , img.getRGB( 340 , ii ) );
             }}
        
         jPanel7.getGraphics().drawImage((java.awt.Image)ssimg, 0, 0, java.awt.Color.white, null);
         if(i>( xsize - 1 )){
              satueifulug = "end";
         }
    }
    
    /**
     * スキャンモード撮影上から
     * @param i
     */
    public void scanUe(int i)
    {
         //画像をバファードイメージに入れる
        FrameGrabbingControl frameGrabber  = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
        Buffer buf = frameGrabber.grabFrame();
        BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
        img = (java.awt.image.BufferedImage) b2i.createImage(buf);
         if( img == null){}else{
        for(int ii=0;ii<640;ii++)
             {
                  ssimg.setRGB(ii,i-1 , img.getRGB(ii, i-1));
             }}
        
         jPanel7.getGraphics().drawImage((java.awt.Image)ssimg, 0, 0, java.awt.Color.white, null);
         if(i>479){
              satueifulug = "end";
         }
    }
         
    /**
     * スキャンモード撮影下から
     * @param i
     */
    public void scanSita(int i)
    {
         //画像をバファードイメージに入れる
        FrameGrabbingControl frameGrabber  = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
        Buffer buf = frameGrabber.grabFrame();
        BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
        img = (java.awt.image.BufferedImage) b2i.createImage(buf);
         if( img == null){}else{
        for(int ii=0;ii<640;ii++)
             {
                  ssimg.setRGB(ii,480 - i , img.getRGB(ii,480-i));
             }}
        
         jPanel7.getGraphics().drawImage((java.awt.Image)ssimg, 0, 0, java.awt.Color.white, null);
         if(i>479){
              satueifulug = "end";
         }
    }          

    /**
     * スキャンモード撮影左から
     * @param i
     */
    public void scanHidari(int i)
    {
         //画像をバファードイメージに入れる
        FrameGrabbingControl frameGrabber  = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
        Buffer buf = frameGrabber.grabFrame();
        BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
        img = (java.awt.image.BufferedImage) b2i.createImage(buf);
         if( img == null){}else{
        for(int ii=0;ii<480;ii++)
             {
                  ssimg.setRGB(i-1,ii , img.getRGB(i-1,ii));
             }}
        
         jPanel7.getGraphics().drawImage((java.awt.Image)ssimg, 0, 0, java.awt.Color.white, null);
         if(i>639){
              satueifulug = "end";
         }
    }          
    
    /**
     * スキャンモード撮影右から
     * @param i
     */
    public void scanMigi(int i)
    {
         //画像をバファードイメージに入れる
        FrameGrabbingControl frameGrabber  = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
        Buffer buf = frameGrabber.grabFrame();
        BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
        img = (java.awt.image.BufferedImage) b2i.createImage(buf);
         if( img == null){}else{
        for(int ii=0;ii<480;ii++)
             {
                  ssimg.setRGB(640-i,ii , img.getRGB(640-i,ii));
             }}
        
         jPanel7.getGraphics().drawImage((java.awt.Image)ssimg, 0, 0, java.awt.Color.white, null);
         if(i>639){
              satueifulug = "end";
         }
    }          
    
    
    
    /**

広告

     * ウィンドウを閉じるときの処理
     * @param evt
     */
    private void thisWindowClosed(WindowEvent evt) {
         System.out.println("this.windowClosed, event="+evt);
         player.close();
    }
    
    private Jpanel getJPanel7() {
         if(jPanel7 == null) {
              jPanel7 = new Jpanel();
              jPanel7.setPreferredSize(new java.awt.Dimension(2164, 1998));
              jPanel7.setSize(2000, 2000);
              jPanel7.setInheritsPopupMenu(true);
         }
         return jPanel7;
    }
    
    private Jpanel getJPanel8() {
         if(jPanel8 == null) {
              jPanel8 = new Jpanel();
              jPanel8.add(getJLabel3());
              jPanel8.add(getJTextField3());
         }
         return jPanel8;
    }
    
    private Jlabel getJLabel3() {
         if(jLabel3 == null) {
              jLabel3 = new Jlabel();
              jLabel3.setText("\u72b6\u614b");
         }
         return jLabel3;
    }
    
    private JTextField getJTextField3() {
         if(jTextField3 == null) {
              jTextField3 = new JTextField();
              jTextField3.setPreferredSize(new java.awt.Dimension(28, 20));
              jTextField3.setText("yet");
         }
         return jTextField3;
    }
    
    private JScrollPane getJScrollPane1() {
         if(jScrollPane1 == null) {
              jScrollPane1 = new JScrollPane();
              jScrollPane1.setPreferredSize(new java.awt.Dimension(554, 773));
              jScrollPane1.setLocation(new java.awt.Point(0, 0));
              jScrollPane1.setViewportView(getJPanel7());
         }
         return jScrollPane1;
    }

}

最終更新日: 2014-04-18 06:11:47

ともさんのHP >プロブラミング >USBカメラ+JAVAでスリットカメラ自作 >スリットカメラアプリケーション

このエントリーをはてなブックマークに追加
広告
おすすめ記事
新着ページ

ウエスト切り替えワンピースの作りかた  
気象観測装置を作りました  
五右衛門風呂の修復  
子ウインドウを開く  
キキョウの栽培、手入れ、増やしかた  
ツリービューにポップアップメニューを追加  
JavaFXでPopupMenu  
竹を曲げる方法  
井戸保護カバーの自作  
ルピナスの栽培、手入れ、増やしかた  
アメリカンホック  

私の他のサイト

ともさんの箱庭(ブログ)
家庭菜園
3D-CAD
洋裁CAD

いいねなど

 RSS 
PageSpeedInsights
html5チェック

Author: Tomoyuki Ito

このサイトの文章・写真の無断転載を禁じます