ともさんのHP >プロブラミング >USBカメラ+JAVAでスリットカメラ自作 >スリットカメラアプリケーション
スリットカメラアプリケーション
SlitCamera.jarは普通のUSBカメラをソフトウエア的にスリット
カメラ
楽天 にするJavaアプリです。
ダウンロード、使用、改変はご自由になさってください。
サポートはほとんど出来ません。自己責任でお使いください。
2011/2/17ソフトウエアをアップデートしました。画像サイズ固定→
UBSカメラ
楽天 の画像サイズに合わせて可変
スリットカメラアプリの仕様
USBカメラをスリットカメラ、スキャンカメラ(スキャナーのようなもの)として使用するためのソフトウエア。
撮影画像サイズ
USBカメラの横サイズ×USBカメラの縦サイズ(スキャンモード)
USBカメラの横サイズ×可変(スリットモード縦)
可変×USBカメラの縦サイズ(スリットモード横)
必要なもの
パソコン(Windowsのみ動作、画面解像度1280×800以上)
USBカメラ(最近生産されたもの)
撮影速度:30ライン/秒固定(USBカメラの仕様上これ以上早く出来ません)
三脚等カメラを固定するもの
JAVA(SUNのサイトから無料でインストールできます)
JMF(これもSUNのサイトから無料でインストールできます)
アプリケーションソフトSlitCamera.jar こちらでダウンロードします。
スリットカメラアプリの使い方
WINDOWSパソコンに
Java
楽天 とJMFをインストールしておきます。
USBカメラを繋ぎます。
SlitCamera.jarを適当なフォルダにおいてダブルクリックします。
すると下のようなウインドウが開きます。
メニューから撮影したいモードを選び、撮影ボタンを押します。
撮影を開始すると、ウインドウ右側に撮影中の画像が現れ、状態がrun
と表示されます。状態がyetになれば撮影終了。
撮影した画像は、jarファイルを置いたフォルダに作成されます。
画像の形式はjpgで、ファイル名は撮影ボタン楽天 を押した時刻(例:20100430074112.jpg)になります。
また、撮影ボタンを押した瞬間のUSBカメラの普通の画像も (例:20100430074112_.jpg)こんな名前で保存されます。
スリットカメラアプリのソースコード
以下はSlitCamera.javaのソースコードです。
Jikoku.javaのソースコードはこちら
package tomojavalib.usbcamera;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.Buffer;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;
import javax.swing.ButtonGroup;
import javax.swing.Jbutton;
import javax.swing.Jframe;
import javax.swing.Jlabel;
import javax.swing.Jpanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;
public class SlitCamera extends javax.swing.Jframe implements Runnable{
private Jpanel jPanel1;
private Jbutton jButton1;
private Jlabel jLabel1;
private Jpanel jPanel4;
private JRadioButton jRadioButton6;
private Jlabel jLabel2;
private Jpanel jPanel7;
private Jpanel jPanel6;
private JTextField jTextField2;
private Jpanel jPanel5;
private JTextField jTextField1;
private JRadioButton jRadioButton5;
private JRadioButton jRadioButton4;
private JRadioButton jRadioButton3;
private JRadioButton jRadioButton2;
private ButtonGroup buttonGroup1;
private JRadioButton jRadioButton1;
private Jpanel jPanel3;
private Jpanel jPanel2;
Player player = null;
private JScrollPane jScrollPane1;
private JTextField jTextField3;
private Jlabel jLabel3;
private Jpanel jPanel8;
Thread timer;
String selectbutton = null;
java.awt.image.BufferedImage img = null;
public java.awt.image.BufferedImage ssimg = null;
String satueifulug = "yet";
int I;
int xsize,ysize;
String jikoku ="test";
/**
* Auto-generated main method to display this Jframe
*/
public static void main(String[] args) {
//SwingUtilities.invokeLater(new Runnable() {
// public void run() {
SlitCamera inst = new SlitCamera();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
// }
//});
}
public SlitCamera() {
super();
initGUI();
//タイマースタート
timer = new Thread(this);
timer.start();
}
private void initGUI() {
try {
getJScrollPane1().getHorizontalScrollBar().setFocusCycleRoot(false);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
this.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent evt) {
thisWindowClosed(evt);
}
});
{
jPanel1 = new Jpanel();
BorderLayout jPanel1Layout = new BorderLayout();
getContentPane().add(jPanel1, BorderLayout.CENTER);
jPanel1.setLayout(jPanel1Layout);
{
jPanel2 = new Jpanel();
FlowLayout jPanel2Layout = new FlowLayout();
jPanel2Layout.setAlignment(FlowLayout.LEFT);
jPanel1.add(jPanel2, BorderLayout.NORTH);
jPanel2.setLayout(jPanel2Layout);
jPanel2.setPreferredSize(new java.awt.Dimension(1272, 33));
jPanel2.setSize(1280, 33);
{
jButton1 = new Jbutton();
jPanel2.add(jButton1);
jButton1.setText("\u64ae\u5f71");
jButton1.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
jButton1MouseClicked(evt);
}
});
}
{
jRadioButton1 = new JRadioButton();
jPanel2.add(jRadioButton1);
jPanel2.add(getJRadioButton2());
jPanel2.add(getJRadioButton3());
jPanel2.add(getJRadioButton4());
jPanel2.add(getJRadioButton5());
jPanel2.add(getJRadioButton6());
jPanel2.add(getJPanel4());
jPanel2.add(getJPanel5());
jPanel2.add(getJPanel8());
jRadioButton1.setText("\u2192");
jRadioButton1.setSelected(true);
jRadioButton1.setActionCommand("hidari");
getButtonGroup1();
}
}
{
jPanel3 = new Jpanel();
BorderLayout jPanel3Layout = new BorderLayout();
jPanel1.add(jPanel3, BorderLayout.CENTER);
jPanel3.setLayout(jPanel3Layout);
jPanel3.add(getJPanel6(), BorderLayout.WEST);
jPanel3.add(getJScrollPane1(), BorderLayout.CENTER);
}
}
pack();
//setBounds(50, 50, 600,800);
this.setSize(1280, 800);
} catch (Exception e) {
e.printStackTrace();
}
}
private ButtonGroup getButtonGroup1() {
if(buttonGroup1 == null) {
buttonGroup1 = new ButtonGroup();
buttonGroup1.add(jRadioButton1);
buttonGroup1.add(jRadioButton2);
buttonGroup1.add(jRadioButton3);
buttonGroup1.add(jRadioButton4);
buttonGroup1.add(jRadioButton5);
buttonGroup1.add(jRadioButton6);
}
return buttonGroup1;
}
private JRadioButton getJRadioButton2() {
if(jRadioButton2 == null) {
jRadioButton2 = new JRadioButton();
jRadioButton2.setText("\u2190");
jRadioButton2.setActionCommand("migi");
}
return jRadioButton2;
}
private JRadioButton getJRadioButton3() {
if(jRadioButton3 == null) {
jRadioButton3 = new JRadioButton();
jRadioButton3.setText("\u2193");
jRadioButton3.setActionCommand("ue");
}
return jRadioButton3;
}
private JRadioButton getJRadioButton4() {
if(jRadioButton4 == null) {
jRadioButton4 = new JRadioButton();
jRadioButton4.setText("\u2191");
jRadioButton4.setActionCommand("sita");
}
return jRadioButton4;
}
private JRadioButton getJRadioButton5() {
if(jRadioButton5 == null) {
jRadioButton5 = new JRadioButton();
jRadioButton5.setText("\u2503");
jRadioButton5.setActionCommand("tate");
}
return jRadioButton5;
}
private JRadioButton getJRadioButton6() {
if(jRadioButton6 == null) {
jRadioButton6 = new JRadioButton();
jRadioButton6.setText("\u2501");
jRadioButton6.setActionCommand("yoko");
}
return jRadioButton6;
}
private Jpanel getJPanel4() {
if(jPanel4 == null) {
jPanel4 = new Jpanel();
jPanel4.add(getJLabel1());
jPanel4.add(getJTextField1());
}
return jPanel4;
}
private Jlabel getJLabel1() {
if(jLabel1 == null) {
jLabel1 = new Jlabel();
jLabel1.setText("\u5e45");
}
return jLabel1;
}
private JTextField getJTextField1() {
if(jTextField1 == null) {
jTextField1 = new JTextField();
jTextField1.setText("640");
jTextField1.setPreferredSize(new java.awt.Dimension(38, 20));
}
return jTextField1;
}
private Jpanel getJPanel5() {
if(jPanel5 == null) {
jPanel5 = new Jpanel();
jPanel5.add(getJLabel2());
jPanel5.add(getJTextField2());
}
return jPanel5;
}
private Jlabel getJLabel2() {
if(jLabel2 == null) {
jLabel2 = new Jlabel();
jLabel2.setText("\u9ad8");
}
return jLabel2;
}
private JTextField getJTextField2() {
if(jTextField2 == null) {
jTextField2 = new JTextField();
jTextField2.setText("480");
jTextField2.setPreferredSize(new java.awt.Dimension(38, 20));
}
return jTextField2;
}
/**
* usbカメラの起動
*/
public void startCamera()
{
//USBカメラとの接続
try{
player = Manager.createRealizedPlayer(new MediaLocator("vfw://0"));
jPanel6.add(player.getVisualComponent());
player.start();
}catch(Exception e){};
}
private Jpanel getJPanel6() {
if(jPanel6 == null) {
jPanel6 = new Jpanel();
FlowLayout jPanel6Layout = new FlowLayout();
jPanel6Layout.setAlignment(FlowLayout.LEFT);
jPanel6Layout.setHgap(0);
jPanel6Layout.setVgap(0);
jPanel6.setLayout(jPanel6Layout);
jPanel6.setPreferredSize(new java.awt.Dimension(640, 490));
jPanel6.setSize(320, 240);
// jPanel6.setBounds(0, 0, 320, 240);
}
startCamera();
return jPanel6;
}
/**
* 撮影ボタンを押したときの処理
* @param evt
*/
private void jButton1MouseClicked(MouseEvent evt) {
//System.out.println("jButton1.mouseClicked, event="+evt);
//TODO add your code for jButton1.mouseClicked
//ラジオボタン選択の確認
selectbutton = buttonGroup1.getSelection().getActionCommand();
System.out.println( selectbutton );
if(satueifulug.equals("yet")){satueiIni();}
else if(satueifulug.equals("run")){ jTextField3.setText("yet");satueifulug = "yet"; saveJpg( ssimg , jikoku );}
}
/**
* 撮影開始前にデータの初期化を行う
*/
void satueiIni()
{
//現在時刻の文字列を作成
tomojavalib.util.Jikoku j = new tomojavalib.util.Jikoku();
jikoku = j.stringNow();
//通常撮影
satueiNow(jikoku);
i=0;//カウンタ
xsize = 640; ysize = 480;
if( selectbutton.equals( "yoko" ) ){
ysize = Integer.parseInt( jTextField2.getText() );
}
if( selectbutton.equals( "tate" ) ){
xsize = Integer.parseInt( jTextField1.getText() );
}
ssimg = new java.awt.image.BufferedImage( xsize, ysize ,java.awt.image.BufferedImage.TYPE_INT_RGB );
jTextField3.setText("run");
satueifulug = "run";
}
//実行関数
public void run()
{
//無限ループ
do{
// 1/33秒休憩
try{ timer.sleep(30);}catch(InterruptedException e){}
//撮影開始フラグの場合
if( satueifulug.equals("run") ){
i++;
if( selectbutton.equals( "hidari" ) ){
scanHidari( i ); //スキャンモード左からスキャン
}else if( selectbutton.equals( "migi" ) ){
scanMigi( i ); //スキャンモード右からスキャン
}else if( selectbutton.equals( "ue" ) ){
scanUe( i ); //スキャンモード上からスキャン
}else if( selectbutton.equals( "sita" ) ){
scanSita( i ); //スキャンモード下からスキャン
}else if( selectbutton.equals( "tate" ) ){
slitTate( i ); //スキャンモード左からスキャン
}else if( selectbutton.equals( "yoko" ) ){
slitYoko( i ); //スキャンモード左からスキャン
}}
//撮影が終了した場合
if( satueifulug.equals("end") ){
satueifulug = "yet";
jTextField3.setText("yet");
saveJpg( ssimg , jikoku );
}
}while(true);
}
//画像の保存
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(); }
}
/**
* 通常撮影
* @param i
*/
public void satueiNow( String fname )
{
//画像をバファードイメージに入れる
FrameGrabbingControl frameGrabber = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
Buffer buf = frameGrabber.grabFrame();
BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
img = (java.awt.image.BufferedImage) b2i.createImage(buf);
saveJpg( img , fname + "_" );
}
/**
* スリット撮影モード横
* @param i
*/
public void slitYoko(int i)
{
//画像をバファードイメージに入れる
FrameGrabbingControl frameGrabber = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
Buffer buf = frameGrabber.grabFrame();
BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
img = (java.awt.image.BufferedImage) b2i.createImage(buf);
if( img == null){}else{
for(int ii=0;ii<640;ii++)
{
ssimg.setRGB( ii , i-1 , img.getRGB( ii , 240 ) );
}}
jPanel7.getGraphics().drawImage((java.awt.Image)ssimg, 0, 0, java.awt.Color.white, null);
if(i>( ysize - 1 )){
satueifulug = "end";
}
}
/**
* スリット撮影モード縦
* @param i
*/
public void slitTate(int i)
{
//画像をバファードイメージに入れる
FrameGrabbingControl frameGrabber = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
Buffer buf = frameGrabber.grabFrame();
BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
img = (java.awt.image.BufferedImage) b2i.createImage(buf);
if( img == null){}else{
for(int ii=0;ii<480;ii++)
{
ssimg.setRGB( i-1 , ii , img.getRGB( 340 , ii ) );
}}
jPanel7.getGraphics().drawImage((java.awt.Image)ssimg, 0, 0, java.awt.Color.white, null);
if(i>( xsize - 1 )){
satueifulug = "end";
}
}
/**
* スキャンモード撮影上から
* @param i
*/
public void scanUe(int i)
{
//画像をバファードイメージに入れる
FrameGrabbingControl frameGrabber = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
Buffer buf = frameGrabber.grabFrame();
BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
img = (java.awt.image.BufferedImage) b2i.createImage(buf);
if( img == null){}else{
for(int ii=0;ii<640;ii++)
{
ssimg.setRGB(ii,i-1 , img.getRGB(ii, i-1));
}}
jPanel7.getGraphics().drawImage((java.awt.Image)ssimg, 0, 0, java.awt.Color.white, null);
if(i>479){
satueifulug = "end";
}
}
/**
* スキャンモード撮影下から
* @param i
*/
public void scanSita(int i)
{
//画像をバファードイメージに入れる
FrameGrabbingControl frameGrabber = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
Buffer buf = frameGrabber.grabFrame();
BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
img = (java.awt.image.BufferedImage) b2i.createImage(buf);
if( img == null){}else{
for(int ii=0;ii<640;ii++)
{
ssimg.setRGB(ii,480 - i , img.getRGB(ii,480-i));
}}
jPanel7.getGraphics().drawImage((java.awt.Image)ssimg, 0, 0, java.awt.Color.white, null);
if(i>479){
satueifulug = "end";
}
}
/**
* スキャンモード撮影左から
* @param i
*/
public void scanHidari(int i)
{
//画像をバファードイメージに入れる
FrameGrabbingControl frameGrabber = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
Buffer buf = frameGrabber.grabFrame();
BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
img = (java.awt.image.BufferedImage) b2i.createImage(buf);
if( img == null){}else{
for(int ii=0;ii<480;ii++)
{
ssimg.setRGB(i-1,ii , img.getRGB(i-1,ii));
}}
jPanel7.getGraphics().drawImage((java.awt.Image)ssimg, 0, 0, java.awt.Color.white, null);
if(i>639){
satueifulug = "end";
}
}
/**
* スキャンモード撮影右から
* @param i
*/
public void scanMigi(int i)
{
//画像をバファードイメージに入れる
FrameGrabbingControl frameGrabber = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
Buffer buf = frameGrabber.grabFrame();
BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
img = (java.awt.image.BufferedImage) b2i.createImage(buf);
if( img == null){}else{
for(int ii=0;ii<480;ii++)
{
ssimg.setRGB(640-i,ii , img.getRGB(640-i,ii));
}}
jPanel7.getGraphics().drawImage((java.awt.Image)ssimg, 0, 0, java.awt.Color.white, null);
if(i>639){
satueifulug = "end";
}
}
/**
* ウィンドウを閉じるときの処理
* @param evt
*/
private void thisWindowClosed(WindowEvent evt) {
System.out.println("this.windowClosed, event="+evt);
player.close();
}
private Jpanel getJPanel7() {
if(jPanel7 == null) {
jPanel7 = new Jpanel();
jPanel7.setPreferredSize(new java.awt.Dimension(2164, 1998));
jPanel7.setSize(2000, 2000);
jPanel7.setInheritsPopupMenu(true);
}
return jPanel7;
}
private Jpanel getJPanel8() {
if(jPanel8 == null) {
jPanel8 = new Jpanel();
jPanel8.add(getJLabel3());
jPanel8.add(getJTextField3());
}
return jPanel8;
}
private Jlabel getJLabel3() {
if(jLabel3 == null) {
jLabel3 = new Jlabel();
jLabel3.setText("\u72b6\u614b");
}
return jLabel3;
}
private JTextField getJTextField3() {
if(jTextField3 == null) {
jTextField3 = new JTextField();
jTextField3.setPreferredSize(new java.awt.Dimension(28, 20));
jTextField3.setText("yet");
}
return jTextField3;
}
private JScrollPane getJScrollPane1() {
if(jScrollPane1 == null) {
jScrollPane1 = new JScrollPane();
jScrollPane1.setPreferredSize(new java.awt.Dimension(554, 773));
jScrollPane1.setLocation(new java.awt.Point(0, 0));
jScrollPane1.setViewportView(getJPanel7());
}
return jScrollPane1;
}
}
最終更新日: 2017-08-18 07:50:53
ともさんのHP >プロブラミング >USBカメラ+JAVAでスリットカメラ自作 >スリットカメラアプリケーション
ツイート