memorandums

日々のメモです。

Webカメラを分解して上下を反対にしてみた

■前置き

以下の作品作りのつづきです。

Processingで素朴な爆発表現のスケッチ - memorandums

上記の翌日、プロジェクタを固定する台を作りました。これはブログに書いていませんが。。。

なるべく台を小さく(低く)したかったんですね。昨年作った台は1m以上の高さがありました。詳しくはこちら

100均で買った鏡を利用してプロジェクタの映像を反射させることで焦点距離を稼ぎました(距離自体は変わっていませんが。。。)しかし。。。Webカメラの視野角が狭いため。。。高さは前のままにしなければなりませんでした。以下のような感じです。

f:id:ke_takahashi:20180619211759j:plain

これはあんまりですよね。。。一応、これでも「デスクライト」のつもりなんですけど。。。

試しに100均で売っているスマホ魚眼レンズアダプタをつけてみましたが。。。ダメ。歪んで使えそうもありません。

Webカメラで広角なやつってないのかな。。。とググったらありました!試しに買ってみて今日届いたんですね。値段も手頃です。

で、上記の台につけてみたところばっちりです。広角すぎるくらいですが。。。一応、物体認識には使えそうです。

しかし。。。映像が上下逆。。。プロジェクタも実は逆なんですがMacのモニターの設定で180度回転してなんとかできました。カメラも。。。回転したいところですが。。。できそうもありません。

じゃ、Webカメラの内部のセンサーを逆にすればいいじゃん。。。と思い、分解してみましたよ。。。というのが本題です。ちなみに、もちろんソフトェア的に逆にすることはできないことはありません。実際に昨年はそうしてました。。。ができれば避けたいところでした。


■本題

まずパッケージ。どーでもいいですね😁

f:id:ke_takahashi:20180622120904j:plain

まず、下図の赤矢印のネジを2本外します。時計用ドライバがいいですね。ついでに、作業の邪魔なので台座の部分(青矢印)も外します。

f:id:ke_takahashi:20180622122827j:plain

次がちょっと思い切りが必要なのですが、カメラのケースの上下部に差し込む場所があって、これが噛み合っているのですぐには開けられません。下図の赤矢印のところにマイナスドライバーを差し込んで開けます。

f:id:ke_takahashi:20180622122846j:plain

内部の回路まで刺さないように注意しながらです。もし、このプラケースの差し込み部分が破損しても、さきほど外した2本のネジでケースを押さえられるので大きな問題はないと思います。とにかく内部のレンズや回路まで突き刺さないように注意が必要です。

開けたら以下のようでした。

f:id:ke_takahashi:20180622123059j:plain

構造はとても簡単で、基板とレンズが一体化しているのと上下を反転しても穴の位置が上下に対して対象のため特別な工作をしなくても問題なくつけられます。ラッキーでした。

あとはケースを戻してネジ止めすれば完成です。

広角だし、こういう変更もできるし、何より安いので、いろいろとシステムづくりに使えそうです。このカメラ。

あと何個か買っておこう。

slideshareに授業資料をおいてみた(メモ)

■いつもの長い前置き

講義や演習では教科書を使わずにプレゼン資料を印刷して渡してきました。

今どき「紙」とも思いますが、授業に出席を促すためなど、もろもろの理由からずーっとそうしてきました。

最近、学生から電子ファイルでもらいたいとの要望が増えまして。。。お試しにと今年度からPDFファイルを大学の共通サーバーにおいて見てもらうようにしました。

学内では全教室でWifiが使えますので、学生さんらはスマホで資料にアクセスしてみることになります。ゲームをしているのか資料をみているのか。。。微妙ではありますが。

実際にやってみると1つ問題があることがわかりました。

コンピュータ演習室での演習授業の場合です。

演習室でもPDFを閲覧しながらプログラミングなどするわけですが。。。PDFだとコピペができちゃうんですね。。。(保護することはできるにはできるのですが抜け道があります)。

どうにかならないかな。。。と思ってきたんです。

今日、たまたま、ある科目の授業見学に行ったときに、その担当の先生がGoogleスライドをページに埋め込んで学生に閲覧させていました。

「おっ!、これはいい」と思ったわけです。

早速、自分の部屋に戻って、講義資料(パワーポイント)をGoogle DriveにアップしGoogleスライドに変換してWebページに埋め込んでみました。

「コピペできない!素晴らしい」と思ったのですが、Googleスライドではところどころフォーマットが崩れてしまいます。これを1つ1つ直すのは手間です。しかも、フォントが異なります。一番問題なのは、アニメーションがすべて再生されてしまうので、閲覧するときにもの凄く手間がかかります。パワーポイントとGoogleスライドともにアニメーションを一括で削除することができないようです。これでは資料として使い物になりません。

やっぱりPDFしかないか。。。と思いながら、試しにと slideshare を使ってみました。

すると。。。何ということでしょう。問題が一気に解決しました。


■本題

パワーポイントの資料をslideshareで公開するメリットというか特徴を挙げてみます。

  • パワーポイントのイメージをそのまま再現されますのでフォーマットが崩れません
  • 基本的にスライドは画像になるためプログラムコードなどのコピペはできません
  • アニメーションはすべて削除されます。一覧性がよいです。

実際に講義資料をslideshareにすべてアップロードしました。

限定公開にしてパスワードつきにし、ダウンロードを禁止にしました。ダウンロードを許可するとPPTXファイルがダウンロードできてしまい、結局、コピペができてしまいます。。。これでは本末転倒です。。。

実際にアップロードして閲覧してみて1つ問題がわかりました。

ハイパーリンク」です。

有用と思われる情報をハイパーリンクとしてスライドに載せています。slideshareではハイパーリンクが押せません。。。調べてみると(下記)、なんと。。。4ページ以降で使えるそうで。。。なんちゅう仕様やねん。。。

powerofstudy.blog.fc2.com

しかたがないので、1〜3ページにハイパーリンクがあった場合は空スライドを挿入しました。しかたがありません。

あと、もう1つ問題があることがわかりました。

「資料の差し替えができない」ことです。

以前はできたらしいですが。。。最近、仕様変更でできなくなったとか。。。残念です。

もし、資料が変更になった場合はファイルをアップロードしなおしてURLを変更しなければならないようです。

しかたがないですね。。。

とりあえず、これで前期の残りを試してみたいと思います。はい。


■追記

slideshareにファイルをアップして最初に躓いたことを書き忘れていました。アップロードしてみるとエラー。。。になります。以下によるとファイル名が日本語(マルチバイト文字列)だとエラーになる場合があるようです。英数字に変えてみると確かにうまくいきました。

hontolab.org

Processingで素朴な爆発表現のスケッチ

昨日のつづき。

カメラによる物体検知 - memorandums

上記でとりあえずドットの衝突検知ができるようになったので、タッチしたら音とアニメを流さないとな。。。ということでこれも自作(探したんだけどいいのがなくて)。

帰りの電車でサクッと作ったのが以下。Javaだとスクリプト言語と違って宣言順は気にしなくていいのでお気楽。

ArrayList<PG> pgl = new ArrayList<PG>();

void setup() {
  size(600, 600);
}

void draw() {
  background(0);
  for (int i = pgl.size() - 1; i >= 0; i--) {
    PG pg = pgl.get(i);
    if (pg.dead) {
      pgl.remove(i);
    } else {
      pg.draw();
    }
  }
}

void mousePressed() {
  pgl.add(new PG(mouseX, mouseY, 500, 3));
}

class PG {
  ArrayList<P> pl;
  int num;
  int r;
  boolean dead;
  
  public PG(float x, float y, int num, int r) {
    pl = new ArrayList<P>();
    this.num = num;
    this.r = r;
    for (int i = 0; i < num; i++) {
      float xx = x + random(-r, r);
      float yy = y + random(-r, r);
      pl.add(new P(xx, yy, r, atan2(yy-y, xx-x), random(0.3, 3))); //3は初速の上限
    }
  }

  void draw() {
    for (int i = pl.size() - 1; i >= 0; i--) {
      P p = pl.get(i);
      p.update();
      if (p.dead) {
        pl.remove(i);
        if (pl.size() == 0) dead = true;
      } else {
        p.draw();
      }
    }
  }

  class P {
    float x, y;
    float r;
    float th;
    float sp;
    boolean dead = false;
    
    public P(float x, float y, float r, float th, float sp) {
      this.x = x;
      this.y = y;
      this.r = r;
      this.th = th; //0 - TWO_PI
      this.sp = sp;
    }
    
    void update() {
      if (dead) return;
      x += sp * cos(th);
      y += sp * sin(th);
      sp *= 0.99; //0.99を変えると減速速度が速くなる
      if (x < 0 || x > width) dead = true;
      if (y < 0 || y > height) dead = true;
      if (sp < 0.1) dead = true;
    }
    
    void draw() {
      noStroke();
      fill(255, sp * 255 * random(0, 1)); //randomは明滅するため
      //      ellipse(x, y, r, r);
      rect(x, y, r, r);
    }
  }
}

で、これでは絵に書いた餅なので(展示的にはこれでいいのですが)、せっかくなのでネットで試せるようにp5.jsに移植したコードが以下です。

たまにしかJSを書かないので忘れては書いて思い出すを何十回と繰り返してきた感じです。。。しかたがありません。

ちなみに上記のコードでは、クリックした位置付近に100個のピクセルをばらまいて、そこから放射状にキラキラ明滅しながら散っていくイメージで作っています。

Javaでは500個でもスムーズに動いたのですが、p5.jsでは100個が精一杯(いやコードに無駄があると思いますが最適化する時間はとれません、ごめんなさい)。Javaは適当に書いてもそれなりに動く。。。証明になったのではないかと思います。

ごめんなさい。console.logが入りっぱなしだった。JSが遅いってわけじゃなかった。Java同様に500個にしても問題なく動作しました。

とりあえずこれをベースに調整していきたいと思います。

では。

カメラによる物体検知

つくるとVol.5に向けて準備作業開始しました。

なかなか時間が取れず。。。とはいえ一ヶ月前なのでさすがにやらないと。。。という感じです。

出展予定の内容は以下の通りです。

蕎麦屋の出前ではありませんが。。。投稿してから作るという感じで。。。実はまだ完成していません。ごめんなさい?

もちろん技術的にできることは最低限確認した上での投稿でしたので。。。

ScratchでRomoを操縦して、プロジェクターで投影したドット?を消していく(接触すると消える)、全部消すまでの時間を競うようなゲームにするつもりです。

ScratchでRomoを操縦するところは既にある仕組みを利用させていただきますので、これはdoneです。

さて、お次は投影したドットとRomoの接触?を検知するにはどーするか。。。です。

昨年、プロジェクションマッピングの応用事例として製作した装置(モバイルプロジェクタとWebカメラを一体化したもの)がありましたのでそれを流用します。ちなみに以下のような感じです。そういえばこれ動画あげてなかったなぁ。。。まあいいか。ちなみにこれ焦点距離を稼ぐために高くなってしまっているので本番まで改良予定です。

f:id:ke_takahashi:20180615193321p:plain

これで机面にドットを表示して、その表示したドットをRomoが遮ったら?、その様子を撮影しているWebカメラの映像で検知できないか?というお題です。

レンジセンサーやKinectを使う解法もありますが、装置がゴテゴテした感じにはしたくありません。ゆくゆくはRomoも自作して小中学校とかの実習なんかで採用してもらえるように低価格化したいので。それでWebカメラです。

以下のような感じです。

f:id:ke_takahashi:20180615193948j:plain

この状態でRomoが前進すると。。。以下です。このときに何とかして変化を検知したいわけです。

f:id:ke_takahashi:20180615193956j:plain

ちなみにカメラから見た画像は以下の通りです。

f:id:ke_takahashi:20180615195953p:plain


まず、考えたのがOpenCVライブラリを利用したBlob検出です。

Romoが前進することでBlobの中心座標が少なからず移動するだろう。。。という期待です。絵にすると以下。

f:id:ke_takahashi:20180615194932p:plain

実際にプログラムを作ってやってみたのですがうまく検出できませんでした。

原因はプロジェクタとカメラが同じ方向から対象を見ているため、Romoが遮光することで多少、ドットが大きくなるのですが中心座標が大きく変化することはない、ということだと思われます。対策として、プロジェクタとカメラの位置を離すことで検知できそうですが。。。構成が複雑になるので避けたいところです。

次に試したのが、画素の情報です。

ちなみに画素はBlob検出などして座標を計算するのですが、今回の場合はドットを表示する画面上の座標をプログラムで決めていますので、この座標系をカメラの座標系にマッピングすることで位置が一意に決まります。Blob検出する必要がない分、計算負荷を減らせます。単純ですが思いついてよかった。。。

毎フレームごとにカメラのドットの中央部の画素を取得し、Processingのbrightnessとhueとsaturationを適用して、Romoの遮光前と後の値を調べてみました。

結果は以下です。

遮光前* 遮光後*
brightness 255 255
hue 127 157
saturation 12 170

brightnessは前後でほとんど変わらずでした。

hueは30程度増えるのですが、遮光前の状態でなぜか127と0をいったりきたりして安定しません。これでは使えそうもありませんでした。

最後のsaturationはバッチリです。安定しています。数値の変化も大きいので使えそうです。ただ、アタリマエですがRomoの白い部分に当たると12くらいになりますのでそこでは検知できません。それでも青い部分やキャタピラのグレーの部分でも変化が大きくでましたので検知に使えそうです。

ということで、saturationで行きたいと思います。

とりあえず今日はここまで。

モバイルプロジェクター比較

極小規模な(卓上)プロジェクションマッピングをするときに使えるプロジェクターがないかといろいろ検討して以下の2つを購入してみました。

どちらも1万円以下ということで個人でも購入しやすいのが特徴です。

開封して点灯してみましたら。。。Vamvoの方は全然ダメ。。。大きい・暗い・映像調整が難しい。

何と比較しているかというと以下です。一昨年、これをゼミ室用に2台導入していました。もっといいのがないかな。。。と。

もう1つのDBPOWERも図体は大きいのですが。。。映像調整はまあまあやりやすそう。

実際に比較してみたのが以下です。

まず投影距離はASUSと同じくらいですね。

f:id:ke_takahashi:20180614195543j:plain

この状態で投影した映像が以下です。比較するなら同じ映像を使うべきでしょうけど。。。見た目すぐに差がわかります。明るさ・鮮明度?は共にASUSの勝ちです。ただ、差はそれほど大きくはないです。価格差が3倍近いことを考えると問題ないレベルとも言えます。

f:id:ke_takahashi:20180614195626j:plain

本体の大きさの差は以下です。ASUSの方が小型ですね。。。明らかに。据え置きにするなら気にならない差とも言えます。

f:id:ke_takahashi:20180614195655j:plain

で、最後にデータはないのですが、参考まで書きますと、動作音(ファン)が全然違います。

ASUSの方が断然静かです。DBPOWERはかなり煩い。静かな映画を見るのは無理でしょう。。。私の用途はそれではありませんので気になりませんが。

ちなみにASUSはバッテリー駆動なので電源がなくても動きます。かなり長時間。今回購入した2台はいずれもバッテリー駆動できません。室内で据え置きでしかつかえません。

ASUSすげ、ということでした。。。短焦点でそれなりに明るいプロジェクターないかな。。。SONYのやつはいいですが。。。高いし暗そう。。。というのが気になって導入できていません。

とりあえず作業ログでした。

ヘアアイロンとヒヤリハット

ヒヤリハットについて授業をすることがあって、各自にヒヤリハットを考えてもらったら、以下のような回答があった。

朝、ヘアアイロンを使っていて放置していたら、小さな妹が触って火傷しそうになった。

ヘアアイロンを使ったことがないので。。。どういうものか、そもそもなぜ必要なのかもわかりませんが、危険だな。。。とそのときは思ったものでした。

で、今朝。

娘が登校のため洗面台でヘアアイロンを使っていたらしく、寝ぼけていたのか、目に当ててしまったらしいのです!?

見ると角膜?が少し濁った状態になっていました。

眼科に行って診察してもらったところ自然治癒するそうで点眼薬をもらい帰宅したとか。

我が家では、朝に娘たちがヘアアイロンを起動?したままトイレに行ったり。。。危険だな。。。と何度か注意したことがあったのですが、ググってみると火傷したという事例はたくさんあるようです。

ヘアアイロン 怪我 - Google 検索

リンクはしませんが、火傷しないタイプのヘアアイロンもあるようですが。。。まだまだ主流ではないようです。

ヘアアイロンは熱源体が剥き出しの構造になっていると思います。

ちょっと置き方を間違えると、火傷はもちろん、出火して延焼する可能性もあると思います。

あれってどうにかしようということにはならないのでしょうか?

ただヒーターを入れた構造になっているはずで、価格的には安いものなんでしょうけど、いまならセンサーをいれて人間の皮膚がヒーターに接触したら温度を下げるとかスイッチオフにするとか。。。

瞬間的に冷却することは無理でしょうから多少の火傷はするかもしれませんが、大事故には至らないと思います。

車のペダルの踏み間違いと同様に、技術でフールプルーフ的なことができるはずで、そのためのコスト上積みは多少はしかたがないと思います。

小さい子のいる家庭、うっかりさんを自覚している人はその商品を選択して買うのではないかと。

使わない身ではいかんとも説得力のないエントリーになりましたが、そういう事例があるという1つの情報として書き残しておきたいと思います。

技術で何とかできるなら何とかすべき、ということです。

PowerPoint 2016 (mac) で起動時に自動保存ファイルが開かれるのが困る件の対応

症状

自動保存ファイルに対して何をしても、Powerpoint起動時にこの自動保存ファイルが開かれます。。。ウザい。。。

今日、通勤中に仕事をしていたのですが、これの調査のせいで30分くらい無駄にしました。。。やめて〜という感じ。

対処はこちらに書いてあったのですが、うまく行かず。。。こちらを参考にしました。


対処方法

ターミナルを開いて以下のフォルダに移動します。そこに自動保存されたファイルがあるはずですので、そのファイルを削除すればPowerpoint起動時に自動保存ファイルが立ち上がることはなくなります。

/Users/$USER/Library/Containers/com.microsoft.Powerpoint/Data/Library/Preferences/AutoRecovery

以上です。

<補足>2,3次情報になりますが、サクっと検索して対処できるようにまとめたつもりです。もちろん自分用。