CをJAVAに変換してください

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tomomi

CをJAVAに変換してください

#1

投稿記事 by tomomi » 11年前

手書き文字認識システムを作ろうとしています。筆圧情報のみを用いて「どこでも書ける」手書き文字認識を目指しています。筆圧情報は、LEGOのタッチセンサーを用いてセンサーがオンの時間をもとに文字を導き出すという方法です。
今、文字を登録するためのプログラムを、下記のC言語のプログラムを参考にJAVAでつくろうと思っています。
ですが、C言語はあまりやりなれていないのでJAVA言語に直して頂きたいと思っています。
時間をかければできそうですが、私は今就職活動中であまり時間もなく、来週の月曜日までに仕上げたいのでお願いしたいです。よろしくお願いします<(_ _)>
(「ながっ!」と思われたら、menu1の部分に関わる所のみでも結構です)

コード:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
    
/*
#define debug
*/
    
    
#define VALID 1
#define INVALID 0
#define ON 1 
#define OFF 0
#define MAXSIZE 128
#define MAX 2147483647
    
    struct fdat{
	char header;
	char sw1, sw2;
	int x_pos, y_pos;
    };

int moji[MAXSIZE], moji_data[MAXSIZE], word[MAXSIZE], newword;
float value = MAX;
char line[MAXSIZE];


/********************************************
  dat2pos(char *data, struct fdat *fdat_p)
  ********************************************/
int dat2pos(data, fdat_p)
    char data[];
    struct fdat *fdat_p ;
{
    /* chack header */
    switch ( data[0] ){
      case '@':
	fdat_p -> header = VALID ;
	break ;
      case 'A':
	fdat_p -> header = INVALID ;
	break;
      default:
	return -1;     /* error code */
    }
    
    /* set SW1, SW2 data  */
    if ( (data[1] & 0x1 ) != 0 )
	fdat_p -> sw1 = ON ;
    else 
	fdat_p -> sw1 = OFF ;
    if ( (data[1] & 0x2 ) != 0 ) 
	fdat_p -> sw2 = ON ;
    else 
	fdat_p -> sw2 = OFF ;
    
    /* calcurate position x and y */
{
    int i, x = 0 , y = 0;
    for( i = 0; i < 4; i++ )
    {
	x = ( x << 5 ) + (data[9 - i] & 0x1F) ; /* byte 10 - 7 */
	y = ( y << 5 ) + (data[5 - i] & 0x1F) ; /* byte 6 - 3 */
    }
    fdat_p -> x_pos = x ;
    fdat_p -> y_pos = y ;
}
return 0; /* return no error */
}


/*1文字入力(本数を返す)*/
int input_moji(FILE *fp)
{
    int a, i, j = 0, nagasa = 0, honsu = 0;
    struct fdat fdata ;	
    
    while(1){
	i = 0;
	a = fgetc(fp) ;
	
	/* line配列に1行読み込み */
	while( (a != '\n') && i < MAXSIZE - 1 ){
	    line[i++] = a & 0x7F ; /* skip parity bit */
	    a = fgetc(fp) ;
	}
	line[i++] = 0 ;
	
#ifdef debug
	/* print input data */
	printf("%s  ", line);
#endif
	
	if ( dat2pos(line , &fdata) < 0  ) 
	{ 
	    /* print error messsage */
	    printf(" ----- invalid data ---------\n");
	    continue;
	}
	
#ifdef debug
	printf("Header= %s, SW1= %s, SW2= %s, X= %d, Y= %d\n",
	       fdata.header==VALID?"VALID  ":"INVALID", 
	       fdata.sw1==ON?"ON ":"OFF", 
	       fdata.sw2==ON?"ON ":"OFF",
	       fdata.x_pos, 
	       fdata.y_pos) ;
#endif
	
	/*INVALID状態の時 nagasa+1 を行わない*/
	if(fdata.header == INVALID){
	    continue;
	}
	
	nagasa++;
	
	/*終了*/
	if (fdata.x_pos > 20000 && fdata.y_pos < 3200 )
	    return MAX;
	
	/*1文字認識*/
	else if (fdata.x_pos > 20000 && fdata.y_pos > 5000 
		 && fdata.y_pos < 9300) 
	    return honsu; 
	
	/*それ以外の時の処理*/
	else if( fdata.sw1 == OFF){
	    moji[j] = nagasa;
	    nagasa = 0;
	    honsu++;
	    j++;
	}
    }	
}


void get_line(char buffer[])
{
    int i, j = 0, k = 0, l;
    char temp[MAXSIZE];
    
    for(i = 0; i < MAXSIZE; i++){
	temp[i] = '\0';
	moji_data[i] = '\0';
    }
    
    for(i = 0; ; i++){
	if(buffer[i] == '\n')
	    break;
	else if(buffer[i] == ' '){
	    moji_data[k] = atoi(temp);
	    k++;
	    for(l = 0; l < MAXSIZE; l++)
		temp[l] = '\0';
	    j = 0;
	    continue;
	}
	else{
	    temp[j] = buffer[i];
	    j++;
	}
    }
}


void recog(int honsu, FILE *fp)
{
    int i;
    float t_value;
    char buffer[1024];
    
    fgets(buffer, 1024, fp);
    
    while(! feof(fp)){
	t_value = 0;
	get_line(buffer);	
	
	if(moji_data[1] == honsu){
	    for(i = 0; i < honsu - 1; i++)
		t_value += sqrt((moji[i + 1] * 100 / moji[0] - moji_data[i + 3]
			  * 100 / moji_data[2])
			  * (moji[i + 1] * 100 / moji[0] - moji_data[i + 3]
				   * 100 / moji_data[2]));
	    printf("value = %.3f  t_value = %.3f\n", value, t_value);
	    if(value > t_value){
		value = t_value;
		word[0] = moji_data[0];
		for(i = 0; i < honsu; i++)
		    word[i + 1] = moji_data[i + 2];
	    }
	}   
	fgets(buffer, 1024, fp);
    }
}


int input_YorN()
{
    char a = '\0';
    
    while((a != 'Y') && (a != 'y') && (a != 'N') && (a != 'n')){
	printf("(y/n):");
	scanf("%c", &a);
    }
    return a;
}


menu1()
{
    int i, j, honsu, a1, a2, flag;
    char a;
    
    FILE *fp[2];
    
    while(1){
	flag = 1, value = MAX;
	printf("\n\nペンで認識したい文字を書いて認識ボタンを押してください\n");
	printf("(終了:タブレット上の終了ボタンを押す\n");
	
	for(i = 0; i < MAXSIZE; i++){
	    moji[i] = '\0';
	    line[i] = '\0';
	    word[i] = '\0';
	    moji_data[i] = '\0';
	}
	
	if((fp[0] = fopen("/dev/ttyb", "r")) == NULL){
	    printf("/dev/ttyb がオープンできません\n");
	    exit(0);
	}
	
	if((fp[1] = fopen("Moji_data", "a+")) == NULL){
	    printf("Moji_data がオープンできません\n");
	    exit(0);
	}
	fclose(fp[1]);

	fp[1] = fopen("Moji_data", "r");

	honsu = input_moji(fp[0]);
	
	if(honsu == MAX){  /*終了*/
	    fclose (fp[0]);
	    fclose (fp[1]);
	    return;
	}
	
	recog(honsu, fp[1]);
	
	fclose(fp[1]);
	fp[1] = fopen("Moji_data", "a+");
	
        printf("\n\n入力画数は %d 画\n", honsu);
        printf("1画1画の長さの比は : ");
        for(i = 0; i < honsu; i++)
            printf("%d ", moji[i]);
        printf("\n\n");
	
	printf("---------- 認識結果 ----------\n");
	if(value == MAX){
	    printf("\n同一画数の文字がありません\n");
	    a = 'N';
	}
	else{
	    a1 = (word[0] >> 8) | 0x80;
	    a2 = (word[0] & 0xff) | 0x80;
	    printf("文字 : %c%c  認識度 : %3f | ", a1, a2, value);
	    for(i = 0; i < honsu; i++)
		printf("%d ", word[i + 1]);
	    
	    printf("\n\n認識結果は正しいですか? ");
	    a = input_YorN();
	}
	
	switch(a){
	  case 'N': case 'n':
	    printf("\n新たな文字として登録します。 \n よろしいですか?");
	    a = input_YorN();
	    
	    if(a == 'Y' || a == 'y'){
		while(flag){
		    printf("コードを入力してください。(16進数):");
		    scanf("%x", &newword);
		    
		    a1 = (newword >> 8) | 0x80;
		    a2 = (newword & 0xff) | 0x80;
		    
		    printf("\n%c%c として登録します。\nよろしいですか?", a1, a2);
		    
		    a = input_YorN();
		    
		    if(a == 'Y' || a == 'y'){
			fprintf(fp[1], "%d %d ", newword, honsu);
			for(i = 0; i < honsu; i++)
			    fprintf(fp[1], "%d ", moji[i]);
			fprintf(fp[1], "\n");
			
			printf("登録しました。\n\n");
			flag = 0;
		    }
		}
	    }
	    else 
		printf("登録をとりりやめました\n\n");
	    
	    break;
	    
	  case 'Y': case 'y':
	    printf("\n書く人がいいと、こちらとしても助かります。\n\n");
	    break;
	    
	  default:
	    break;
	}
	
	fclose(fp[0]);
	fclose(fp[1]);
    }
}


void menu2()
{
    int i, j = 0, a1, a2;
    char buffer[1024];
    FILE *fp;
    
    if((fp = fopen("Moji_data", "r")) == NULL){
	printf("Moji_data がオープンできません\n");
	exit(0);
    }
    
    printf("\n       ------ 登録内容  ------\n");
    
    fgets(buffer, 1024, fp);
    
    while(! feof(fp)){
	j++;
	get_line(buffer);
	
	a1 = (moji_data[0] >> 8) | 0x80;
	a2 = (moji_data[0] & 0xff) | 0x80;
	
	printf("%c%c  %2d 画 ", a1, a2, moji_data[1]);
	for(i = 0; i < moji_data[1]; i++)
	    printf("%d ", moji_data[i + 2]);
	printf("\n");
	
	if(j % 10 == 0){
	    printf("HIT RETURN KEY!!\n");
	    getchar();
	}
	
	fgets(buffer, 1024, fp);
    }
    printf("\n計%d文字登録されています。\n\n", j);
    fclose(fp);
}


main()
{
    int num;
    
    while(1){
	printf(" ☆☆☆☆ 手書き文字認識ソフト  珠緒ちゃん β ++ ☆☆☆☆\n\n");
	printf("-----  MENU  -----\n");
	printf("1. 文字認識\n2. 登録文字情報\n3. 終了\n");
	printf("------------------\n");

	while(1){
	    printf("INPUT 1~3:  ");
	    scanf("%d", &num);

	    if(num == 1){
		menu1();
		break;
	    }
	    
	    if(num == 2){
		menu2();
		break;
	    }
	    
	    else
		exit(0);
	}
    }
}


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: CをJAVAに変換してください

#2

投稿記事 by softya(ソフト屋) » 11年前

申し訳ないですが当掲示板は、お手伝いサイトであって丸投げ可のサイトではありません。
フォーラムルール http://dixq.net/board/board.html
C言語をJava化する所で分かりづらいところがあれば説明しますがさほど困難なC言語とも思えません。

元のC言語の環境や詳しい説明、ターゲットとするJavaの環境がわからないのでは答えようがないという問題もあります。
肝心の手書き入力が/dev/ttybのデバイスで行われていますが、そこの部分は自分で解決出来るのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: CをJAVAに変換してください

#3

投稿記事 by bitter_fox » 11年前

とりあえず、一番上から。

コード:

public class FData
{
	private State header;
	private boolean switch1;
	private boolean switch2;
	private int x;
	private int y;

	public void setHeader(State header) {this.header = header;}
	public State getHeader() {return header;}
	public void setSwitch1(boolean switch1) {this.switch1 = switch1;}
	public boolean setSwitch1() {return switch1;}
	public void setSwitch2(boolean switch2) {this.switch2 = switch2;}
	public boolean setSwitch2() {return switch2;}
	public void setX(int x) {this.x = x;}
	public int getX() {return x;}
	public void setY(int y) {this.y = y;}
	public int getY() {return y;}
}

public enum State
{
	VAILD, INVALID
}

public void dataToPosition(char[] data, FData fdat)
{
	switch (data[0])
	{
	case '@':
		fdat.setHeader(State.VALID);
		break;
	case 'A':
		fdat.setHeader(State.INVALID);
		break;
	default:
		throw new IllegalArgumentException("Unknown Header");
	}

	if ((data[1] & 0b01) != 0)
	{
		fdat.setSwitch1(true);
	}
	else
	{
		fdat.setSwitch1(false);
	}

	if ((data[1] & 0b10) != 0)
	{
		fdat.setSwitch2(true);
	}
	else
	{
		fdat.setSwitch2(false);
	}

	fdat.setX(Range.createNotContainsLast(0, 4).stream().reduce(0, (x, i) -> (x << 5) + (data[9 - i] & 0b1_1111)));
	fdat.setY(Range.createNotContainsLast(0, 4).stream().reduce(0, (y, i) -> (y << 5) + (data[5 - i] & 0b1_1111)));
}

public class Range implements Iterable<Integer>, Streamable<Stream<Integer>>
{
	private static class RangeIterator implements Iterator<Integer>
	{
		private int start;
		private int end;
		private int now;

		private RangeIterator(int start, int end)
		{
			this.now = this.start = start;
			this.end = end;
		}

		public boolean hasNext()
		{
			return now <= end;
		}

		public Integer next()
		{
			return now++;
		}
	}

	private int start;
	private int end;

	private Range(int start, int end)
	{
		this.start = start;
		this.end = end;
	}

	public static Range createContainsLast(int start, int end)
	{
		return new Range(start, end);
	}

	public static Range createNotContainsLast(int start, int end)
	{
		return new Range(start, end - 1);
	}

	public Iterator<Integer> iterator()
	{
		return new RangeIterator(start, end);
	}

	public Stream<Integer> stream()
	{
		return Streams.stream(this);
	}
}

Rangeはいい加減な実装です。

tomomi

Re: CをJAVAに変換してください

#4

投稿記事 by tomomi » 11年前

御丁寧にありがとうございました<(_ _)>
javaは私自身もっと勉強しなければならないと実感しました。
時間に追われ、確かに丸投げしてしまいました。すみません。
また、わからないことがあれば質問させていただきたいと思いますので、その時は宜しくお願いします!

閉鎖

“C言語何でも質問掲示板” へ戻る