USBカメラをJAVAで制御

USBカメラ を使って定期的に撮影したいと思っていたので、 JAVA で作ってみました。

いつものように見知らぬ諸先輩方に教えていただきました。ありがとうございます。

S_a_k_Uさん

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

USBカメラをJAVAで制御

  • ともさん
  • ソーイング
  • ものつくり
  • みつばち
  • 気象
  • 電子工作
  • デジタルカメラ
  • ともさんの開発室
  • プロブラミング
  • ものつくり
  • リホーム
  • 食べ物作り
  • JAVALibrary
  • 1
  • このページは「ともさん」が個人的に運営しています。

    RSS配信しています

    Yahoo!ブックマークに登録

    My Yahoo!に追加

    - リンク -
    ともさんブログ
    おデブとふつうの分水嶺 そんなに食うなら走らないと

    Contact me
    da

    null