2011/08/18

GR DIGITAL II で赤外線写真を試す


ケンコー・トキナーの PRO1D R72 (赤外線透過フィルター) を使った風景写真が面白い。撮影や加工のコツがまだまだ掴めないけど、適当にやってもそれなりに不思議な感じに仕上がる。

2011/08/16

OpenCVで顔検出してリアルタイムモザイク

もはや定番となってますが、顔検出のサンプルコード "samples/c/facedetect.cpp" をベースに、検出された顔の領域にモザイクをかけるようにしてみた。コードはgist:1148913へ。

本格的な画像処理や画像認識の機能をお手軽に試せてしまうの楽しい。
すごいぞ、OpenCV!;-)

モザイクかけるだけで何やら怪しい雰囲気になるなw

2011/08/15

OSX Lion (MacBook Air - Mid 2011) 上の Xcode4.1 で OpenCV2.2 を使えるようにする

MacBook Air (Mid 2011) で OpenCV を使ったコードを動かすまでのメモ。
手順は以下のとおり。

[1] Xcode をインストール

AppStore で検索&クリック。あとは待つだけ。

[2] MacPorts をインストール

公式サイトから Lion 用のイメージをダウンロードしてきてインストール。
インストールが終わったら、一応アップデートしておく。
$ sudo port selfupdate

[3] OpenCV をインストール

MacPorts を使ってしまえばコマンド一発。時間はかなりかかる。
$ sudo port install opencv

[4] Xcode のプロジェクト設定

ポイントは3つ。
  • 「Valid Architectures」を"x86_64"のみにする。
    ※"i386"を含めたままでは、ビルドでエラーが出た。
  • 「Header Search Paths」に"/opt/local/include"を追加。
  • 「Other Linker Flags」に必要なライブラリのパスを追加。例えば、以下の3つ。
    • "/opt/local/lib/libopencv_core.2.2.0.dylib"
    • "/opt/local/lib/libopencv_highgui.2.2.0.dylib"
    • "/opt/local/lib/libopencv_imgproc.2.2.0.dylib"
    ※ここで設定せずにプロジェクトに直接追加してしまってもOK

というわけで、C でこんなコードを書いて動かしてみると、、、
#include <opencv/cv.h>
#include <opencv/highgui.h>

IplImage* doCvGray(IplImage* in);
IplImage* doCanny(IplImage* in, double lowThresh, double highThresh, double aperture);

int main (int argc, const char * argv[])
{
  cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);
  cvNamedWindow ("Edge", CV_WINDOW_AUTOSIZE);

  CvCapture *capture = cvCreateCameraCapture(0);
  assert(capture != NULL);

  IplImage *frame = 0;
  IplImage *out = 0;
  int c;

  while (1) {
    frame = cvQueryFrame (capture);

    out = doCvGray(frame);
    out = doCanny(out, 10, 100, 3);
    cvShowImage("Capture", frame);
    cvShowImage("Edge", out);
    cvReleaseImage(&out);

    c = cvWaitKey (2);
    if (c == '\x1b')
      break;
  }

  cvReleaseCapture (&capture);
  cvDestroyWindow ("Capture");
  cvDestroyWindow ("Edge");

  return 0;
}

IplImage* doCvGray(IplImage* in){
  IplImage* out = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1);
  cvCvtColor(in, out, CV_BGR2GRAY);
  return out;
};

IplImage* doCanny(IplImage* in, double lowThresh, double highThresh, double aperture){
  IplImage* out = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1);
  cvCanny(in, out, lowThresh, highThresh, aperture);
  return out;
};
はい、エッジ検出できておりますw

2011/05/21

Project Euler をやり始めてみた

数日前に存在を初めて知ったProject Euler
Project Euler is a series of challenging mathematical/computer programming problems that will require more than just mathematical insights to solve. Although mathematics will help you arrive at elegant and efficient methods, the use of a computer and programming skills will be required to solve most problems.
About Project Euler - Project Euler
要は、プログラミングで解く数学パズル、みたいなもの。WEB上に用意された沢山の問題を一つづつ解いていく。ちなみに、他のユーザが書いたコードを見ることもできて、ちょっと勉強になったりもする。
全部で300以上ある問題のうち、まだ10問しかクリアしてないけど、解き方を思いついたり、うまく一発で答えを当てられたときの気持よさはなかなかのもの。少しでもプログラミングできる人は是非お試しを。

さて、プログラミングにはどんな言語を使ってもいいんだけど、僕は結局Javaを選択して少しずつ問題を消化していこうかと。ちょっとだけクラスの設計もしたので、使ってみたかったgithubにリポジトリ作ってみた(こちら)。この設計に基づくと、記念すべき1問目、Problem1を解くSolverはこんな感じになる。
package euler;

public class Solver001 implements Solver
{
  public String solve()
  {
    int sum = sum(3, 1000) + sum(5, 1000) - sum(15, 1000);
    return Integer.toString(sum);
  }

  public int sum(int base, int max)
  {
    int n = (max - 1) / base;
    return base * n * (n+1) / 2;
  }
}
ま、あまり設計とか考えずにmain関数ベタ書きでよかったかも -_-;

まずは25問クリアして"Level1"になるのが目標です。

2011/04/23

iPhoneは基地局の情報を収集していた?

Appleが4/27付けで説明を公開した。
Apple Q&A on Location Data

要は、
  • ユーザの位置情報を収集はしていない
  • iPhoneに記録されている位置情報は、Appleが管理している基地局DBの一部(測位の高速化・高精度化のための端末側キャッシュとして利用)
  • 長期間に亘って記録していたのはソフトウェアのバグによるもので、近々アップデート予定(合わせて、キャッシュの母艦へのバックアップもやらないようにする)
とのこと。
基地局DBのキャッシュか、なるほど、って感じ。
[4/28追記]

iPhoneで知らぬ間に位置情報の履歴が記録されていた、ということが話題になっている。記録された履歴はiPhoneの同期先であるPCに保存され、アメリカの研究者がオープンソースで公開したiPhone Trackerというツールで可視化までできてしまう、というもの。

実際に上記のツールを使って僕のiPhoneで記録された位置情報の履歴を表示すると、こうなる。

個人的には非常に面白いデータで色々いじってみたくなるけど、プライバシ情報の扱い方という観点では改めて怖さも感じてしまう。

ま、ここではとりあえずそのあたりの問題は置いておいて、データを眺めてみる、、、むむ、何となく位置の履歴が自分の直感と合わない。例えば、もっと特定の場所に集中して位置情報が記録されててもいいはず。

そこで、こちらの記事を元にしてperlのコードを書いてみたりしつつ、母艦に保存されたsqliteのデータファイルの中身を確認してみた。見れば見るほど、このデータ、「位置情報の履歴を『逐一』記録したもの」というよりは「iPhoneが見つけた基地局の情報を記録したもの」って感じがしてくる。

というのも、、、
母艦に保存されたデータ(sqliteのデータベース)を開いてみると、位置情報が記録されているWifiLocationとCellLocationというテーブルの定義は以下のとおり。
CREATE TABLE WifiLocation (
MAC TEXT,
Timestamp FLOAT,
Latitude FLOAT,
Longitude FLOAT,
...(略)...
PRIMARY KEY (MAC)
);

CREATE TABLE CellLocation (
MCC INTEGER,
MNC INTEGER,
LAC INTEGER,
CI INTEGER,
Timestamp FLOAT,
Latitude FLOAT,
Longitude FLOAT,
...(略)...
PRIMARY KEY (MCC, MNC, LAC, CI)
);
文字通り、Timestampは時刻、Latitudeは緯度、Longitudeは経度を意味している。
ここで注目すべきは赤字で示したところ。PRIMARY KEY指定されてるWifiLocationのMACとCellLocationの(MCC,MNC,LAC,CI)MACは、おそらくWi-FiアクセスポイントのMACアドレス。一方の(MCC,MNC,LAC,CI)は、ケータイ基地局のIDに該当するようなものではないだろうか。要は、Wi-FiアクセスポイントMACアドレスとケータイ基地局IDは、それぞれのテーブルの中で重複が許されないってこと。

というわけで、これらのテーブルはあくまで「Wi-Fiアクセスポイント」および「ケータイ基地局」のリストを記録するためのもので、これらのテーブルにユーザの位置情報の履歴が全て記録されることはあり得ない。つまり、こういう形で位置情報の履歴を残している目的は、ユーザの位置を追跡するため、というよりは、基地局の位置を収集するため、という方が近いんじゃないかな。

さらに言えば、こうやって取得された基地局リストは、何らかの方法でやっぱりAppleが収集して、skyhookPlaceEngineなどと同じような測位用のデータベースを整備するために使っていた(もしくは、使おうとしていた)んじゃなかろうか。位置情報の履歴が記録され始めた時期(2010年の6月前後?)と、「Appleとskyhookの間の契約が終了→Appleが独自測位技術の利用を開始?」と報じられた時期(2010年の8月あたり)の関係も気になるところ。

ちなみに、見た限り、母艦上のデータに記録されている時刻(Timestamp)は、測位されたときの時刻ではなさそう。なので、ライフログとしてはあまり使えなさそう。あと、僕のデータにはアクセスポイントが15万件以上リストされていた。10ヶ月でそれだけの個数のアクセスポイントに遭遇していたのだとすると、ちょっと驚き。

2011/04/19

閲覧制限したBloggerブログのフィードを公開する方法(改)

以前書いた記事の方法ではあまりにややこしかったので、
もうちょっとだけシンプルな方法を用意してみた。

まず、目的は前回の記事と同じ。
Bloggerには閲覧者を制限する機能があって、プライベートなブログを作るには便利。なんだけど、ちょっとした不便がある。それは『閲覧制限をかけると記事やコメントのフィードが生成されない』というもの。ちょっと古いけど、こんな関連記事もチラホラ見かけられる。本文は特定の人以外に公開したくないけど、記事のタイトルやコメントが付いたことくらいはフィードリーダーで確認できたら便利だなぁ、という人、少しくらいはいそうだ。というより、僕が便利だ!w
Bloggerで閲覧制限したブログのフィードを公開する方法 - cyclic landscape

というわけで、今回用意したのはコレ。
Blogger Feed Creator


使い方は以下の通り。
  1. まず、Blogger Feed Creator ページ右上の"login"をクリックしてGoogleアカウントでログイン。Blogger Feed Creatorを初めて使う場合、Blogger Feed CreatorがBloggerへアクセスすることを許可するかどうか確認するためのページが表示される。内容を了解出来れば"アクセスを許可"。
  2. ログインしたGoogleアカウントで閲覧可能なBloggerブログの一覧が表示される。閲覧制限をかけたブログも一覧に表示されるはずなので、フィードを公開したいもののラジオボタンを"ON"に。
  3. これで、"posts"のURLをブログ記事のフィード(タイトルのみ)、"comments"のURLをコメントのフィード(コメント本文の先頭20文字のみ)として利用できる。
    ちなみに、Googleリーダ(などのPubSubHubbub対応フィードリーダ)でフィードを読む人は、一覧に表示されているメールアドレスを、Bloggerの更新通知先(ダッシュボードの「設定→メールとモバイル」と「設定→コメント」に設定項目あり)として登録しておくと、フィードの更新が早くなって便利。


今回は、slim3を使って作りました。
慣れてくると手放せません。