ぷろぐ((>ω<))スマートフォン用の表示で見るぷろぐ((>ω<))ぷろぐらみんぐ関係のメモこの広告は、90日以上更新していないブログに表示しています。2019-09-22マウスカーソルを見失ったときに所定の場所に強制移動させるWindowsマルチディスプレイしているとマウスカーソルを見失うことも多いが、そのたびにマウスをバタバタと左右に動かして画面のどこにあるか探す時間が勿体ない。そこで、マウスカーソルが画面上の所定の位置に来るようなbatを作成した。これをpathが通るところにおいて、Winキー→bat名入力で即座にマウスカーソルを取り戻す。画像処理OpenCVにはcv::cornerSubPixという関数があるが、これの原理に関する説明が非常に簡素でわかりづらい。documentation上記ページに書いてある3つの式の意味についてまとめる。向かう画像勾配と直交する」にあたる部分。これについては下記記事がわかりやすかった。Shack式2について式1から式2の間がちょっとぶっ飛びすぎているし、いろいろと間違っていると思う。式2から消えてなくなっているが間違いだと思う式1~式2の間には次の論理が省略されていると思う。一言で言えば「二乗誤差の最小化」である。二乗の総和をEとする。ゼロになるときである。よって、と書き換えられるので、これを展開すると(★)この左辺が式2である。書かれてしかるべきだと思う。いう言葉が出てくるが、次の論理が省略されている。依存しないので、ここで、と置くと、上述の式は次のように書き換えらえる。はとなり、式3となる。(Japanese)この問題の発生原因は人それぞれかもしれないが、私の場合は「右Windowsキー」が押しっぱなし状態と判定されていることが原因だった。ちなみに使っているキーボードには「左Windowsキー」しかなく、当然「右Windowsキー」を押した覚えはない。今時「右Windowsキー」のついたキーボードの方が珍しいはずなおWindowsに標準でインストールされているソフトウェアキーボードも「左Windowsキー」しかないので、解消できない。キーボード入力をシミュレートするツールで「右Windowsキー」を話したことにして対処。(0x5C)をWM_KEYUPさせるPowerShell(恐らくだが)原因はキーボードの誤動作。Aキーを押すと変な動作をするetcネットで調べても同様の症状の人は世界中でいるようである。h」と入力したら他の人も検索しているみたい。suggestion実際いくつかの質問サイトでQ&Aがあるが、人それぞれ原因は違うようでいろんな対策が載っている。教えて!gooWindows7でC、V、Hキーが効かない現象が発生します。Easyちなみに私は検索して出てくるやつでは一向に改善しなかった。これまでは、しばらく我慢してたらどういうわけか直ったりしていた。(いつか直るまでどうにも我慢できないときは、一度ログオフしたり再起動したりしていた)ちょっと真面目に原因を探ろうと思い、何か特殊キーが押された状態になっているのではないかと仮説を立ててキー入力状態を見てみたら、当たりだった。SFM過去のエントリではWindowsへのインストール方法をまとめたが、今回は論文から理解したことをまとめる。数学的な細かな話は最小限に抑え、私なりに要点だけまとめる。間違ってるところがあるかもしれないので随時修正していくつもり。最小化されるように、カメラ位置姿勢や3D点座標の微小修正を繰り返すDSOの手法これに対して、DSOは入力画像群に対して最初から直接バンドル調整(BA)を実施しているイメージ。)ちなみに、処理対象とする画像:キーフレーム(KF)や3D点群を随時不要になったら削除するなど上手に管理するところにもテクニックがありそうだ。※画像/画質処理屋さんのセンスのままで考えると理解できないかも。DSOは数学の塊で成立しているイメージ。数学屋さん的センス前提条件Webカメラやスマホカメラのような「人の目に美しく映るような画像」ではなく、「マシンビジョンにとって最適な画像(やカメラ)」であること。逆関数DSOの嬉しいところ従来の特徴点方式SFM/SLAMは所謂「コーナー」を3D化するに留まるが、DSOは処理方式の違いから「エッジ」も再構成しやすいつまり従来方式より多くの3D点を生成しやすい今後より技術的に詳しく見ていこうと思う。SFM最終出力として2画像間の特徴点の対応関係を求めたいという場合、その方式には大きく2種類がある。この観点からまとめられている記事をあまり見た事がないので投稿。マッチング」と検索すると引っかかるのは大体この方式のこと。ブロック図にすると下記のようになる:BlockDiagramつまり、処理手順としては双方の画像で「特徴点」を見つける双方の画像で見つけた特徴点について「特徴量(特徴記述子と言ったりもする)」を求める双方の特徴量を比較して一番近しい(似ている)ペアを見つけるという流れ。特徴点抽出手法や特徴量記述手法にはいろんなものが提案されている。etc...大抵の特徴点抽出手法や特徴量記述手法はグレースケール画像に対して実施するが、RGB画像をそのまま使用するものもあるようだ。SIFTに色情報を追加する論文がいくつか見つかる。処理が理解しやすいように、ブロック図にイメージ図も付け足すとこんな感じ:BlockDiagramちなみに近しい特徴量が複数ある場合はマッチングに失敗することもある。こんな感じ:マッチング失敗の例このような誤マッチングの回避策として、例えばOpenMVGでは下記のようなチェックがなされている:誤マッチングの回避策つまり特徴が突出しているわけではなければ、マッチング不成立としよう、という考え方。他にも、双方向にマッチングしてみて、結果が1対1対応しなければ、棄却する、などという手法もある。計算量が増えていってしまうところが悩みどころ。オプティカルフロー方式(疎)ここではLucas-kanade法を扱うこととする。説明の簡単化のためにPyramidの件は省略する。ブロック図にすると下記のようになる:疎なオプティカルフロー方式のブロック図つまり、処理手順としては片方の画像で「特徴点」を見つける片方の画像について「微分画像」を求める片方の画像の特徴点と微分画像ともう片方の画像から、特徴点の移動先を推定する(追跡する)という流れ。特徴点を追跡するので英語ではtrackingと言ったりする。matchingしているわけではない。「数学的に計算するとこれでできる」となる。処理が理解しやすいように、ブロック図にイメージ図も付け足すとこんな感じ:疎なオプティカルフロー方式のイメージ図オプティカルフロー方式でも誤った点対応(誤トラッキング)が発生する可能性がある。具体的には「同じような模様の繰り返し」である。Windows上でTUMのデータセットを使って動かしたくトライ。本家Gitは下記だがLinux/Mac前提。OdometryこれをWindows向けに移植したforkがあったので、これを使う。Odometryしかし手元の環境ではすんなりビルドができなかった。上記Win版DSOは下記の環境でのビルドを想定しているようである。2015x86版Releaseモードのみthirdpartyの準備まず、thirdpartyはx86を前提として準備されている。自分で全部やりなおすのが面倒だったので、同じくx86で行くことにする。READMEによると、cmakeしたときに依存ライブラリのパスをそれぞれ設定すればOKと書いてあるが、一部はそのままではうまくいかなかった。link_directories()で手動設定。ちなみにこの3つがないと、dsoのコアライブラリまではビルドできるが、それを使ったアプリ(dso_dataset)がビルドされない。v141)だが再ビルド不要らしい。VisualStudio2017でDSOをビルドするなら、v141のライブラリじゃないとダメだった。そのため、Boost1.66を別途x86でビルドしてリンク。PangolinのビルドReleaseモード普通にビルド。私はOpenNI2を入れていた関係でそれ関係のビルドもONになってしまい、それがリンクエラーを誘発してしばらく詰まっていた。今回OpenNI2は使わないので、CMakeの段階でOFFにする(自動的に設定されたパスを削除してConfigureする)ことで対処。Debugモード(DSOをDebugモードで動かしたい場合は必須)DSO.slnとライブラリの種類を合わせないと、最後のDSOビルドでpangolin.lib関連で大量のリンクエラーが発生する。OpenCVのDebugモードビルド(DSOをDebugモードで動かしたい場合は必須)thirdparty/opencvにはRelease版しか入っていない。OpenCVはDebug時はDebug用、Release時はRelease用をちゃんとリンクしないとエラーになるので、x86のDebugを自分で別途ビルド。(配布されているPrebuiltなOpenCVはx64でしかビルドされていないので自分でビルドするしかない)libzipのビルドTUMのデータセットは入力画像をzipで固めているのだが、そのzipのまま画像を読み取れるようにするためにはlibzipが必要。libzipのビルドにはzlibが必要。いうことで何も考えずにWindowsでビルドできるよう環境がそろった下記を持ってきた。https://github.com/kiyolee/libzip-win-build.git上記gitのREADMEにも書いてあるが、zlib→libzipの順序でビルドする必要がある。その際、libzipのVSソリューション内のzlibへのincludeやlibのパスは自分の環境に合わせなおす必要があることに注意。後から気づいたが、Pangolinをビルドするとthirdparty/Pangolin/build/external/にzlibがビルドされているので、これを使ってthirdparty/libzip-1.1.1.tar.gzを解凍&ビルドすればよかったかも。DSOビルドようやくメインのビルド。これもそのままではビルドできない。zipオフライン映像を入力するよう改造1Win版forkではWebカメラで動かすように改造されているようなので、本家のmain_dso_pangolin.cppから該当箇所を逆移植。実際の改造コードの掲載はここでは省略する。画像読み込みのwhile文を削除し、本家からfor文を移植zipオフライン映像を入力するよう改造2src\util\DatasetReader.hの中のgetdir関数がPOSIX仕様なので、下記を参考に書き換え。files.size();}usleep削除main_dso_pangolin.cpp内にusleep()が使われているがWindowsでは使えない。WinAPIのQueryPerformanceCounter()に代替するのが正しいのだろうが、面倒なのでひとまず単純にコメントアウト。