2014年11月10日月曜日

Survey of Survy Papers(Human/Computer Vision関係)

Human Vision

  • A. Kimura, R. Yonetani, and T. Hirayama: "Computational Models of Human Visual Attention and Their Implementations: A Survey", IEICE Trans. on Information and Systems, vol. E96-D, no. 3, pp. 562-578. 2013.

Computer Vision

  • Cesar Cadena, Luca Carlone, Henry Carrillo: "Past, Present, and Future of Simultaneous Localization and Mapping: Toward the Robust-Perception Age", IEEE Transactions on Robotics, Vol. 32, Issue 6, pp. 1309-1332, 2016.
  • T. Taketomi, H. Uchiyama, and S. Ikeda: "Visual-SLAM Algorithms: A Survey from 2010 to 2016", IPSJ Transactions on Computer Vision and Applications. Vol. 9, No. 16, 11 pages, 2017.
  • Saxena, Ashutosh and Chung, SungH. and Ng, AndrewY. "3-D Depth Reconstruction from a Single Still Image", Intl. Jour. of Computer Vision, vol. 76, no. 1, pp. 53-69, 2008.
  • Vincent Lepetit and Pascal Fua: "Monocular model-based 3D tracking of rigid objects: A Survey", Foundations and Trends in Computer Graphics and Vision vol. 1, no. 1, pp. 1-89, 2005.
  • Andrew T Duchowski: "A breadth-first survey of eye-tracking applications", Behavior Research Methods, Instruments, & Computers, Vol. 34, no. 4, pp. 455-470, 2002.
  • D. W. Hansen and Q. Ji: "In the Eye of the Beholder: A Survey of Models for Eyes and Gaze", IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 32, No. 3, pp. 478-500, 2010.

Computer Graphics

  • Ariel Shamir: "A survey on Mesh Segmentation Techniques", Computer Graphics Forum, vol. 27, no. 6, pp. 1539-1556, 2008.
  • Kobbelt, Leif and Botsch, Mario: "A Survey of Point-based Techniques in Computer Graphics", Computer and Graphics, vol. 28, no. 6, pp. 801-814, 2004.

Display

  • Cakmakci, O. and Rolland, Jannick: "Head-worn displays: a review", Jour. of Display Technology, vol. 6, No. 3, pp. 199-216, 2006.
  • Reingold, Eyal M and Loschky, Lester C and McConkie, George W and Stampe, David M: "Gaze-contingent multiresolutional displays: An integrative review", Human Factors: The Journal of the Human Factors and Ergonomics Society, vol. 45, no. 2, pp. 307-328, 2003.
  • Andrew T. Duchowski, Nathan Cournia and Hunter Murphy: "Gaze-contingent displays: A review", CyberPsychology & Behavior, vol. 7, no. 6, 2004.

Virtual/Augmented Reality

  • S. Mori, S. Ikeda, and H. Saito: "A Survey of Diminished Reality: Techniques for Visually Concealing, Eliminating, and Seeing Through Real Objects", IPSJ Transactions on Computer Vision and Applications, Vol. 9, No. 17, 14 pages, 2017.
  • Feng Zhou, Henry Been-Lirn Duh and Mark Billinghurst: "Trends in augmented reality tracking, interaction and display: A review of ten years of ISMAR," Proc. 7th IEEE/ACM International Symposium on Mixed and Augmented Reality (ISMAR2008), pp.193 - 202, 2008.
  • Ken Hinckley, Randy Pausch, John C. Goble, Neal F. and Kassell: "A survey of design issues in spatial input", Proc. 7th annual ACM Symp. on User interface Software and Ttechnology
  • T. Azuma Ronald: "A Survey of Augmented Reality", Presence: Teleoperators and Virtual Environments, vol. 6, no. 4, 355 - 385, 1997.
  • Chris Hand: "A Survey of 3D Interaction Techniques", Computer Graphics Forum, vol. 16, no. 5, 1997.
  • E. Kruijff, J. E. Swan, and S. Feiner: "Perceptual issues in augmented reality revisited", Proc. 9th IEEE Int. Symp. on Mixed and Augmented Reality (ISMAR2010), pp. 3-12, 2010.

2014年9月2日火曜日

【魚突き】 手銛 関連情報

手銛情報・販売サイト

カーボン手銛・比較(価格/長さ)

高くてなかなか手が出ないカーボン製の手銛。 素人には分からない細かい性能は抜きにして、価格と長さだけ比較。
  • SS2 by NYKメタル 28,000円/2.7m
  • SS3 by NYKメタル 42,000円/3.8m
  • CS by NYKメタル 35,000円/3.4m
  • CH by NYKメタル 41,000円/3.4m
  • 旭 TK-17Y by アクオス 45,257円/2.8m
  • 旭 TK-17Y2 by アクオス 43,200円/2.69m
  • 旭 TK土佐16A-M by アクオス 61,480円/2.8m
  • 旭 TK土佐16A-L by アクオス 62,509円/2.8m
  • ハリケーン2 by 矢野工房 60000円/3.54m
  • ハリケーン2 by 矢野工房 60000円/3.54m

銛・銛関連具の自作

2014年7月3日木曜日

オカン語録

私の母は頻繁におそらく家族以外の人間では理解の出来ない言葉を使う。 一体どこの方言なのだろう?赤ちゃんに対する表現が目立つ。

  • ぴんこしゃんこ:赤ちゃんが足を元気よく曲げ伸ばしする様。
  • どんびんご:生まれたての赤ちゃん。特に鳥の赤ちゃんを指して使われる。
  • まひげ:眉毛(まゆげ)。
  • キャッチ:お尻。形状が似ているキャッチミットの省略。
  • ちんころ:不明。赤ちゃんが疲れ果ててすやすやと寝ている際に使わる表現。例:~のように寝ている。
  • ケントデリカッチ:ケント・デリカット。単なる言い間違いではなく意図的にこう発音する。
  • スッポコタン:ど田舎。

2014年4月7日月曜日

印刷パターンでカメラを簡単にガンマ補正する

明るさと輝度値の非線形性

カメラの画像から何かを計測する場合,とりわけ画像の色が重要となる場合,画素値と実際の明るさ(放射照度)の関係が重要となる. 一般には,画素値が2倍であっても明るさも2倍だとは言えない. ディスプレイに表示される色と明るさ(輝度)の関係でも同じことが言える. 下図を見れば,この現象が簡単に体験できる.

左から黒,灰,白と三色の正方形が3つ並んでおり,上下2段ある. 上段と下段の違いは中央灰色の正方形のみで,上段の色は255階調のうち127の色で塗りつぶされている. 一方,下段は白255と黒0の画素の面積の総和がちょうど半々になるように,市松模様が描かれている. 市松模様の各正方形は非常に小さいため遠目で見ると灰色に見えるという仕組み. 127はちょうど半分の輝度値であるはずで,黒と白が半々に混ざって見える市松模様も黒と白のちょうど中間の色に見えるはずが,上段と下段は異なる色のように見える場合がある(表示するディスプレイやカラー設定により異なる).

ディスプレイに画像を映す場合もこのような現象がおきるけど,カメラで撮影したときにも元の放射照度と画素値の間に似たような現象が起きることがある. 得られた画像を元の放射照度に比例するように画素値を変換することをガンマ補正と言ったりする. また,ガンマ補正というのは次に説明するような放射照度のガンマ乗の形をした変換関数を用いる補正のことを指すけど, 放射照度から画素値への一般的な変換関数を応答関数と言ったりする.

ガンマ補正の原理

ガンマ補正を数式で表してみる. 元の放射照度を$I$,何らかの非線形の変換を経て得られた画像の画素値を$I'$とするとこの式で書ける.

\[ I' = s(I)^\gamma = (a I + b)^\gamma \]

基本的には放射照度$I$を$\gamma$乗してるだけだけど,画素値なんてものは数値に物理的な単位もないし,画素値0が真っ黒に対応するとも限らないので$aI+b$のように自由度をもたせている.

ここで上の図の下段のようなパターンを印刷した紙をカメラで撮影して画像を得たとする. その時の黒,灰,白部分の画素値をそれぞれ$I'_b$,$I'_g$,$I'_w$とする. そんでそれらの元の放射照度を順に$I_b$,$I_g$,$I_w$とする. そうすると次の式が得られる.

\begin{eqnarray} I'_b &=& (a I_b + b)^\gamma\\ I'_g &=& (a I_g + b)^\gamma\\ I'_w &=& (a I_w + b)^\gamma\\ I_g &=& \frac{I_b + I_w}{2}\\ \end{eqnarray}

3つめがポイントでこれが灰色の部分と黒,白の放射照度を表している. つまり画像上では必ずしも黒と白の中間色にならなくても,紙表面の黒と白の点から来る光線が,半分半分に混ざり合って各画素に入ってきた結果グレーに写っていると考えるとこの式は正しい.

ガンマ補正の計算方法

ここではGnuplotのfitコマンドを使って簡単にガンマ補正してみる. まずデータの準備.これはdata.txtというテキストファイルに「$I\ I'$」の順に数値を記録したもの. 1行目から順に各業が黒,灰,白の部分に対応している. 右側の画素値は良いとして左側の放射照度はどうやって取得するんだよと思うかもしれないけど,放射照度のスケール(単位)は何でもいい. というのも最終的に得るのは補正された画素値であって放射照度ではないので,ここではどんなスケールでも得られる結果は同じ. 黒は真の真っ黒(放射照度0)だと信じて,1行目左は0に. 白は適当に255としたら,灰色は上の3つ目の式から半分の値で127とした(実数の方がいいかも).

0 25
127 40
255 98

次は,このデータ点に対してgnuplotでガンマ補正関数をフィッティングしてみる.

reset

#ガンマ補正関数
f(x) = a*x**gamma+b

#初期値
a = 1.0
b = 0.0
gamma = 1.0

#最小二乗法
fit f(x) 'data.txt' via a,b,gamma

#グラフ描画
plot 'data.txt'
replot f(x) lc 3

fit関数実行中にバラバラと最適化の途中結果が出力されたあと,次のように収束した解が得られる.

 :
 
After 183 iterations the fit converged.
final sum of squares of residuals : 0
abs. change during last iteration : -8.07794e-28


Exactly as many data points as there are parameters.
In this degenerate case, all errors are zero by definition.

Final set of parameters
=======================

a               = 0.000251373
b               = 25
gamma           = 2.27007

表示されるグラフはこのとおり.3点しかないので全点通る曲線が得られている.紙の黒い部分を完全な放射照度0としたので切片がかなり大きい. 放射照度の実測値を使わないでガンマ補正する以上,これは仕方ないのかも.

参考

  • Michael D. Grossberg and Shree K. Nayar: "What is the Space of Camera Response Functions?", IEEE Transactions on Pattern Analysis and Machine Intelligence

2014年4月6日日曜日

液晶シャッターメガネの動作様子(スローモーション)

家庭用の3Dテレビでは専用のメガネを書けなければ立体感が得られない。 立体視用のメガネは偏光と液晶シャッターの両方技術が使われている。 偏光は偏光フィルタなどを使うとその効果が容易に確かめられるが、 液晶シャッターの動作の様子はなんとなくちらつく程度しか普通は確認できないのではないか。 右目、左目交互にシャッターが切られている様子を、実際に見たことがあるだろう? 過去に小学生を対象とした公開講座のためにハイスピードカメラで液晶シャッターが動作する様子を記録した スローモーション映像を折角なので掲載しておく。何かの教材などに使われたら幸い。

2014年3月31日月曜日

boostのsocketでUDP通信 超シンプルなサンプルコード

Socket通信を始めるとき、まず初めに試してみるとよいのがUDP方式による通信。 接続を確保して欠落なくデータを送るTPCと 一方的にデータを送りつけるだけのUDPを比べると、 UDPの方が単純なのでプログラムも分かりやすい。 C++ライブラリであるBoostを使えば簡単に実現できるが、Boost本家のサンプルコードはいまいち分かりにくかったので、 導入用のサンプロコードをここにメモしておく。

サンプルコード(Visual Studio2010):
https://github.com/r168xr169/BoostUdpSocket

送信側

送信側がやることは、ソケットをオープンしたら、ただただデータを送りつけるだけ。 データを送りつける先のIPアドレス(192.168.0.100など)、ポート番号とプロトコル(IPv4/IPv6)を指定する必要がある。 ここでは送信データとして「BoostSocketUDP 001\n」などの番号入りのテキストを送ることにする。 for文を無限ループにしているので、このテキスト内の番号がインクリメントされる仕組みである。 また、送信先のIPv4アドレスは192.168.0.100、ポート番号は1234とした。

#include <string>
#include <iostream>
#include <boost/asio.hpp>
#include <boost/format.hpp>
#include <boost/thread.hpp>

int main(int argc, char * argv[])
{
    using namespace boost::asio::ip;

    //ソケットオープン
    boost::asio::io_service io_service;
    udp::socket sock(io_service, udp::endpoint(udp::v4(), 1234));
    
    //繰り返し送信する 
    for(int i=0; true; i++)
    {
         //テキストの送信(相手の状態に関わらず送信し終えたらすぐに次の処理に移る)
         std::string str = (boost::format("BoostSocketUDP %03d\n") % i).str();
         sock.send_to
         (
            boost::asio::buffer(str),
            udp::endpoint(address::from_string("192.168.0.100"), 1234)
         );

        //1秒待機(送信しすぎないように)
        std::cout << str;
        boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
    }

    return 0;
}

受信側

受信側でもやはりソケットをオープンした後、ポートとプロトコルを指定すれば、 あとはreceive_from()関数で受信すれば良い。 こちらもIPv4、ポート番号1234とした。

#include <string>
#include <iostream>
#include <boost/asio.hpp>
#include <boost/array.hpp>

int main(int argc, char * argv[])
{     
    using namespace boost::asio::ip;

    //ソケットオープン
    boost::asio::io_service io_service;
    udp::socket sock(io_service, udp::endpoint(udp::v4(), 1234));

    //繰り返しテキストを受信する
    for(int i=0; true; i++)
    {
        //受信(受信できるまで待機される)
        boost::array<char, 128> recv_buf;
        udp::endpoint endpoint;
        size_t len = sock.receive_from(boost::asio::buffer(recv_buf), endpoint);

        //受信内容を表示
        std::cout.write(recv_buf.data(), len);
    }

    return 0;
}

上手くいかないとき・・・

  • OSやウィルスソフトのファイヤーウォールでブロックされていないか確認する。二重にブロックされていることもある。
  • 同じプライベートIPアドレス(192.168.*.*)に見えても異なる無線LANのアクセスポイントに接続されている場合は、セグメントが異なるのでプライベートIPアドレスどうしでは通信できない。
  • 同じPC上で上記の2つのプログラムを動作させることはできない。
  • WindowsならMicrosoft Network Monitorで通信内容をキャプチャできるので、デバッグに使える。

参考