2011年12月30日金曜日

ちょっと読んでみたよ<-

「Qt」プログラミング入門―使いやすいフレームワークを基礎から解説 (I/O BOOKS)


キュート9ちゃんじゃなくてGUIのキュートに関する書籍
Qtに関する和書は久っっっっっっしぶりですね<-

まだ,10章中3章しか読んでいないんですが<-
ここからがなんか難しそう<-

3章であったスピンボックスとダイアルによる
シグナル/スロットの例はとってもわかりやすかったです
サポートページにあったサンプルが
Ubuntuだとそのまんまじゃ動かなかったのがちょっと残念<-

今のところはそんな感じです
ま〜なんとも中途半端で、ごめんなさいヽ(*゚д゚)ノ
Qtを今から始められる方には良い一冊だと思います

2011年12月27日火曜日

昨日ちょっと調べてみました

あー、やっぱあの休憩でやってたので
回転とか拡大に関しての間違いが多いみたい

今度休憩したときにそこを集中的に改善したいと思います.

2011年12月25日日曜日

あれれ

GoSWFがChromiumからだと動作してない・・・ orz
火狐だと大丈夫みたい・・・

あ,バージョン更新したらできたヽ(*゚д゚)ノ<-

一致したなかで最大値のものだけを選択するとこうなるのか・・・ orz



最大値をとったのは次の評価では除外してます
手順違いな棋譜は得られてますね・・・
石は認識してくれてるみたい<-
う〜ん やっぱちゃんと関連するものをちゃんと読んで再出発するべきだね

2011年12月24日土曜日

んな〜 休憩終了!<-

っで,そこで画像から棋譜を作成することを試みみました.
パターンマッチング時に使用する辞書ベクトルは
テストデータとは別のもの(書体も違うもの)を使用しました.
用いる尺度は部分空間法で使われる類似度の辞書ベクトルの数を1にした




を使いました(こんなふうに使っていいんだろうか<-).
ここで, は入力ベクトル, は辞書ベクトルです.

使用した棋譜画像は












これです.
結果は悲惨なものになりました<-
方向を修正してトリミングし,パターンマッチングのために
拡大した画像が以下の画像です.
若干?二値化しています.












これからパターンマッチングにより得られた棋譜がこれです・・・.
いろいろ間違ってます.
パターンマッチングとして,類似度が最大のものを候補として
いるので,同じ手を選んでしまっているものもあります<-
う〜ん,テスト画像とは違う書体の数字を辞書ベクトルで使用してるんで,
すこぶる良くないですね・・・(;・∀・)



今後の課題は・・・

  • 正解率あげないとヤバい、使い物にならない<-
  • そのためには画像の方向を修正するときや拡大するときにきれいに?処理したい
  • 辞書ベクトルの数とか,ちゃんと部分空間法を扱いたい<-
  • 判別分析の方がいいのかも、まだ何もやってないけど<-
  • 直線や円の検出をやって盤のサイズや石を検出して,正解率を向上させたい・・・<-
  • コウの時に棋譜の下側に書かれるやつも処理できるようにしたい
いつになるかわからないけど,
また休憩したときに改善したいと思いますヽ(*゚д゚)ノ
ってなわけで休憩お〜わり<-
こんなんだから,心が細いんだろうな・・・

あー昨日の間違ってた

何故か拡大後で補完してました<-
直すとこんな感じ・・・
微妙すぎる・・・ orz
あ、トリミング機能付けてみました.


2011年12月23日金曜日

引き続きちょっと休憩

昨日に引き続いてちょっと休憩してみます<-
今日は画像の拡大についてやってみました.
これはただ倍率を元の座標にかければ拡大できるんですが,
単にすると下のように薄ーくなった画像が出来上がってしまいます orz
これは昨日の出力画像において縦横1.5倍した奴です・・・

っで,これじゃまずいので何かいろいろな補完方法があるらしい<-
けどあんまり興味はないので<-
直感的な4近傍の平均を用いる補完方法を追加してみました.
そうすると以下のように若干ましになった画像が得られました.
ただ濃くなっただけな気がするけど・・・.
たぶんもうちょっとだけ休憩しますヽ(*゚д゚)ノ<-





ちょっと休憩

久しぶりにラベルがProgramsな投稿
画像の回転をやってみました(画像?ここゲーム関連じゃ・・・)

問題設定?は以下のような斜めになってる棋譜画像を
正しい方向に元に戻すことにしました.
ここではPNG形式のファイルになってるんですが,
実際にはPGM形式のファイルを使用しています orz
あ、この棋譜画像は棋譜画像作成ツールを使用させて頂いて作成したものを
テスト用にわざわざ10度程度回転させたものです.




ここでは超高等テクニックであるHough変換を使って直線を検出したりはせず<-
棋譜画像で傾いているのは大抵この2つのパターンなので
場合分けして左上と右上の頂点を調べて,
そこから傾いている角度を算出して,
直したものを結果として出力画像として出力するものを作成してみました.
素晴らしく汎用性皆無のコードを最後に貼っつけて置きます・・・.
使い方はコマンドライン引数に対象とするPGM形式のファイルパスと
結果を出力するPGM形式のファイル名を指定する感じで動きます.
こんなコード書いていて大学生として恥ずかしくないわけがない<-
githubにあげられるようなコード書けるように頑張ろう・・・<-

あ,っでこのコードによる出力は以下のようになりました.
これもPNG形式の画像となっていますが,実際はPGM形式の画像です・・・ orz
う〜ん、ちゃんと正しい方向な棋譜が得られていることがわかります.ヽ(*゚д゚)ノ
意外に角を打たれていても良い感じですね<-
けど,ただ回転行列を用いているだけなので,画質が劣化してると思います.Σ(´∀`;)
あと,トリミング機能あったほうが良いかも<-

 


まとめると<-
  • Hough変換使わなくても簡単な棋譜の方向の修正はたぶんできる.
  • 単純に回転行列使ってるだけじゃ画質が劣化する.



#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <fstream>
#include <cstdlib>
#include <cmath>

class Image {
 public:
  Image(char *file_name, char *output_file_name) { init(file_name,
output_file_name); }
  void init(char *file_name, char *output_file_name);
  void doCorrect();
  void outputImage();
  
 private:
  std::string file_type_;
  std::string file_comment_;
  int img_height_;
  int img_width_;
  int max_value_;
  std::vector<std::vector <int> > img_data_;
  std::string output_file_name_;
};

void Image::init(char *file_name, char *output_file_name) {
  output_file_name_ = output_file_name;

  std::ifstream fin(file_name);
  if (!fin) {
    std::cerr << "file not found" << std::endl;
    exit(1);
  }
    
  fin >> file_type_;
  if (file_type_ != "P2") {
    std::cerr << "file not found" << std::endl;
    exit(1);    
  }
  
  // コメント処理 コメントが1行あると仮定
  fin.ignore();
  getline(fin, file_comment_);
   
  fin >> img_width_ >> img_height_ >> max_value_;
  img_data_.resize(img_height_);
  for (int i = 0; i < img_height_; i++) {
    img_data_[i].resize(img_width_);
    for (int j = 0; j < img_width_; j++) {
        fin >> img_data_[i][j];
    }
  }
  fin.close();
}

void Image::doCorrect() {
  int x_top_left = -1;
  int y_top_left = 0;
  int x_top_right = -1;
  int y_top_right = 0;

  // 左上の頂点を探索
  for (int i = 0; i < img_height_; i++) {
    for (int j = 0; j < img_width_; j++) {
      if (img_data_[i][j] < max_value_ / 2) {
        x_top_left = j;
        y_top_left = i;
        break;
      }
    }
    if (x_top_left >= 0) {
      break;
    }
  }
  
  // 反時計回りに傾いていると考えられる場合
  if (x_top_left > img_width_ / 2) {
    x_top_right = x_top_left;
    y_top_right = y_top_left;
    int min_distance = img_width_;
    for (int i = 0; i < img_height_ / 2; i++) {
      for (int j = 0; j < img_width_ / 2; j++) {
        if (img_data_[i][j] < max_value_ / 2 && j < min_distance) {
          min_distance = j;
          x_top_left = j;
          y_top_left =  i;
        }
      }
    }   
  }
  else {
    int max_distance = 0;
    for (int i = 0; i < img_height_; i++) {
      for (int j = 0; j < img_width_; j++) {    
        if (img_data_[i][j] < max_value_ / 2 && j > max_distance) {
          max_distance = j;
          x_top_right = j;
          y_top_right =  i;
        }
      }
    } 
  }
  
  double theta = atan2((double)(y_top_right - y_top_left),
                       (double)(x_top_right - x_top_left));

  std::vector<std::vector<int> > correct_img_data(img_height_,
 std::vector<int>(img_width_, max_value_));
  for (int i = 0; i < img_height_; i++) {
    for (int j = 0; j < img_width_; j++) {
      int x_correct = j * cos(theta) + i * sin(theta);
      int y_correct = -j * sin(theta) + i * cos(theta);
      
      if (x_correct >= 0 && x_correct < img_width_
          && y_correct >= 0 && y_correct  < img_height_) {
          correct_img_data[y_correct][x_correct] = img_data_[i][j];
      }
    }
  }
  img_data_ = correct_img_data;
}

void Image::outputImage() {
  std::ofstream fout(output_file_name_.c_str());
  fout << "P2" << std::endl;
  fout << file_comment_ << std::endl;
  fout << img_width_ << " " << img_height_ << std::endl;
  fout << max_value_ << std::endl;

  for (int i = 0; i < img_height_; i++) {
    std::copy(img_data_[i].begin(), img_data_[i].end(),
              std::ostream_iterator<int>(fout, "\n"));
  }

  fout.close();
}

int main(int argc, char **argv) {
  if (argc == 1) {
    std::cerr << "enter a pgm file on the command line" << std::endl;
    return 1;
  }
  else if (argc == 2) {
    std::cerr << "enter a output file name on the command line" << std::endl;
    return 1;    
  }
  
  Image img(argv[1], argv[2]);
  img.doCorrect();
  img.outputImage();

  return 0;
}
2011年12月25日にちょっと修正<-

2011年12月22日木曜日

いいじゃない車輪の再発明

原理って面白いじゃない
そうなると再発明せざるを得ない

2011年12月21日水曜日

やっほー

時には長考もやっほー<-

生きてるだけで必死です
生きるって大変ですね

2011年12月20日火曜日

う〜ん・・・

タイピングチェッカーβを今やったら
6.3key/秒だった orz
だめだこりゃ

結構、今の自分は周りからの反動により
動いてる部分が多く自発的でないんですが
とっても楽しいです、たぶん<-

あれ?そもそも期待値ってなんだっけ?<-

期待値って単にでやすい値ではないですよね?
ある関数の確率分布での平均値っていう考え方で、
確率値により重み付けされている・・・って考え方でいいんすか?<-

2011年12月19日月曜日

問う

来年の俺は生きていますか?

ラプラス近似で幸せになれそう

2011年12月18日日曜日

ちょっま

MongoDBのC++ドライバってすんなり入んなかった<-
あ、たぶんちゃんと指示に従えば入ると思います<- orz

そういえばcp -pRって便利ですねー

2011年12月17日土曜日

へー通じるんだー<-

今日は図書館に行った後に
マックによって食事したんですが、
注文を英語でしてみました
バリバリ日本人だとバレてたと思うけどΣ(´∀`;)
何とか通じて?注文できて、良かった(・∀・)カエレ!!
どうやら俺の英語は日本人には通じるらしい<-

2011年12月16日金曜日

命をーーーーーーーーー

燃やせええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

ん〜

生きるって難しいね

あ、長友選手が2試合連続で得点したそうで、
今回のヘッドのゴールは見事だった

試合後、長友選手は

アルバレスが持ったときに、彼の左足なら
あそこに来るんじゃないかという気がしました。

と言ったそうな
待ってるだけじゃチャンスは引き寄せられないんだね・・・

2011年12月15日木曜日

心が細い

 心が細い心が細い心が細い心が細い心が細い心が細い心が細い心が細い心が細い心が細い心が細い心が細い心が細い心が細い心が細い

2011年12月14日水曜日

あーたぶんそうだろうなー

来るところを間違えたらしい
まずはそれを証明したいです