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

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

Javaの課題丸投げコミュのカメラに自動追尾機能を追加したいです><

  • mixiチェック
  • このエントリーをはてなブックマークに追加
Canonのカメラ(VC-C50i)を使って防犯カメラのシステムを作ろうという課題です。
基本操作は↓のソースです。ここに追加で人の感知と自動追尾して動画を撮る(5秒程)といった機能を追加したいですが、システムのSampleなどがないのでお手上げです。どなたかSampleソースなど参考になるものがありましたらお願いします☆
/*******************************************
VCC4パッケージの基本的な使い方
カメラの簡単なリモコン機能(明るさ固定あり)
by okushiro
Special thanks Konasan
*******************************************/

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.*;

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

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

/* ビデオデバイスから取得した画像を格納するためのImageクラス */
Image image = 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;
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(320, 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();
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));

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(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());
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;
}

/*************************************
クラス名: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);
}
}
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();
}
}

コメント(5)

いや、別にあげなくても見えてるから。
ただ課題が抽象的過ぎるんじゃないの?
カメラ制御はサンプルにあるとして、人物検出ってどうやるの?
アルゴリズムから考えろといわれても手法はいろいろあるし、それぞれ複雑だよ。

一応大学時代は顔認識関係携わっていたからある程度はアドバイスできると思うけど、まず人物の何を認識すればいいわけ?
動き?顔?全身?
動きなら単純に2枚のフレームの差分を出せばいいだけだし(もちろんこの場合だと人間が動いたのかそれ以外が動いたのかわからないけど)、顔なら肌色検出かhaar-likeかな。全身検出の場合もhaar-likeが一番ポピュラーではないかな。
普通顔検出とか扱えるライブラリうとしたらopenCVがメジャーだと思うけど、C++用だからね。
一応調べてみた感じだと下のURLではjavaで使えるようにしてるみたい。
http://d.hatena.ne.jp/iad_otomamay/20080927/p1
あまり詳しく見ていないけど顔検出しているみたいだし参考になるのでは?

とりあえず課題解決にはなってないし、課題を解くというコミュの趣旨とは外れてしまったけどアドバイスです。
参考になれば幸いです。
無駄なコメントであげた挙句、追加情報なしじゃ解けんがな。
機能によっては時間があるときにできるところまで実装しようかと思ってたんだがなぁ。
もう解決したのかな。

まぁ、追加でアドバイスとして、自動追尾も自分で考えないといけないのだったら、思いついてるかもしれないけど、検出した人がフレームの真ん中に来るようにカメラを動かせばいいと思う。
現在の人の位置から次の位置を予測して、またフィードバックする形でいいと思う。
まぁ、ぱっと思いつきだから早々うまくいくとは思えないけど。

たぶんサンプル関係はJavaで探すよりC/C++のほうが豊富だと思うからそれをJavaに置き換えて実装する感じで作っていくほうが簡単だと思う。
いろいろとアドバイスありがとうございます☆
Sampleソース見つかったので、ひとまずいけそうです。
ありがとうございました〜ぴかぴか(新しい)

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

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

Javaの課題丸投げ 更新情報

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

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

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