USBカメラ を使って定期的に撮影したいと思っていたので、 JAVA で作ってみました。
いつものように見知らぬ諸先輩方に教えていただきました。ありがとうございます。
準備の仕方などは上のリンクをご覧ください。
USB カメラ をWebに繋いで定点観測をするためのフリーソフトとかもあるようですが、 やはり自分で組んだ プログラム の方が融通が利きます。自宅サーバーにつけてWEBカメラ にしたり、植物の成長を記録したりと、いろいろ楽しめそうです。
左の画像は実際に撮影したもの。画像の隅に時刻等を入れるようにしました。
Jpg形式で保存すると、左のように字がぼやけてしまいます。
Png形式で保存すれば字はぼやけませんが、ファイルサイズが10倍くらいになります。
朝、出勤する前にプログラムを起動して一日動かしてみました。画像は0.3倍にしてあります。 2枚目に出社を急ぐ私の腹が写っていますが、他には当たり前ですが何にも写っていません。
この写真を確認する前に、「何かヘンな写っているのでは」と少しだけ不安を感じました。
ともさんは19歳まで霊感があったので、この世に得体の知れないものがあることは知っているつもり です。
「JPG画像を拡大縮小するにはどうすればいいの?」という方はこちら をご覧ください
下がJAVAのソースファイルです。
10分毎にUSBカメラの画像を読み込んで、画像に文字を挿入し、 時刻-撮影番号を示すファイル名でJPGファイル化して保存するように書いてあります。
| import javax.media.*; import javax.media.control.FrameGrabbingControl; import javax.media.format.VideoFormat; import javax.media.util.BufferToImage; import javax.swing.*; import java.awt.*; import java.util.*;
public class test implements Runnable{ Thread timer; Image img = null; java.awt.image.BufferedImage ssimg = null; JFrame frame =null; Player player = null;
public test() { ini(); }
public void ini() { //USBカメラとの接続 try{ frame = new JFrame("USB-Camera"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); player = Manager.createRealizedPlayer(new MediaLocator("vfw://0")); frame.setBounds(50, 50, 320, 240); frame.getContentPane().add(player.getVisualComponent()); frame.setVisible(true); player.start(); }catch(Exception e){}; //タイマースタート timer = new Thread(this); timer.start();
}
// 実行関数 public void run() { //カウンタ int i=0;
//無限ループ do{ //600秒休憩 try{ timer.sleep(600000);}catch(InterruptedException e){} i++; //画像をバファードイメージに入れる FrameGrabbingControl frameGrabber = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl"); Buffer buf = frameGrabber.grabFrame(); BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat()); img = b2i.createImage(buf); ssimg = new java.awt.image.BufferedImage( 320, 240 ,img.SCALE_SMOOTH ); Graphics g = null; g = ssimg.getGraphics() ; g.drawImage(img, 0, 0, Color.white, null) ;
//保存ファイル名の作成 String fname = ""+i; while(true){if( fname.length() < 5){ fname = "0" + fname; }else{break;}} fname = "Date"+CalendarToString()+"-No"+ fname;
//画像に文字を記入 g.setColor( java.awt.Color.red ); g.drawString( fname , 5 , 235 );
//ファイルに保存 // savePng(ssimg,fname); saveJpg(ssimg,fname); saveJpg(ssimg,"image"); // System.exit(0); }while(true); }
//PNG形式で保存 public void savePng(java.awt.image.BufferedImage ssimg ,String fname ) { try { java.io.File f = new java.io.File( fname + ".png" ); javax.imageio.ImageIO.write( ssimg , "png", f ); f=null; }catch (Exception e) { e.printStackTrace(); } }
//JPG形式で保存 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(); } }
//現在の時刻を示す文字列を作成 public String CalendarToString() { String stmp = ""; Calendar c = Calendar.getInstance(); //一時使用カレンダの作成 int yr = c.get(Calendar.YEAR); int mn = c.get(Calendar.MONTH); int dy = c.get(Calendar.DATE); int hr = c.get(Calendar.HOUR_OF_DAY); int min = c.get(Calendar.MINUTE); int sec= c.get(Calendar.SECOND); String nowstring = Integer.toString(yr); stmp = Integer.toString( mn+1 ); if( stmp.length() < 2){ stmp = "0" + stmp; } nowstring = nowstring + stmp; stmp = Integer.toString( dy ); if( stmp.length() < 2){ stmp = "0" + stmp; } nowstring = nowstring + stmp; stmp = Integer.toString( hr ); if( stmp.length() < 2){ stmp = "0" + stmp; } nowstring = nowstring + stmp; stmp = Integer.toString( min ); if( stmp.length() < 2){ stmp = "0" + stmp; } nowstring = nowstring + stmp; stmp = Integer.toString( sec ); if( stmp.length() < 2){ stmp = "0" + stmp; } nowstring = nowstring + stmp; //+Integer.toString(dy) // +Integer.toString(hr)+Integer.toString(min)+Integer.toString(sec); c= null; return nowstring; }
public static void main(String args[]) throws Exception { test t = new test(); }
} |
作成日: 2007-06-05 00:00:00
このページは「ともさん」が個人的に運営しています。