ともさんのHP >プロブラミング >USBカメラをJAVAで制御して定点観測 >定点観測カメラソフトの作成-その2
定点観測カメラソフトの作成-その2
前回作成したプログラムでは、
10分ごとに定点撮影を行い、画像を6×8ピクセルの小さな画像に変換し、データベースに保存しました。
本来の目的はこの画像を1年分の大きな画像に順番に貼り付けて並べ、
時刻や天候、季節による色の変化を見てみようというものでした。
今回作成するプログラムはその大きな画像を作成してHPにアップします。
作業の流れはこんな感じ。
1 データベースから保存された小さな画像データを読み込む。
2 大きな画像に小さな画像を順番に貼り付けてモザイク画像を作成
3 HPにUPする。
まず、データベースからデーターを読み込むプログラムを作ってみましょう。
前回同様、ともさんのJavaライブラリを利用します。
下記は画像情報を保存したデータベースにアクセスし、全てのデータを取得し、
表示するプログラムです。
package tomojavalib.usbcamera;
import tomojavalib.comm.DbsComm;
public class MakeMozaic {
String gdata[][] ;//データベースから受取るデータの入れ物
DbsComm dbc ; //データベース
/**
* IntTakePicで作成、DBSに保存された小さな画像を順番に並べ、大きな一枚のモザイク画像を作成する。
* @param args
*/
public static void main(String[] args) {
MakeMozaic mmc = new MakeMozaic();
mmc.gdata = mmc.getData();
for(int i= 0;i<mmc.dbc.datano;i++)
{
System.out.println( i + " " + mmc.gdata[i][0] + " " + mmc.gdata[i][1]);
}
}
/**
* 初期設定
*/
public MakeMozaic()
{
//データベースの準備
String dbs = "teiten86";
String member[] = { "mmsec" , "iro" , "holder" };
dbc = new DbsComm( dbs , member );
}
/**
* データベースから全てのデータを受取る
* @return
*/
public String[][] getData()
{
//
try{
dbc.getAll();
}catch (Exception e){ e.printStackTrace(); }
return dbc.data;
}
}
データベースには撮影した時間(2010/1/1 00:00:00からの経過ミリ秒)と画像情報が入っています。
時間を元に、大きな画像のどの位置に小さな画像を置けばよいのかを計算してみましょう。
大きな画像には1年分の小さな画像を敷き詰めます左上の隅は2010/1/1 00:00:00に撮影された画像、
反対の右下隅は2010/12/31 23:50:00に撮影した画像が入ります。10分ごとの撮影なので、横には画像が144枚、
縦には1年の日付数365枚が並びます。
では、ある特定の時刻mmsec(2010/1/1 00:00:00からの経過ミリ秒)に撮影された画像がどこに当てはまるのか、tX,tYを計算してみましょう。
tYは日数分ですので、mmsecを1日のミリ秒で割り、少数点以下を捨てることで算出できます。
int ty = (int)( mmsec / 86400000. );
tXはmmsecからy日分のミリ秒を引いたあまりを10分分のミリ秒数(60000)で割り、少数点以下を捨てることで算出できます。
int tx = (int)( ( mmsec - (long)ty * 86400000 ) / 60000. );
大きな画像の中に、6×8ピクセルの小さな画像を所定の位置においてゆきます。
下記の記述を追記しました。
public java.awt.image.BufferedImage img = null;//作成する画像
private int w = 8; //はめ込む画像の幅
private int h = 6; //はめ込む画像の高さ
private int x = 144*w; // モザイク画像の幅
private int y = 365*h; // モザイク画像の高さ
public void make( String savefilename )
{
//大画像の大きさ設定
img =new java.awt.image.BufferedImage( x , y , java.awt.image.BufferedImage.TYPE_INT_RGB );
java.awt.Graphics g = img.getGraphics() ;
g.setColor( Color.DARK_GRAY);
g.fillRect(0, 0, x, y);
for(int i = 0 ; i < gdatal; i++ )
{
//小画像位置の計算
long mmsec = Long.parseLong( gdata[i][0] );
int ty = (int)( mmsec / 86400000. );
int tx = (int)( ( mmsec - (long)ty * 86400000 ) / 600000. );
//System.out.println(tx + " " + ty + "" );
//小画像のはめ込み
int si = 8;
for(int iy=0 ; iy < h ;iy++)
{
for(int ix=0 ; ix < w ;ix++)
{
img.setRGB( tx*w+ix , ty*h+iy, Integer.parseInt( (gdata[i][1].substring(si,si+6)) , 16 ) );
si = si + 6;
}
}
}
}
この後、BufferedImageの大画像をJpgファイルに変換して保存します。(下記)
try {
java.io.File f = new java.io.File( savefilename );
javax.imageio.ImageIO.write( img , "jpg", f );
}catch (Exception e) { e.printStackTrace(); }
最後にHPにUPするのですが、私のHPの場合、家のパソコンがWEBサーバーなので、ファイルコピーだけで終了します。
このMakeMozaicクラスは最終的に先に作成したIntTakePicクラスから毎時呼び出してモザイク画像の更新をするように設定しました。
package tomojavalib.usbcamera;
import java.awt.Color;
import tomojavalib.comm.DbsComm;
public class MakeMozaic {
String gdata[][] ;//データベースから受取るデータの入れ物
int gdatal;//受取ったデータの数
DbsComm dbc ; //データベース
public java.awt.image.BufferedImage img = null;//作成する画像
private int w = 8; //はめ込む画像の幅
private int h = 6; //はめ込む画像の高さ
private int x = 144*w; // モザイク画像の幅
private int y = 365*h; // モザイク画像の高さ
/**
* IntTakePicで作成、DBSに保存された小さな画像を順番に並べ、大きな一枚のモザイク画像を作成する。
* @param args
*/
public static void main(String[] args) {
MakeMozaic mmc = new MakeMozaic();
mmc.getData();
//for(int i= 0;i<mmc.dbc.datano;i++) { System.out.println( i + " " + mmc.gdata[i][0] + " " + mmc.gdata[i][1]); }
mmc.make( "tomo-teiten-img.jpg" );
}
/**
* モザイク画像の作成
*/
public void make( String savefilename )
{
//大画像の大きさ設定
img =new java.awt.image.BufferedImage( x , y , java.awt.image.BufferedImage.TYPE_INT_RGB );
java.awt.Graphics g = img.getGraphics() ;
g.setColor( Color.DARK_GRAY);
g.fillRect(0, 0, x, y);
for(int i = 0 ; i < gdatal; i++ )
{
//小画像位置の計算
long mmsec = Long.parseLong( gdata[i][0] );
int ty = (int)( mmsec / 86400000. );
int tx = (int)( ( mmsec - (long)ty * 86400000 ) / 600000. );
//System.out.println(tx + " " + ty + "" );
//小画像のはめ込み
int si = 8;
for(int iy=0 ; iy < h ;iy++)
{
for(int ix=0 ; ix < w ;ix++)
{
img.setRGB( tx*w+ix , ty*h+iy, Integer.parseInt( (gdata[i][1].substring(si,si+6)) , 16 ) );
si = si + 6;
}
}
}
//画像の保存
try {
java.io.File f = new java.io.File( savefilename );
javax.imageio.ImageIO.write( img , "jpg", f );
}catch (Exception e) { e.printStackTrace(); }
}
/**
* 初期設定
*/
public MakeMozaic()
{
//データベースの準備
String dbs = "teiten86";
String member[] = { "mmsec" , "iro" , "holder" };
dbc = new DbsComm( dbs , member );
}
/**
* データベースから全てのデータを受取る
* @return
*/
public void getData()
{
//
try{
dbc.getAll();
}catch (Exception e){ e.printStackTrace(); }
gdata = dbc.data;
gdatal = dbc.datano;
return;
}
}
で、自動作成されるモザイク画像は下記のようになります(大きいので無駄な部分はカットしました)。
こちらが1時間ごとに更新される定点観測結果の画像になります。
とりあえずは1年間継続して撮影してみたいと思ってます。
さて、どんな画像が出来あがるでしょうか?たのしみです。
最終更新日: 2010-04-20 00:00:00
ともさんのHP >プロブラミング >USBカメラをJAVAで制御して定点観測 >定点観測カメラソフトの作成-その2
ツイート