Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

QRコードをwebカメラで取り込んで。。。

現在javaを勉強中です。研究でwebカメラからQRコードを認識して、自動でデコードしてくれるシステムを構築したいのですが、プログラムが動いてくれません。
プログラムは引継ぎで受け取ったので自分で作っていません。
とりあえずプログラムを見て頂きたいので乗せます。
アドバイス宜しくお願いします。
package example;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.imageio.ImageIO;
import javax.media.*;
import javax.media.control.*;
import javax.media.format.*;
import javax.media.util.*;
import java.awt.image.*;

import jp.sourceforge.qrcode.codec.QRCodeDecoder;
import jp.sourceforge.qrcode.codec.data.QRCodeImage;
import jp.sourceforge.qrcode.codec.exception.DecodingFailedException;
import jp.sourceforge.qrcode.codec.exception.InvalidVersionInfoException;

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;

import java.util.*;
import java.text.*;
import java.io.*;

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


public class WebQR extends JPanel{
    QRCodeDecoder decoder;
    Player player;
    static Image img1 = null;
    static BufferedImage img2 = null;
    static BufferedImage change_image;
    static BufferedImage change_image2;
    static int params[]  = null;
        
    static Image tmp2 = null;
    static int check = 0;  
    public boolean result = false;

    public static void main(String[] args) {

        //Panel
        JFrame frame = new JFrame("Capture from WebCam");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(300, 300, 320, 240);
        frame.getContentPane().add(new WebQR());
        frame.setVisible(true);
            
    }


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


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


    public WebQR(){

        System.out.println("trying...");
    
        try {
            player = Manager.createRealizedPlayer(new MediaLocator("vfw://0"));    //vfw = Video For Windows
        } catch(Exception e){
            System.out.println(e);
            System.exit(1);
        }
            
        new javax.swing.Timer(100, new ActionListener(){
            public void actionPerformed(ActionEvent e){
                grab_proc();
                repaint();
            }
        }).start();
        player.start();



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


        new javax.swing.Timer(500, new ActionListener(){
            public void actionPerformed(ActionEvent e){

                if(check  == 1){
                try {
                    
                    QRCodeDecoder decoder = new QRCodeDecoder();
                    
                    String decodedData = new String(decoder.decode(new J2SEImage(img2)));
                    System.out.println("img2 = "+decodedData);

                    try {
                        result = ImageIO.write(img2, "jpeg", new File("img2.jpg"));
                        } catch (Exception exception) {
                        result = false;
                        }
                
                        }catch(DecodingFailedException dfe){
                            System.out.println("miss " + dfe.getMessage());
                        }catch (IllegalStateException ise) {
                            System.out.println("failed");            
                            }
                        
                try {
                    conv_img(0);        
                    QRCodeDecoder decoder = new QRCodeDecoder();
                    String decodedData = new String(decoder.decode(new J2SEImage(change_image)));
                    System.out.println("imgC = "+decodedData);

                    try {
                        result = ImageIO.write(change_image, "jpeg", new File("change_image.1jpg"));
                        } catch (Exception exception) {
                        result = false;
                        }
                        
                }catch(DecodingFailedException dfe){
                System.out.println("miss " + dfe.getMessage());
                }catch (IllegalStateException ise) {
                System.out.println("failed");            
                }

                try {
                    conv_img2();        

                    try {
                        result = ImageIO.write(change_image2, "jpeg", new File("change_image2.jpg"));
                        } catch (Exception exception) {
                        result = false;
                        }

                    QRCodeDecoder decoder = new QRCodeDecoder();
                    String decodedData = new String(decoder.decode(new J2SEImage(change_image2)));
                    System.out.println("imgD = "+decodedData);
            
                }catch(DecodingFailedException dfe){
                System.out.println("miss " + dfe.getMessage());
                }catch (IllegalStateException ise) {
                System.out.println("failed");            
                }
                
                
                }
                }
        }).start();
    
        }


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


    void grab_proc(){
        FrameGrabbingControl frameGrabber
            =(FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");
        Buffer buf = frameGrabber.grabFrame();
        img1 = (new BufferToImage((VideoFormat)buf.getFormat()).createImage(buf));

        tmp2 = img1;
        if(tmp2 != null){
        img2= new BufferedImage(tmp2.getWidth(null), tmp2.getHeight(null), BufferedImage.TYPE_INT_RGB);
        Graphics tmp_g = img2.createGraphics();
        tmp_g.drawImage(tmp2,0,0,null);
        check = 1;
        }
    }


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

//    0...判別分析法による二値化
//    1...Pタイル法による二値化
    void conv_img(int how_i_doing){
        change_image = img2;
        
        int img_width = img2.getWidth(this);
        int img_height = img2.getHeight(this);    
                
        int gray[][] = new int[img_width][img_height];
        
        int hist[] = new int[255];
        int sum = 0, num = 0;
        int t, max_t=0, t_limit,n1, n2,i,j;
        long tmp;
        double ave , ave1, ave2, var1,var2, max, var_w, var_b,rr;
        
        t_limit = 255;
        
        //ヒストグラムの初期化
        for(i = 0;i<255;i++)
            hist[i] = 0;
        
        //輝度の計算
        for(i = 0;i < img2.getHeight(this);i++){
            for(j = 0;j < img2.getWidth(this);j++){
        
                int rgb = img2.getRGB(j,i);
                rgb = 0-rgb;
                int b = rgb%256;
                rgb >>= 8;
                int g = rgb%256;
                rgb >>= 8;
                int r = rgb%256;
                
                int Lumi = (int)((0.299*r + 0.587*g + 0.114*b));
                gray[j][i] = Lumi;
                hist[Lumi]++;
                sum+=Lumi;
                num++;
            }
        }
        
        ave = sum/(img_width*img_height);
        
        //判別分析法による閾値の計算
        if(how_i_doing == 0){
        max = -1.0;
        for( t = 0; t < t_limit; t++ ) {
            n1 = n2 = 0;
            ave1 = ave2 = 0;
            var1 = var2 = 0;
            tmp= 0;
            
            for( i = 0; i < t; i++ ) {
                n1 += hist[i];
                tmp += hist[i]*i;
            }
            
            if ( n1 != 0 )
                ave1 =  (double)tmp / (double)n1;

            for( i = 0; i < t; i++ )
                var1 += (i-ave1)*(i-ave1)*hist[i];

            if ( n1 != 0 )
                var1 = var1/(double)n1;

            tmp = 0;
            for( i = t; i < t_limit; i++ ) {
            n2 += hist[i];
            tmp += hist[i]*i;
            }
            
            if ( n2 != 0 ) 
                ave2 = (double)tmp / (double)n2;

            for( i = t; i < t_limit; i++ )
                        var2 += (i-ave2)*(i-ave2)*hist[i];
            
            if ( n2 != 0 )
                var2 = var2/(double)n2;

            var_w = (n1*var1 + n2*var2);
            var_b = n1*(ave1-ave)*(ave1-ave) + n2*(ave2-ave)*(ave2-ave);
            rr  = var_b / var_w;
            if ( rr > max ) {
                max = rr;
                max_t = t;
                }
            }
        }
        
        //Pタイル法による閾値の計算
        if(how_i_doing == 1){
            sum = 0;
            
            for(i = 254;(140*140) > sum;i--)
                        sum += hist[i];

            max_t = i;
            
        }
        
        //二値化の実行
        for(i = 0;i < img2.getHeight(this);i++){
            for(j = 0;j < img2.getWidth(this);j++){
                
                if(gray[j][i] > max_t)
                        change_image.setRGB(j,i,(0 << 16)|(0 << 8)| 0);
                else
                        change_image.setRGB(j,i,(255 << 16)|(255 << 8)| 255);
                
            }
        }
        
}


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

    void conv_img2(){
        change_image2 = img2;
        
        int img_width = img2.getWidth(this);
        int img_height = img2.getHeight(this);    
                
        int gray[][] = new int[img_width][img_height];
        
        int hist[] = new int[255];
        int sum = 0, num = 0;
        int max_t=0,i,j;
        
        //ヒストグラムの初期化
        for(i = 0;i<255;i++)
            hist[i] = 0;
        
        //輝度の計算
        for(i = 0;i < img2.getHeight(this);i++){
            for(j = 0;j < img2.getWidth(this);j++){
        
                int rgb = img2.getRGB(j,i);
                rgb = 0-rgb;
                int b = rgb%256;
                rgb >>= 8;
                int g = rgb%256;
                rgb >>= 8;
                int r = rgb%256;
                
                int Lumi = (int)((0.299*r + 0.587*g + 0.114*b));
                gray[j][i] = Lumi;
                hist[Lumi]++;
                sum+=Lumi;
                num++;
            }
        }
        
            sum = 0;

            for(i = 254;(140*140) > sum;i--)
                        sum += hist[i];

            max_t = i;
            
        
        
        //二値化の実行
        for(i = 0;i < img2.getHeight(this);i++){
            for(j = 0;j < img2.getWidth(this);j++){
                
                if(gray[j][i] > max_t)
                        change_image2.setRGB(j,i,(0 << 16)|(0 << 8)| 0);
                else
                        change_image2.setRGB(j,i,(255 << 16)|(255 << 8)| 255);
                
            }
        }
        
}



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


    public void paint(Graphics g){
        if(null == img1) return;
        g.drawImage(img1, 0, 0, getWidth(), getHeight(), null);
    }
}


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


class J2SEImage implements QRCodeImage {
    BufferedImage image=null;

    public J2SEImage(BufferedImage img) {
        this.image = img;
    }

    public int getWidth() {
        return image.getWidth();
    }

    public int getHeight() {
        return image.getHeight();
    }

    public int getPixel(int x, int y) {
        return image.getRGB(x, y);
    }

}


//

18

回答

4135

閲覧

18件の回答

評価

0

> アドバイス宜しくお願いします。

どこまで動作の解析が出来てて、どこがわからないかぐらい書きましょうよー。
丸投げと見えますよ、これじゃ。

評価

0

流石に長すぎて読む気しないな。
デバッグしてくれる人が現れるといいね

評価

0

ざっと見ました。

>アドバイス宜しくお願いします。
汚いソースコードですね。
できれば、UIとモデルは分離しましょう。
そのうえで、局所的に質問すれば、回答がつくかもしれません。
そうでないと、これに回答する人はUI,モデルすべてのソースを追わないといけなくなります。

JFrameの起動、System.exit()呼び出し位置、変数の宣言、コードの記述等々、つっこみどころが多々あります。
率直な感想として、プロが書いたコードとはとても思えませんので、学生の方の研究だと思いたいです。
->JAVAの文法やプログラミングの作法を理解しているとは思えません。先を急ぐのであれば、まずJAVAの基本的なところから勉強してください。

あとは、" "さんの
>どこまで動作の解析が出来てて、どこがわからないかぐらい書きましょうよー。
と同意見です。

評価

0

大変時間が過ぎてしまい申し訳ありません。
返答ありがとうございました。
全然手をつけることが出来なかったのですが、やっとコンパイルまで行うことが出来ました。しかしclassファイルをコマンドプロンプトで実行したいのですが、NoClassDefFoundErrorが出てしまいます。
QRディレクトリにjpとexampleがあり構造は下のようになっております。
jp
|-sourceforge
 |-qrcode
  |-codec
   |-QRcodeDecoder.java
  |
  |-data--------------QRCodesymbol.java
    |                |--QRCodeImage.java
    |
  |-ecc---------------BCH15_5.java
    |                |--ReedSolomon.java 
    |
    |-exception
    |      |-AlignmentPatternNotFoundException.java
    |      |-DecodingFailedException.java
    |      |-FinderPatternNotFoundException.java
    |      |-InvalidDataBlockException.java
    |      |-InvalidVersionException.java
    |      |-InvalidVersionInfoException.java
    |      |-SymbolNotFoundException.java
    |      |-VersionInformationException.java
    |
    |-reader--pattern-----Logicalseed.java
    |            |        |-FinderPattern.java
    |            |        |-AlignmentPattern.java
    |            |-QRCodeDataBlockReader.java
    |            |-QRCodeImageReader.java 
    |
    |-geom---------------Axis.java
        |              |-Line.java
        |              |-Point.java
        |              |-SamplingGrid.java
        |
        |-utill--------Color.java
                     |-ContentCoverter.java
                     |-DebugCanvas.java
                     |-DebugCanvasAdapter.java
                     |-QRcodeUtility.java

example----------WebQR.java
                  |-cheak.java
                  |-MAME.java
                  |-hoge.java

\QR\example>set CLASSPATH=\QR
\QR\example>javac WebQR.java
でコンパイルはできましたが

¥QR> java example/WebQR

\QR\example>java WebQR
と打ち込みますが実行できません。
コンパイルは成功したと思いますし、classファイルはそれぞれ存在します。
class pathの問題でしょうか?

評価

0

>と打ち込みますが実行できません。

エラーが出るのか、全く反応がないのかくらい併記していただけないと、プログラム上の不具合なのか、そもそもJAVAVMが動かせていないのか、パスが通っていないだけなのか判断できません。

実行できないについて詳しく説明してください。

評価

0

ご回答ありがとうございます。下のようなエラーが出て、実行できません。
\QR\example>java WebQR
Exception in thread "main" java.lang.NoClassDefFoundError:WebQR(wrong name example/WebQR)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

評価

0

ちなみにバージョンは
javac -J-versionで
java version "1.5.0_10"
java(TM) 2 Runtime Environment, Standerd Edition (build 1.5.0_10-b03)
java HotSpot(TM) Client VM(built 1.5.0_10-b03,mixed mode, sharing)

java -version
java version "1.5.0_10"
java(TM) 2 Runtime Environment, Standerd Edition (build 1.5.0_10-b03)
java HotSpot(TM) Client VM(built 1.5.0_10-b03,mixed mode, sharing)
となりました。

評価

0

最初っからだけど質問内容とQRコードは
全く関係ないよね。 ま、いいけど。
NoClassDefFoundErrorってなんだか解る?

http://sdc.sun.co.jp/java/docs/j2se/1.5.0/ja/download.html
「J2SE 5.0 ドキュメント」をDLして
「JavaTM 2 Platform Standard Edition 5.0 API 仕様 」を読めるようにしてNoClassDefFoundErrorの説明を読むんだ。

要はクラスが見つからないからクラスをロード出来ないってエラーだね。
たぶんクラスパスが足らないんだろうな。
実行時に出るって事は.classファイル(もしくは.classファイルが入ったjarファイル)が読めないのだから
クラスファイルのある場所にパスを通す。

評価

0

続き

パスを通すって書いたけど正確にはクラスパスの事ね。
あとパスを通すディレクトリも正確にはclassファイルが
あるディレクトリじゃないや。

classファイルが格納されるrootディレクトリでした。
つまり

c:\aa\bb\cc\dd\ee\test.class
ってのがあって
test.class が package ee だったら
クラスパスには c:\aa\bb\cc\dd を設定する。

評価

0

c:\WORK\QR\example>set CLASSPATH=c:\WORK\QR
c:\WORK\QR\example>javac WebQR.java
c:\WORK\QR\example>java WebQR
Exception in thread "main" java.lang.NoClassDefFoundError:WebQR
となってしまいます。
クラスパスの設定のしかたが違うのでしょうか?
exampleディレクトリの中身は以下のとおりです。
c:\WORK\QR\example>dir

2007/11/28  14:22    <DIR>          .
2007/11/28  14:22    <DIR>          ..
2007/11/28  10:59             2,334 check.class
2007/01/26  03:41             2,733 check.java
2007/11/28  14:22             3,756 hoge.class
2007/11/28  17:18             4,082 hoge.java
2007/11/29  13:37               626 J2SEImage.class
2007/11/28  14:22               626 J2SEImage_.class
2007/11/28  14:12             1,908 MAME.class
2007/01/26  03:37             2,083 MAME.java
2007/11/29  13:37               538 WebQR$1.class
2007/11/29  13:37             2,273 WebQR$2.class
2007/11/29  13:37             4,750 WebQR.class
2007/11/28  15:51             9,148 WebQR.java
              12 個のファイル              34,857 バイト
       

評価

0

package exampleって書いてあるじゃないか…

評価

0

これじゃ伝わらないかな。
WebQRクラスの正式名はなんですか?

評価

0

つうか、引き継ぎ元に人にきちんとわかるまで
聞いていないこいつがバカ。
#つうか、バカな人に対して失礼なくらいだね

評価

0

多分卒業研究かなにかだろうから、引継ぎというほどの引継ぎはないだろうけどね。

そうれはそうと、コマンドラインからコンパイル、実行が出来ないような人が多すぎて困る。
みんなIDEに依存しすぎ。

評価

0

卒研だったらいいんだけど……
業務でやってるコードじゃないよね・・・?

評価

0

どっかでみたソースだなと思ったら、
Open Source QR Code Libraryじゃないか…。
http://qrcode.sourceforge.jp/

評価

0

初心者に冷たいねw
JDK6とJMFをインストールして、
パス通せばコンパイルできる事くらい
すぐ分かるんだから、教えてやりゃいいジャン
import行がチョッと変だけど

評価

0

\QR>java example.WebQR

いまさらなんだろうが…

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。