今、文字を登録するためのプログラムを、下記の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);
}
}
}