いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

色つきカードをwebカメラで映してPCで色を判断する

 PCで顔認識するのは大変です。しかし色の組み合わせなら? 例えば1000人に5cm×10cmくらいのカードを持たせます。カードは4区画に分かれており、各区画には7色から選んだ色が塗られます。つまり、カードの色がPCに見分けられれば7の4乗、2401人の見分けが可能です。今はQRコードやバーコードなんかも使える状況ですし、わざわざなんでそんなことを……と言われそうですが、少し前「フルスクラッチでやろう!」と実験してみました。例えばバーコードを扱うにはバーコードリーダーが必要ですが、色の確認ならwebカメラで可能ですから、うまくいけばそれなりに価値はあるかな、と。

 ロジックとしては以下の通りです。

webカメラでカードを撮り、カメラ付属のソフトでPCの画面に映す。

②自作のプログラムで、画面に表示された画像のあちこちの点を選んで色を確認。

ハードルはいくつもありました。

webカメラは、使ってみれば分かりますが結構チラチラと画像全体、あちこちの色が変わります。ノイズが入るような感じです。各区画で、1回だけでなく何回か色を調べて平均をとるなどしなければなりません。

②明るさなどの条件で色の判断が簡単にはできません。

③映っている画像の中のどこがその並びなのか、パソコンに判断させなければなりません。

④傾けて撮るなどしても認識できなければなりません。

⑤認識率99%だとしても10人は認識し損ないます。99.9%くらいは欲しいところです。

逃げみたいなものですが、③、④についてはカメラに近づけて大きく映すとかすればよいでしょう。

 結局部屋の中での実験ではうまく認識できるようになりましたが(何万回も実験するのも大変なのでやっていませんが、カードを数種類作り、数十回で認識ミスなし)、屋外で使うことも考えると別に実験してみなければなりません。屋外というのは意外にと言うか極端にと言うか、とにかく凄く明るいのですね。色の判断に大きな影響を与えると思います。このへんで疲れて放り出し、そのままです……。

 「なるほど……」と思ったことが。パソコンでは色はRGB、つまり赤・緑・青(Red, Green, Blue)の強さをそれぞれ0~255の256段階で表現し、256×256×256=16777216色、発色できます。例えばR=255, G=255, B=0 だと真っ黄色です。しかし、真っ黄色の絵を作ってカラープリンタで印刷してカメラで撮っても、R,G,B はそんな値にはなりません。実験してみると例えばR=150, G=120, B=40で写るのです。それでもまあ黄色(に近い)なので、パソコンには「黄色」と判断させなければなりません。人間はどんなときに黄色だと感じるのでしょうか。「R≒GかつB<50 なら黄色に見えるのか?」とか、いろいろ考えましたが大変です……。これでは終わりそうにありません。これについては、色の表現にはRGBの他にHSV)というのがあり、なんとかなりました。カメラの画像から取ったRGBからHSVの値を求めれば(変換のための式がある!)Hの値だけで黄色に近いかどうか判断できます。これでうまくいきました。

 別の問題ですがカメラの画像はPCの画面のウィンドウに写されます。しかし画像のデータ(どのドットはどういう値か)は直にカメラ付属のソフトから得られるわけではありません(そのためのインターフェースは公開されていない。当然ですよね……)。従って、画像のデータは、自作のプログラムで画像が表示されているウィンドウを指定して、そのウィンドウ内を何点かチェックして得る必要があります。

 中途半端ではありますが、一応、まあ結論は出したということでとりあえず終わりにしました。面白かった!

注:

HSVとは……色相(Hue angle)、彩度(Saturation)、強度(Value)の三要素で色を表現します。Hの色相角度は赤(0°)から始まって黄(60°)、緑(120°)、水色(180°)、青(240°)、紫(300°)、再び赤へのグラデーションになっています。赤から始まってぐるっと一周して赤にもどるので、色相環と呼ばれます。Hだけで色の判断ができるようです。