ともさんのHP >プロブラミング >自作JavaLibrary >USBカメラをJAVAで制御

USBカメラをJAVAで制御

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

※この記事はだいぶ以前(2007年)に書いたもので、JavaSwingとJMFを使っています。現在(2021年) であれば、OpenCV+ Java 楽天 FXを使うのがよいでしょう。
こちらを参考にされてください。

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

広告

JAVAでUSBカメラを操作するリンク

S_a_k_Uさん

永江孝規研究室@東京工芸大学さん

準備の仕方などは上のリンクをご覧ください。

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で制御

広告
新着ページ

AIを利用し、衣服のデザイン画から型紙を制作する方法  
2つのアパレル3D技術でひらくオーダーメイド生産の手法  
【洋裁型紙】前後身頃の肩の傾きは何故前身頃の方が傾いているのか  
電子追尾式天体写真撮影法  
日本ミツバチ巣箱の種類  
ドラフター(製図台)でソーイング  
日本ミツバチが逃亡  
カメさんの箱庭  
天体用デジタルカメラの構造と天体写真  
Javaで静止画像(Jpeg)を動画(Mov)に変換  
雑草の種を集めています  

他のサイト

3D-CAD
洋裁CAD

いいねなど

 RSS 

Author: Tomoyuki Ito

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