ともさんのHP >プロブラミング >自作JavaLibrary >USBカメラをJAVAで制御
USBカメラをJAVAで制御
USBカメラを使って定期的に撮影したいと思っていたので、JAVAでプログラムを作りました。
※この記事はだいぶ以前(2007年)に書いたもので、JavaSwingとJMFを使っています。現在(2021年)
であれば、OpenCV+
Java
楽天 FXを使うのがよいでしょう。
こちらを参考にされてください。
いつものように見知らぬネット上の諸先輩方に教えていただきました。ありがとうございます。
JAVAでUSBカメラを操作するリンク
準備の仕方などは上のリンクをご覧ください。
UBSカメラ 楽天 をWebに繋いで定点観測をするためのフリーソフトとかもあるようですが、 やはり自分で組んだプログラムの方が融通が利きます。自宅サーバーにつけてWEB カメラ 楽天 にしたり、植物の成長を記録したりと、いろいろ楽しめそうです。
左の画像は実際に撮影したもの。画像の隅に時刻等を入れるようにしました。 Jpg形式で保存すると、左のように字がぼやけてしまいます。 Png形式で保存すれば字はぼやけませんが、ファイルサイズが10倍くらいになります。
朝、出勤する前にプログラムを起動して一日動かしてみました。画像は0.3倍にしてあります。 2枚目に出社を急ぐ私の腹が写っていますが、他には当たり前ですが何にも写っていません。
誰もいない部屋に、お化けとか、ドロボウとか、写っていたら面白かったのですが...
JPG画像をつなげて動画(MOV形式)を作ることも、Javaで出来ます。方法はこちらをご覧ください。
JAVAで自動撮影した画像
JAVAでUSBカメラを自動撮影するためのソースプログラム
下が 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();
}
}
最終更新日: 2021-12-24 04:30:53
ともさんのHP >プロブラミング >自作JavaLibrary >USBカメラをJAVAで制御
ツイート