MACでOpenCVを使ってカメラの画像のHSVの平均を求める

OpenCVを使ってMACのカメラに映る画像をHSVの平均を表示してみた。 OpenCVだとHは0-180,Sは0-255,Vは0-255とのこと。 適当にiPhoneのアプリとかでHSVを指定した色をカメラに見せると正しそうな値が表示されている、、気がする。

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <ctype.h>
#include <unistd.h>
#include <stdio.h>

int
main (int argc, char **argv)
{
  CvCapture *capture = 0;
  IplImage *frame = 0;
  IplImage *hsv_Image = 0;
  CvSize image_size = {320, 240};
  int c;
  int hue_average = 0;
  int saturation_average = 0;
  int value_average = 0;

  // (1)コマンド引数によって指定された番号のカメラに対するキャプチャ構造体を作成する
  if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0])))
    capture = cvCreateCameraCapture (argc == 2 ? argv[1][0] - '0' : 0);

  /* この設定は,利用するカメラに依存する */
  // (2)キャプチャサイズを設定する.
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, image_size.width);
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, image_size.height);

  cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);

  /* HSV変換先のメモリを確保する */
  hsv_Image = cvCreateImage (image_size, IPL_DEPTH_8U, 3);

   // (3)カメラから画像をキャプチャする
  while (1) {
      frame = cvQueryFrame (capture);

      /* HSV形式に変換する */
      cvCvtColor(frame, hsv_Image, CV_BGR2HSV);
      for(int y = 0; y < hsv_Image->height; y++){
          for(int x = 0; x < hsv_Image->width; x++){
              /* imageDataはchar型なので 0-127? */
              /* 0 - 180 */
              hue_average += (unsigned char)hsv_Image->imageData[hsv_Image->widthStep * y + x * 3];
              /* 0 - 255 */
              saturation_average+= (unsigned char)hsv_Image->imageData[hsv_Image->widthStep * y + x * 3 + 1];
              /* 0 - 255 */
              value_average += (unsigned char)hsv_Image->imageData[hsv_Image->widthStep * y + x * 3 + 2];
          }
      }

      printf("hue_average=%d,%d\n",hue_average,hue_average/(hsv_Image->width * hsv_Image->height));
      printf("saturation_average=%d,%d\n",saturation_average,saturation_average/(hsv_Image->width * hsv_Image->height));
      printf("value_average=%d,%d\n",value_average,value_average/(hsv_Image->width * hsv_Image->height));
      fflush( stdout ); 

      cvShowImage ("Capture", frame);
      hue_average = 0;
      saturation_average = 0;
      value_average = 0;
      c = cvWaitKey (2);
      if (c == '\x1b')
          break;

      sleep(1);
  }

  cvReleaseCapture (&capture);
  cvReleaseImage (&hsv_Image);
  cvDestroyWindow ("Capture");

  return 0;
}

OpenCVで色検出

下記を参考にしてキャプチャした画像のRGBの割合を出してみた。

http://opencv.jp/sample/simple_gui.html
http://imagingsolution.blog107.fc2.com/blog-entry-99.html
http://gihyo.jp/dev/feature/01/opencv?ard=1461515703

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <ctype.h>
#include <unistd.h>
#include <stdio.h>

int
main (int argc, char **argv)
{
  CvCapture *capture = 0;
  IplImage *frame = 0;
  double w = 320, h = 240;
  int c;
  int blue_pixels = 0;
  int green_pixels = 0;
  int red_pixels = 0;

  // (1)コマンド引数によって指定された番号のカメラに対するキャプチャ構造体を作成する
  if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0])))
    capture = cvCreateCameraCapture (argc == 2 ? argv[1][0] - '0' : 0);

  /* この設定は,利用するカメラに依存する */
  // (2)キャプチャサイズを設定する.
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);

  cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);

  // (3)カメラから画像をキャプチャする
  while (1) {
    frame = cvQueryFrame (capture);
    for(int y = 0; y < frame->height; y++){
        for(int x = 0; x < frame->width; x++){
            /* imageDataはchar型なので 0-127? */
            blue_pixels += frame->imageData[frame->widthStep * y + x * 3] > 70;
            green_pixels+= frame->imageData[frame->widthStep * y + x * 3 + 1] > 70;
            red_pixels += frame->imageData[frame->widthStep * y + x * 3 + 2] > 70;
         }
    }

    printf("red_pixels=%d,%d\n",red_pixels,(red_pixels * 100)/(frame->width * frame->height));
    printf("green_pixels=%d,%d\n",green_pixels,(green_pixels * 100)/(frame->width * frame->height));
    printf("blue_pixels=%d,%d\n",blue_pixels,(blue_pixels * 100)/(frame->width * frame->height));
    fflush( stdout ); 
    cvShowImage ("Capture", frame);
    red_pixels = 0;a
    green_pixels = 0;
    blue_pixels = 0;
    c = cvWaitKey (2);
    if (c == '\x1b')
      break;

    sleep(1);
  }

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

  return 0;
}

Mac book AirでOpenCVをちょこっと動かした話

Mac book Airにカメラが付いています。これを使って、OpenCVでキャプチャ画面を開いてみます。超簡単です。
でも古いMacだとbrew関連がめっちゃ時間がかかるので半日がかりです。のんびり行きましょう。

Homebrewのインストール

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

※公式サイトにある通り http://brew.sh

OpenCVのインストール

brew update
brew install homebrew/science/opencv

brew install opencvとやると上のコマンドだよ、って教えてくれる。
 2時間くらいかかりました。Mid 2011はオワコンか。。。

pkg-configのインストール

brew install pig-config

ソースコード

下記のURLからソースを探してきて、test.cで保存 includeにopencvのパスをつける変更が必要。 http://opencv.jp/sample/video_io.html

#include <opencv/cv.h>
#include <opencv/highgui.h>

コンパイル

gcc test.c -o test `pkg-config --libs --cflags opencv`

pkg−configの素晴らしさ。インクルードパスやライブラリ周りは全部自動でやってもらいます。
バッククオート(Shift + @)に注意

実行

./test 0

左上に自分の顔が表示されます。簡単!

イ・セドルがアルファゴに2連敗!

はじめに

碁のトッププロであるイ・セドルがアルファゴ(アルファ碁、AlphaGo)に2連敗しました。

www.asahi.com

このニュースは、ディープラーニングの技術的特異点(シンギュラリティ)を見せてくれました。このタイミングを見ることが出来たのは素晴らしい。

将棋もプロが負けていますが、今回は企業が金を出して行っている点が大きな違いです。 以前、ワトソンというIBMのAIがクイズ番組で王者になった後、実際にサポートセンターに導入されました。問題がありその回答を探すのはクイズと変わらないからです。 同じように今回の技術はAIによる金融取引等に用いられ、人間は勝てなくなるでしょう。金融取引が人対人の取引を予想しもっとも利益が高い方を選択するゲームだとすると囲碁などと同じ土俵になると思うからです。まぁ、ここらはすでに導入されているとは思いますが、碁というゲームを通して今どのような変化が起きているかを感じることができるのが今回のニュースの面白い点だと思います。

尚、マシンは1,202のCPUと176のGPUを使用しているみたいです。 AlphaGo - Wikipedia, the free encyclopedia

ディープマインド社

AlphaGoを開発したのはグーグルに買収されたベンチャー起業のディープマインド社です。この会社は以前DQNというテレビゲームを自己学習するという、ネタとしては楽しい人工知能を開発した会社です。DQNネットスラングなので印象に残っています。

gigazine.net

そして、この記事を読んで1年経たないうちに碁でトップを取ってしまいました。どれだけ研究していたかはわかりませんが、トッププロに勝つまであと10年かかると言われていたのに10年短縮してしまったことになります。ネタ企業でなかったことにびっくりです。

アルゴリズム

アルゴリズムモンテカルロ木探索とディープラーニングを使用しているようです。 詳しいことはNatureの論文を読んでもらうとして、自分の怪しい理解ですが簡単に説明します。

モンテカルロ木探索

モンテカルロ法はランダムに碁を最終局までうち勝敗をチェックし(プレイアウト)、それを繰り返し勝率が最も高かったものを選択するというアルゴリズムです。聞くと単純ですがこのアイデアが生まれるまでは、場の局面を判断させる方法を考えて最も良さそうな一手を探すことをやっていました。その局面を数値化するなんてプロでも難しそうなことをやろうとしていたわけです。

次にモンテカルロ木探索ですが、モンテカルロ法をもっと効率良く探索させる方法です。ランダムに適当に打つと言っても全てのパターンを打たせていると今のコンピュータ性能では宇宙の歴史が終わるまでかかってしまいます。そのためうまく選択させる必要があります。次にモンテカルロ木探索では、選択方法としてある手から行われるゲームパターンをツリー状にして並べてみて、勝率が高いものを選択させることにしました。これで絞り込みが良くなりかなり強くなったのですが、まだアマチュアレベルでした。もう一段ブレイクスルーが必要ということで、ディープラーニングを使用しています。

ディープラーニング

これはまず過去のトッププロの大量のゲームから特徴を抽出し次に打つ可能性が高いデータベースを作成します。それを莫大な量を繰り返していくとトッププロが打つ可能性の高い一手を見つけることができます。これをモンテカルロ木探索と組み合わせると、トッププロが打つ可能性の高い手を使用して最後まで打ち切り、その中で勝率の高い次の一手を見つけることができるようになります。しかしこれだけではトッププロのゲームの平均値までの強さしか行きません。そこで自己対戦を行い、無駄を取り除きます。これで研ぎ澄まされトッププロ中のトップレベルの力をつけることができます。

最後に

人間相手だと疲れなどもあり、最高の一手を続けることはできません。しかしコンピュータは疲れを知らないため常に最高な状態を出し続けます。そのためトップレベルのプレイヤでもコンピュータに勝てなくなります。自分の理解はこんな感じです。

将棋も碁もですがすでにコンピュータの方が人間より強いという状況になってきました。これでプロを目指す子供たちは減るのでしょうか?それともトップレベルのコンピュータ将棋で遊んできた子供たちが見たことのない世界を創造するのでしょうか?個人的にはせっかく天才に生まれてきたんだから他の分野で活躍してほしいなぁとも思いますが。。

おわり

MacのGarage BandをiPADからMIDI over Bluetooth LEでつないだ話

はじめに

無駄にiPad用のDTMソフト買い漁っているせらくんです。 SALEでCubasis買ったのに立ち上げてもいません!

それはともかく、DTMで楽しいのは、機材と機材をつなぐことですね。 つなぐのが本番。だって、楽器の練習すぐ飽きるんだもの。なのでつなぐまでが俺の守備範囲です。

さて、本日はMacのGarage BandをMIDI INにして、iPadMIDI OUTにする方法を紹介します。iPad側をOUTにする方法がググってみても見つからなかったので、記事にしてみました。まぁ、このブログに辿り着くのはもっと難しいんだけどなっ!

準備

まず、iPAD用のソフトを準備します。 用意するのは、YAMAHAのMobile Music Sequencer(以降、長いからMMS)です。Synth Arp & Drum Pad でもできるけど、キーボードが広いのでMMSの方をお勧めします。

Synth Arp & Drum Pad

Synth Arp & Drum Pad

  • Yamaha Corporation
  • ミュージック
  • 無料

Mobile Music Sequencer

Mobile Music Sequencer

  • Yamaha Corporation
  • ミュージック
  • ¥1,900

次にMac側の設定を行います。これはデフォルトで入っているAudio MIDI設定のアプリを立ち上げます。分かりにくいところに入ってるので、Spotlight検索で探してみてくだい。MIDIと入れると出てきます(Spotlight検索はcontrol+spaceとかで)。起動したらウィンドウ→MIDI Studioを表示を選択します。

次にBluetoothっていうアイコンを叩いて、Bluetooth構成を開きましょう。開いたら「アドバタイズ」ボタンをクリックして「俺はここにいるぜっ」とアッピールします。 ボタンが「アドバタイズを停止」になったらiPADのMMSを開きましょう! f:id:serakun:20160306121459p:plainf:id:serakun:20160306121530p:plain

MMSを開いたらSYSTEM設定を開きMIDI PORTを開きます。そこに現れたBluetooth MIDI Deviceを押してあげると、MacMIDIデバイスとして表示されるので、「接続」を押しましょう!これで接続完了です。うまく繋がらないときは、MMSの再起動を試すとするといけます。それでダメな時もなぜか繋がっている時があるので、とにかく頑張ってください。

f:id:serakun:20160306223103p:plain

f:id:serakun:20160306223136p:plain

さて接続完了したら、MIDI PORTにMacが見えます。それではMIDI IN/ONを有効にしましょう!これで完了です。

f:id:serakun:20160306233213j:plain

※ちなみにSynth Arp & Drum Padは設定アイコン(ギアのヤツ)→MIDIBluetooth MIDI Deviceから設定できます。実はアプリから設定しているけどすべて共通なのでどちらかで接続が完了すると、両方接続されています。分かりにくいですね。そのうち「設定」に入るでしょう。

演奏

さて、ここまできたらMacGarageBandを開きましょう。うまくいっていれば、GarabeBandの環境設定→オーディオ/MIDIMIDI入力が検出されているはずです。 では、GarageBand録音ボタンを押して、MMSのキーボードを心ゆくまで弾きましょう。録音を止めればあなたの演奏が記録されています。

さて、最後に俺の素晴らしい演奏をアップ、、、、するぐらい上手くなれるといいのだけど。永遠に自主規制。

おわり

MacBook Air (Mid 2011)をAirDropに対応させてみた話

はじめに

2011年って何年前だよっていうMacBookを使っているせらくんです。

MacBook Air (Mid 2011)って、ハードウェア的にはAirDropが使えるのに、なぜかiPadからはデータ転送出来ないんですよね(涙)。 調べてみると、Continuity Activation Toolというツールで有効に出来るという情報が見つかりました。OS X 10.11 (El Capitan) で、試したみるとうまくいったのでまとめておきます!

とは言っても、手順は簡単ですが中身は結構いじるみたいなので、「iPadとの画像のやり取りが面倒くさすぎる。新しいのを買ってやるから壊れてしまえっ」ぐらいの気合いのある方だけにお勧めします。自己責任です。

手順

手順と言っても、https://github.com/dokterdok/Continuity-Activation-Toolに書いてある手順に従うだけです。

1. リカバリーモードに入れて、ターミナルを起動する(OS X 10.11 (El Capitan)の場合)。

再起動してCommand + Rを押しっぱなしにしていると、OS Xユーティリティという謎な画面が表示されます。ここで、ユーティリティ→ターミナルでターミナルを起動します。 f:id:serakun:20160306193421j:plain

2.システム整合性保護を無効にする(OS X 10.11 (El Capitan)の場合)

El Capitanでは、rootユーザでもシステムをいじれないようにシステム整合性保護(SIP:System Integrity Protection, RootLess)という機能が追加されました。それを無効にする必要があります。1で起動したターミナルから「csrutil disable」とコマンドを実行すれば完了です。実行したらrebootと打つなりなんなりして、普通に再起動しましょう。
※元に戻すコマンドは多分「csrutil enabled」です。面倒なので自分は戻していません。

support.apple.com

3. すべてのアプリケーションを実行可能にする

通常モードで再起動したら、すべてのアプリケーションを実行可能にしましょう。これはシステム環境→セキュリティとプライバシー→「変更するには鍵をクリックします。」をクリック→実行許可を「すべてのアプリケーションを許可」で変更できます。野良アプリを入れるときのいつものおまじないです。

4.Continuity Activation Toolの実行

ここまでで準備完了です。Continuity Activation Toolをダウンロードして実行しましょう。 https://github.com/dokterdok/Continuity-Activation-Toolに行ってページ中ほどにある「Download link」をクリックします。ダウンロードが開始されるので、完了したら展開先に行って「Continuity Activation Tool.app」を起動します。

ターミナルが起動するのであとはその指示に従って実行します。
1.Activatate Continuityを選択する f:id:serakun:20160306220857p:plain

2.USB Bluetooth dongleうんたらは気にせずリターンキーか何かを押す
2011 midはBluetoothは搭載済みです。それよりも前の機種でUSB Bluetoothを使用したい場合は検出されるまでほっておきましょう。

3.OK?みたいなのを聞かれるので、OKして、再起動します。

iPadとつないでみる。

ここまできたら再起動後、Finderの左に表示されるAir Dropをクリックすると今まで表示されていなかった「このMacを検出可能な相手」というのが表示されます。お試しで「全員」にしてあげて、iPadの方もAir Drop「全員」にしてあげましょう!

これでファイルのAirDropを使ってのファイル交換が可能になります!便利!
※最初はなんか認識したりファイルを渡せなかったりしたけど、しばらく試していくと安定して動作するようになりました。育ててやるのが大事(おっ)

おわり

一瞬だまされたと思うけど、やっぱり違うと思ったら、やっぱりだまされた気がするバームクーヘン

なんかこのバームクーヘン、俺をだまそうとしてる気がする。 f:id:serakun:20160302090550j:plain

バターうまそう、いや、バターフレーバー、ん、なんでバターフレーバーをプッシュしてるんだ? バターと誤認させるため?いや、バターフレーバー好き用?

となったので、買ってみました。バターの香りはしませんでした。

おわり

www.amazon.co.jp