ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのキャプチャーについて・・・

  • mixiチェック
  • このエントリーをはてなブックマークに追加
首振り機能のカメラで、キャプチャーがどうもうまくいっておらず、
撮影して保存したファイル(test.jpg)が真っ黒になってしまいます。

どうすればカメラのキャプチャー画像をきれいに保存できるか
ご教授ください。><

以下ソースです。


/*******************************************
VCC4パッケージの基本的な使い方
カメラの簡単なリモコン機能(明るさ固定あり)

*******************************************/

import java.awt.*;
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.media.*;
import javax.media.control.*;
import javax.media.format.*;
import javax.media.util.*;
import java.io.IOException;
import vcc4.*;

import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.*;

class CameraControlPanel extends JFrame implements ActionListener{
VCC4Control vcc;
BufferedImage img;

/* ビデオデバイス(カメラ)からキャプチャした動画が入るクラスPlayer */
Player player;

/* ビデオデバイスから取得した画像を格納するためのImageクラス */
Image image = null;

/* 静止画を格納するためのImageクラス */
Image staticImage = null;

JLabel jcamera;//カメラ画像

JButton jbutton1;
JButton jbutton2;
JButton jbutton3;
JButton jbutton4;
JButton jbutton5;
JButton jbutton6;
JButton jbutton7;
JButton jbutton8;
JButton jbutton9;
JButton jbutton10;
JButton jbutton11;
JLabel jlabel1;
JLabel jlabel2;
JSlider jslider1;
JSlider jslider2;
JButton jbutton12;
JButton jbutton13;
JButton jbutton14;//撮影ボタン
JLabel jlabel3;
JLabel jlabel4;

// private ControlParts cp = new ControlParts();
public CameraControlPanel(){
super("CameraControlPanel");

// vcc = new VCC4Control(0, 9600, "COM1");//カメラの初期化処理
vcc = new VCC4Control(0, 9600, "COM3");//カメラの初期化処理


this.setResizable(false);
this.setSize(400, 630);
panel();

this.setVisible(true);

try{
/* JMStudioでチェックできる キャプチャするビデオデバイス(カメラ)の指定をしてプレイヤーを宣言 */
player = Manager.createRealizedPlayer(new MediaLocator("vfw://0"));

/* xボタンが押されたら、プログラムを終了する
** プログラムを終了する時にはビデオデバイスのキャプチャ停止処理を行う必要がある
*/
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
player.close(); // カメラ終了処理
System.exit(0);
}
});

javax.swing.Timer timer = new Timer(20, new ActionListener(){
public void actionPerformed(ActionEvent e){
ImageIcon icon = new ImageIcon();
image = getImage();
repaint();
if(image != null){
icon.setImage(image);
//try{Thread.sleep(5);}catch(Exception ex){}
jcamera.setIcon(icon);
}
}
});
timer.start();

/* 指定したビデオデバイスからのキャプチャを開始 */
player.start();


/* エラー処理 */
} catch(IOException e){
e.printStackTrace();
} catch(NoPlayerException e){
e.printStackTrace();
} catch(CannotRealizeException e){
e.printStackTrace();
}

}

public void panel()
{
getContentPane().setLayout(null);
getContentPane().setSize(320,620);
getContentPane().setForeground(java.awt.Color.black);
getContentPane().setBackground(new Color(255,255,128));

jcamera = new JLabel();
jcamera.setBounds(0, 0, 320,240);

jbutton1 = new JButton("LOCK");
jbutton1.setBounds(12,292,62,27);
jbutton1.setForeground(java.awt.Color.black);
jbutton1.setBackground(new Color(250,199,184));
jbutton1.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton2 = new JButton("FREE");
jbutton2.setBounds(80,291,60,29);
jbutton2.setForeground(java.awt.Color.black);
jbutton2.setBackground(new Color(250,199,184));
jbutton2.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton3 = new JButton("┌");
jbutton3.setBounds(33,331,81,29);
jbutton3.setForeground(java.awt.Color.black);
jbutton3.setBackground(java.awt.Color.orange);
jbutton3.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton4 = new JButton("↑");
jbutton4.setBounds(121,330,81,29);
jbutton4.setForeground(java.awt.Color.black);
jbutton4.setBackground(java.awt.Color.orange);
jbutton4.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton5 = new JButton("┐");
jbutton5.setBounds(208,331,81,29);
jbutton5.setForeground(java.awt.Color.black);
jbutton5.setBackground(java.awt.Color.orange);
jbutton5.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton6 = new JButton("←");
jbutton6.setBounds(33,371,81,29);
jbutton6.setForeground(java.awt.Color.black);
jbutton6.setBackground(java.awt.Color.orange);
jbutton6.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton7 = new JButton("Home");
jbutton7.setBounds(123,372,81,29);
jbutton7.setForeground(java.awt.Color.black);
jbutton7.setBackground(java.awt.Color.orange);
jbutton7.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton8 = new JButton("→");
jbutton8.setBounds(209,372,81,29);
jbutton8.setForeground(java.awt.Color.black);
jbutton8.setBackground(java.awt.Color.orange);
jbutton8.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton9 = new JButton("└");
jbutton9.setBounds(31,412,81,29);
jbutton9.setForeground(java.awt.Color.black);
jbutton9.setBackground(java.awt.Color.orange);
jbutton9.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton10 = new JButton("↓");
jbutton10.setBounds(120,412,81,30);
jbutton10.setForeground(java.awt.Color.black);
jbutton10.setBackground(java.awt.Color.orange);
jbutton10.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton11 = new JButton("┘");
jbutton11.setBounds(213,413,81,28);
jbutton11.setForeground(java.awt.Color.black);
jbutton11.setBackground(java.awt.Color.orange);
jbutton11.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jlabel1 = new JLabel("WhiteBarance",JLabel.LEFT);
jlabel1.setBounds(43,260,89,25);
jlabel1.setForeground(java.awt.Color.black);
jlabel1.setBackground(new Color(255,255,128));
jlabel1.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jlabel2 = new JLabel("AE LOCK",JLabel.LEFT);
jlabel2.setBounds(215,260,63,27);
jlabel2.setForeground(java.awt.Color.black);
jlabel2.setBackground(new Color(255,255,128));
jlabel2.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jslider1 = new JSlider(JSlider.HORIZONTAL,0,80,0);
jslider1.setMajorTickSpacing(10);
jslider1.setMinorTickSpacing(5);
jslider1.setPaintTicks(true);
jslider1.setLabelTable(jslider1.createStandardLabels(10));
jslider1.setPaintLabels(true);
jslider1.setBounds(28,479,266,47);
jslider1.setForeground(new Color(102,102,153));
jslider1.setBackground(new Color(128,255,128));
jslider1.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jslider2 = new JSlider(JSlider.HORIZONTAL,8,800,622);
jslider2.setMajorTickSpacing(400);
jslider2.setMinorTickSpacing(200);
jslider2.setPaintTicks(true);
jslider2.setLabelTable(jslider2.createStandardLabels(192));
jslider2.setPaintLabels(true);
jslider2.setBounds(27,551,268,47);
jslider2.setForeground(new Color(102,102,153));
jslider2.setBackground(new Color(128,255,128));
jslider2.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton12 = new JButton("ON");
jbutton12.setBounds(184,291,58,27);
jbutton12.setForeground(java.awt.Color.black);
jbutton12.setBackground(new Color(250,199,184));
jbutton12.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton13 = new JButton("OFF");
jbutton13.setBounds(247,291,61,27);
jbutton13.setForeground(java.awt.Color.black);
jbutton13.setBackground(new Color(250,199,184));
jbutton13.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jbutton14 = new JButton("撮影");
jbutton14.setBounds(300,291,80,27);
jbutton14.setForeground(java.awt.Color.black);
jbutton14.setBackground(new Color(250,199,184));
jbutton14.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));


jlabel3 = new JLabel("T i l t Zoom W ide",JLabel.LEFT);
jlabel3.setBounds(87,453,133,24);
jlabel3.setForeground(java.awt.Color.black);
jlabel3.setBackground(new Color(255,255,128));
jlabel3.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

jlabel4 = new JLabel("Down Speed UP",JLabel.LEFT);
jlabel4.setBounds(87,529,134,23);
jlabel4.setForeground(java.awt.Color.black);
jlabel4.setBackground(new Color(255,255,128));
jlabel4.setFont(new Font("Dialog",Font.PLAIN | Font.BOLD,12));

getContentPane().add(jcamera);
getContentPane().add(jbutton1);
getContentPane().add(jbutton2);
getContentPane().add(jbutton3);
getContentPane().add(jbutton4);
getContentPane().add(jbutton5);
getContentPane().add(jbutton6);
getContentPane().add(jbutton7);
getContentPane().add(jbutton8);
getContentPane().add(jbutton9);
getContentPane().add(jbutton10);
getContentPane().add(jbutton11);
getContentPane().add(jlabel1);
getContentPane().add(jlabel2);
getContentPane().add(jslider1);
getContentPane().add(jslider2);
getContentPane().add(jbutton12);
getContentPane().add(jbutton13);
getContentPane().add(jbutton14);//撮影用ボタン
getContentPane().add(jlabel3);
getContentPane().add(jlabel4);

jbutton1.addActionListener(this);
jbutton2.addActionListener(this);
jbutton7.addActionListener(this);
jbutton12.addActionListener(this);
jbutton13.addActionListener(this);

jbutton3.addMouseListener(new ML());
jbutton4.addMouseListener(new ML());
jbutton5.addMouseListener(new ML());
jbutton6.addMouseListener(new ML());
jbutton8.addMouseListener(new ML());
jbutton9.addMouseListener(new ML());
jbutton10.addMouseListener(new ML());
jbutton11.addMouseListener(new ML());
jbutton14.addMouseListener(new ML());//撮影用ボタン
jslider1.addMouseListener(new ML());
jslider2.addMouseListener(new ML());
}

//VCC4明るさ固定など
public void actionPerformed(ActionEvent e){
if(e.getSource() == jbutton1){
vcc.wbRock();
}else if(e.getSource() == jbutton2){
vcc.wbNormal();
}else if(e.getSource() == jbutton7){
vcc.home();
}else if(e.getSource() == jbutton12){
vcc.aeRockOn();
}else if(e.getSource() == jbutton13){
vcc.aeRockOff();
}
}

/* プレイヤーからキャプチャした画像を取得し,Imageとして返す */
public Image getImage(){
Image img = null;
FrameGrabbingControl frameGrabber
=(FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");
Buffer buf = frameGrabber.grabFrame();
img =(new BufferToImage((VideoFormat)buf.getFormat()).createImage(buf));

return img;
}

/* Imageがあれば描画する */
public void paint(Graphics g){
if(null != image){
g.drawImage(image, 0, 0, WIDTH, HEIGHT, null);
}
if(null != staticImage){
g.drawImage(staticImage, WIDTH, 0, WIDTH, HEIGHT, null); //(320, 0)を始点にして静止画の描画
}
}

/* 静止画を取得してキャプチャ画像の横に表示する */
public void drawStaticImage(){
/* 表示する領域分フレームのサイズを大きくする */
this.setSize(WIDTH * 2, HEIGHT);

staticImage = getImage(); //キャプチャ画像を取得

repaint(); //描画
}



/*************************************
クラス名:ML
機能:マウスクリックのスイッチonの設定
*************************************/
class ML implements MouseListener {
public void mouseClicked(MouseEvent me){
}
public void mouseEntered(MouseEvent me){
}
public void mouseExited(MouseEvent me){
}
public void mousePressed(MouseEvent me){
//VCC4方向関係(Start)
if(me.getSource() == jbutton3){
vcc.pantiltStartStop(2,1);
}else if(me.getSource() == jbutton4){
vcc.pantiltStartStop(0,1);
}else if(me.getSource() == jbutton5){
vcc.pantiltStartStop(1,1);
}else if(me.getSource() == jbutton6){
vcc.pantiltStartStop(2,0);
}else if(me.getSource() == jbutton8){
vcc.pantiltStartStop(1,0);
}else if(me.getSource() == jbutton9){
vcc.pantiltStartStop(2,2);
}else if(me.getSource() == jbutton10){
vcc.pantiltStartStop(0,2);
}else if(me.getSource() == jbutton11){
vcc.pantiltStartStop(1,2);
}else if(me.getSource() == jbutton14){

vcc.home();//正面を向く
for(int i=0;i<90;i++){
vcc.pantiltStartStop(2,0);//左へ90°回転
}

try{
Thread.sleep(3000); //3秒停止
}catch(InterruptedException e){};

  }

try{

BufferedImage bimg = new BufferedImage(320, 240,image.SCALE_SMOOTH);

String fileName = "test.jpg";
File file = new File(fileName);
ImageIO.write(bimg, "jpg", file);

}catch (Exception e) { e.printStackTrace(); }

vcc.home();//正面を向く


}
public void mouseReleased(MouseEvent me){
//VCC4方向関係(Stop)
if(me.getSource() == jbutton3){
vcc.pantiltStartStop(0,0);
}else if(me.getSource() == jbutton4){
vcc.pantiltStartStop(0,0);
}else if(me.getSource() == jbutton5){
vcc.pantiltStartStop(0,0);
}else if(me.getSource() == jbutton6){
vcc.pantiltStartStop(0,0);
}else if(me.getSource() == jbutton8){
vcc.pantiltStartStop(0,0);
}else if(me.getSource() == jbutton9){
vcc.pantiltStartStop(0,0);
}else if(me.getSource() == jbutton10){
vcc.pantiltStartStop(0,0);
}else if(me.getSource() == jbutton11){
vcc.pantiltStartStop(0,0);
//VCC4スピードとズーム関係
}else if(me.getSource() == jslider1){
int val = jslider1.getValue();
vcc.zoomSet1(val);
}else if(me.getSource() == jslider2){
int val = jslider2.getValue();
vcc.panSpSet(val);
vcc.tiltSpSet(Math.min(val, 622));
}
}
}

public static void main(String[] args){
CameraControlPanel m = new CameraControlPanel();
GetImageSample sample3 = new GetImageSample();
//Thread.sleep(5000); //カメラの準備ができるまで5秒(適当)待つ
sample3.drawStaticImage();
}
}

コメント(4)

尚、サンプル画像を撮影できるソースは以下です。
このソースから必要なところを持ってこれば実現できるとのことでしたが、
うまくいきません。
よろしくお願いします。ぴかぴか(新しい)

/** JMFサンプル3
*** カメラからのプレビュー画像を表示するだけのサンプルプログラム その3
*** 1枚だけ静止画を取得して動画の隣に表示してみる
**/

import javax.media.*;
import javax.media.control.*;
import javax.media.format.*;
import javax.media.util.*;
import java.io.IOException;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;

public class GetImageSample extends JFrame {
/* ビデオデバイス(カメラ)からキャプチャした動画が入るクラスPlayer */
Player player;

/* ビデオデバイスから取得した画像を格納するためのImageクラス */
Image image = null;
/* 静止画を格納するためのImageクラス */
Image staticImage = null;

/* 表示する画像のサイズ */
final static int WIDTH = 320;
final static int HEIGHT = 240;

public GetImageSample(){
super("ImagePreview"); //アプリケーションに名前を付ける

try{
/* JMStudioでチェックできる キャプチャするビデオデバイス(カメラ)の指定をしてプレイヤーを宣言 */
player = Manager.createRealizedPlayer(new MediaLocator("vfw://0"));

/* 表示フレームの設定 */
this.setSize(WIDTH, HEIGHT); //サイズの指定
//this.getContentPane().add(player.getVisualComponent()); //今回は直接プレビューを置かない
this.setVisible(true); //フレームの表示

/* 20ミリ秒ごと(適当)にアクションが呼び出されるクラスを生成
** 20ミリ秒ごと(適当)にキャプチャを行うメソッドを呼び出し画像を更新する
*/
Timer timer = new Timer(20, new ActionListener(){
public void actionPerformed(ActionEvent e){
image = getImage();
repaint();
}
});
timer.start();

/* 指定したビデオデバイスからのキャプチャを開始 */
player.start();

/* xボタンが押されたら、プログラムを終了する
** プログラムを終了する時にはビデオデバイスのキャプチャ停止処理を行う必要がある
*/
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
player.close(); // カメラ終了処理
System.exit(0);
}
});

/* エラー処理 */
} catch(IOException e){
e.printStackTrace();
} catch(NoPlayerException e){
e.printStackTrace();
} catch(CannotRealizeException e){
e.printStackTrace();
}
}

/* プレイヤーからキャプチャした画像を取得し,Imageとして返す */
public Image getImage(){
Image img = null;
FrameGrabbingControl frameGrabber
=(FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");
Buffer buf = frameGrabber.grabFrame();
img =(new BufferToImage((VideoFormat)buf.getFormat()).createImage(buf));

return img;
}

/* Imageがあれば描画する */
public void paint(Graphics g){
if(null != image){
g.drawImage(image, 0, 0, WIDTH, HEIGHT, null);
}
if(null != staticImage){
g.drawImage(staticImage, WIDTH, 0, WIDTH, HEIGHT, null); //(320, 0)を始点にして静止画の描画
}
}

/* 静止画を取得してキャプチャ画像の横に表示する */
public void drawStaticImage(){
/* 表示する領域分フレームのサイズを大きくする */
this.setSize(WIDTH * 2, HEIGHT);

staticImage = getImage(); //キャプチャ画像を取得

repaint(); //描画
}

public static void main(String args[]) throws Exception {
GetImageSample sample3 = new GetImageSample();
Thread.sleep(5000); //カメラの準備ができるまで5秒(適当)待つ
sample3.drawStaticImage();
}
}
これは授業の課題なので、
>他人の作ったプログラムなら本人に・・・
先生のことになります。
もちろん先生は教えてはくれません。
なのでここで質問させて貰いました。ふらふら

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング