粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

黙れナレーター(Windowsのナレーター機能を完全封印する)

Introduction

メロスは激怒した。かならず、かの 邪智暴虐 ( じゃちぼうぎゃく ) のナレーターを除かなければならぬと決意した。メロスにはコンピウタがわからぬ。メロスは、ただの学生である。けれどもWindowsの無用なクソ機能に対しては、人一倍に敏感であった。

邪智暴虐のナレーター

今回の殲滅対象である。降臨方法は「Ctrl」+「Windowsキー」+「Enter」である。
降臨後はSAN値がすり減る前に速やかに再度同じコマンドをうって消滅スべし。
https://support.microsoft.com/ja-jp/help/17173/windows-10-hear-text-read-aloud

ナレーターの倒し方

Windows8の場合は以下の記事を参照。
うっとうしいWindowsの「ナレーター」を完全に無効化する方法 | TeraDas-テラダス

本記事ではWndows10のナレーターを討伐する。
Windowsキー」+「r」を押して以下のwindowを出現させ「regedit」とうってEnter。
https://www.top-password.com/blog/wp-content/uploads/2017/04/regedit.png

以下のようなレジスタの「HKEY_CURRENT_USER\SOFTWARE\Microsoft\Narrator\NoRoam」へとたどり着く。
https://www.top-password.com/blog/wp-content/uploads/2017/06/disable-narrator-shortcut.png

赤で囲ってある箇所をダブルクリックして以下のように値を書き換える。
https://www.top-password.com/blog/wp-content/uploads/2017/06/WinEnterLaunchEnabled.png

これでナレータのショートカットを無効にしたことになる。

ナレーターは二度死ぬ

ショートカットを無効にした所で奴の本体は生きている。追い打ちをかけるべし。
「C:\Windows\System32」からNarrator.exeを探し出す。

右クリックで「プロパティ」を開くと以下のような画面が出る。

「セキュリティ」のタブを開いて「詳細設定」をクリック。
f:id:ossyaritoori:20180222172815p:plain

以下のように赤枠がUsersになっていれば「OK」を押して戻る。
「TrustedInstaller」など他のものになっていれば権限を変更しに行く。
f:id:ossyaritoori:20180222172600p:plain

権限を変更するには「編集」を押して出て来る以下の画面をひらき,赤枠に「Users」とうったのちに右側の名前を検索をタッチ。
うまく行けばさっきの赤枠内に自分のユーザ名が表示される。
f:id:ossyaritoori:20180222172434p:plain


そしたら以下の画面に戻って,「編集」の所をクリックして
f:id:ossyaritoori:20180222162116p:plain

次のように読み取りと書き込みに無効と設定する。
https://www.top-password.com/blog/wp-content/uploads/2017/06/deny-execute-narrator.png

これにて終劇。
ナレーターは死んだ!もういない!


勝利のBGMに酔うと良い。
www.youtube.com

MATLABでパーティクルフィルタ

流石に適当に書きすぎたか
この辺の分野はどの専門を土台にするかでかなり説明などが変わってきます。
私は制御&ロボティクスが半々くらい。EKFやベイズの定理などはすでにMasterしているものとします。
(ていうか説明しない)

基礎は確率ロボティクスで勉強しよう。

確率ロボティクス (プレミアムブックス版)

確率ロボティクス (プレミアムブックス版)

ちなみに英語版のドラフトは以下のURLに落ちています。
https://docs.ufpr.br/~danielsantos/ProbabilisticRobotics.pdf
書籍版と比べましたが書籍版の方が洗練されてますね。英語読むの辛いし。

パーティクルフィルタとは

ベイズフィルタの亜種。状態推定に必要な確率分布を数式ではなく,多数の粒子群の集合として表現する手法です。
粒子の数を増やせば実質どのような分布でも表現でき,状態方程式とノイズの分布がわかっていればどのような関数でも同じように実装できるのが強み。


wikiを見るか以下の説明が簡潔かと。
なお,『カルマンフィルタもパーティクルフィルタも全部ベイズフィルタで説明がつく』という説明が美しいのでやはり上記の確率ロボティクスの本を読むことをおすすめします。
パーティクルフィルタ - おべんきょうwiki - アットウィキ

実装などについては以下のサイトが参考にしやすい。
Tutorial/Practice0 – MIST Project

Pythonの実装例でよければ確率ロボティクスを和訳した上田先生が公開しているモンテカルロ自己位置同定の話なんかが実装の参考になることでしょう。
github.com

後は鏡先生のスライドとかも参考になるか?
http://www.ic.is.tohoku.ac.jp/~swk/lecture/ic2012/kagami_ic20120710.pdf


matlab実装

というかMATLABの実装もAtsushiさんがやってくれてます。自己位置同定に関してはこれを使えば良いでしょう。
Particle Filterを使用した自己位置推定MATLABサンプルプログラム - MyEnigma

もう少し汎用的な話なら以下のブログがわかりやすいかと思います。式はいくつかこのブログから拝借してます。
satomacoto: Pythonでパーティクルフィルタを実装してみる

ちゃんとわかりたかったらやっぱり教科書を読みましょう。あれはやはり名著です。

各々の粒子は状態,重みをもつ。

状態推定

各々の粒子はそれぞれ自分の状態,重みをもつとします。

状態推定はEKF等と同じ流れで,状態方程式に基づいて各々の粒子を遷移します。
「各々のパーティクルごとに更新をするという点」と「実際に乱数を与えてノイズも加える」という点が少し違います。
f:id:ossyaritoori:20180204022446p:plain

まぁモンテカルロって言ってますしね。実際に試していくわけです。

観測に依る更新

一方,状態更新の際には尤度を使って更新します。
f:id:ossyaritoori:20180204023057p:plain

このp(Y|X)というやつが曲者ですが,ノイズをガウス分布と仮定するなら次のように書けます。
この更新に使う尤度は次のように計算します。(1次元の場合)
f:id:ossyaritoori:20180204023305p:plain

ここで,p(Y|X)は相対的な値がわかればよいです。
なぜなら,この後,全てのParticleに対して尤度を元に重みを更新しますが,更新した重みの和が1になるように正規化します。
従って,どうせ後で割り算でつじつま合わせの補正がされるので余計な計算はしなくて良いということですね。

ここが気味が悪いと思う人はやはり教科書を(ry
これもわかりやすく説明するのは他の人に投げたい。

個人的な解釈

解釈の例を載せておきます。間違っていたら指摘してください。

非線形出力方程式として
Y = g(X) + ⊿
とでもしてみましょう。g()が非線形関数の出力で⊿が平均0,分散σ×σのガウス分布とします。
はてな形式で数式をうつのはだるいのでこれで勘弁

g(X)を左に移行する式変形をするとつまるところ,Y-g(X)は平均が0で分散がσ^2のガウス分布に従うことになります。
そしてガウス分布の式はWikiより次のように表せます。
f:id:ossyaritoori:20180204023733p:plain

このxの代わりにY-g(X)をぶち込んだ分布にXとYは従うということです。
つまり特定のXの時に特定のYを取る分布p(Y|X)はまさにこの分布に従うということです。
うーん,うーん,また教科書読み直してきます。
深夜に書いてて頭痛くなってきた。

リサンプリング

最後に新たに得られた重みの大きさに応じて粒子を再配置します。
パーティクルフィルタによる自己位置推定動作の可視化 - Qiita リサンプリングの項を参照。(孫引用で申し訳ない)

注意しないと確率の低めな粒子が全て淘汰されて推定値の集合が一点付近に収束してしまい,誤った値に収束して動けなくなったり,突然の外乱で値がずれたときに追従できなくなってしまうなどと言った問題が発生します。

これにも手法論がいろいろありまして
確率ロボティクス第五回 参照)

「系統抽出法」を使うのがおおかた妥当らしいです。
重みを元に領域を区切り直して再びばらまく&その際にランダム性を持たせて粒子の多様性を保存する的な意味合いです。

尤度の設定は重み付き平均でいいのか?

単峰性が確約されない場合重み付き平均は良くない場合も多いです。
以下のブログが非常にわかりやすい。
qiita.com

コード

応用例としてwikiの速度推定の話をしましょう。
カルマンフィルター - Wikipedia

速度がランダムウォークするとの仮定のもと,位置と速度の2つの状態を持つ状態を推定するという問題です。

コード置き場

例のごとくGistにあげました。リサンプリングとかはAtsusiさんのをほぼそのまま借りてます。ありがとうございます。

実装のコツ

クラスで作成しました。変数の状態等を内部できちんと管理するのにいいですね。
また,関数ハンドルとして状態方程式等を与えることに寄って,自分の設定した状態方程式に合わせた実装が容易にできるようにしました。
おそらく大体の関数においてこのコードは使用可能ではないでしょうか。

関数ハンドルにかんしては詳しくは「無名関数」でググってほしいですが

f=@(x,y)x+y

としたなら

f(x,y)
>> 5

という風に使えるものを関数ハンドルと呼びます。これで

state=@(x,u)A*x+B*u

とでも書けば状態方程式を簡単に定義できるというわけ。これは覚えて置いて損はないかと。

結果

なんかあんまり恩恵受けた感じしないですね。
とりあえず動いているのではなかろうか。
f:id:ossyaritoori:20180204164317p:plain

総評・所感

正直に言ってカルマンフィルタより実装が楽かというと全然そんなことは無いし,計算量もクソ重でした。
(これは行列演算ライブラリの利点を生かす実装をしなかったという点が大きいが)

一番困難なところはチューニングで,状態遷移のときのノイズをそれなりに大きく取らないとパーティクルがうまく撒けないし,
(追記:いや,これはどっちかというと初期値のバラまき方の問題というべきか。)
毎ステップでランダム要素が入るので,妙なことが起こるのではという不安もそれなりにあります。
そして周波数領域での設計とか超やりにくいじゃん!という致命的な制御屋の不満があったり,,,

何れにせよ多量のサンプルを用いて幅広い表現力を得た代わりにチューニングや設計のコツなども多分にややこしくなったというのが本当のところではないだろうか。

「パーティクルフィルタは簡単」との言はもっとロボットのローカライゼーションとかやる時に実感できるのかなぁ…

PDFの図をIPEで編集

前回に引き続きIPEの布教です。(今回はなぜかですます調)

ossyaritoori.hatenablog.com

IPEの強い点はLatexを用いた綺麗な作図を直接PDFで生成/編集が可能というところでした 。
ところが,IPEは任意のPDFを開けるというわけではなく「IPEで作ったPDFしか開けない」という足かせがあります。

PDFをIPEで開けるようにする

はい,実はIPEをインストールしたbinの中に「pdftoipe.exe」と「ipetoipe.exe」というファイルがありましてそいつらを使えばPDFをIPEで扱える形式に変換可能です。
Matlab · otfried/ipe-wiki Wiki · GitHub

手順は以下の2stepです。

pdftoipe.exe file.pdf file.xml
ipetoipe.exe -pdf file.xml file.pdf

最初の行でPDFをIPEで開けるようにして,次の行でPDFとして保存し直しています。
まぁ編集するだけなら最初の行だけで良さそう。

具体例:MATLABの図

以下の図は僕が昔matlabで作った図です。
f:id:ossyaritoori:20180129205817p:plain

いろいろ突っ込みどころはありますがこれをIPEで開くと次のようになります。
f:id:ossyaritoori:20180129210008p:plain

TextBoxの区切りがちょっと変になったりξが文字化けしてνになっていますがこれは再編集すれば治ることです。

再編集した結果がこちら。
字体やフォントの違いなど注意事項はありますがIPEの強さがわかっていただけたかと思います。
f:id:ossyaritoori:20180129210605p:plain

ちなみに捏造っぽいこともできます。
良い子のみんなは真似しないように
f:id:ossyaritoori:20180129210850p:plain

他の具体例も暇があれば試します。

PDFのCropping

PDFの余白切り抜きも思いのままです。
f:id:ossyaritoori:20180130002926p:plain
上のように外苑の赤枠を加工することで,PDFの余白を削れます。

以下の記事で紹介したBrissよりはるかに高性能なので図の余白調整にはこちらを使うことにします。
ossyaritoori.hatenablog.com


batファイルの作成

毎回コマンドをうつのはだるさの極みな(環境変数などもだるい)のでbatファイルで自動化をします。

PDFをIPE形式に変換して開く(一行目のみの実装)

とりあえず以下のファイルに適当な名前を着けて保存します。
私は「openPDFinIPE.bat」という名前にしました。

「set INPUT= %1 」でドラッグ&ドロップしたファイルのパスを取得
ファイル置換を用いて変換後のファイル名を生成しています。

使用する際には最後2行のIPEのpathをキチンと書き換えてください。

@echo off

echo FileName is ...

set INPUT= %1
set FNAME= %INPUT:.pdf=%
set IPE_FILE= %INPUT:.pdf=.ipe%
set OUTPUT= %INPUT:.pdf=ipe.pdf%

echo %INPUT%

C:\Users\YOURNAME\Desktop\ipe-7.2.7\bin\pdftoipe.exe %INPUT% %IPE_FILE%
C:\Users\YOURNAME\Desktop\ipe-7.2.7\bin\ipe.exe %IPE_FILE%

後はbatにドラッグアンドドロップすればipeでファイルを開くことができます。
ショートカットを作ってデスクトップとかに置くのもありか?

IPEでブロック図を書く

どうも。ですます調とである調が気分によって変わる男です。

IPEとは

PDF等を加工できる描画ソフト。
今回の使用目的としては「Latexが使える強いInkscape」とでも思ってくれれば良い。

導入

以下のサイトからダウンロード,解凍すること。
The Ipe extensible drawing editor

インストールは要らず,解凍したらすぐ使える。

動画

インド英語で聞きとりにくいという噂
www.youtube.com

簡単なブロック線図を書く手順

起動すると以下のような画面が出てくる。今回気をつけるであろう所に赤◯を着けた。上の◯はグリッドのサイズ調整なので無視してくれて良い。
また,グリッドが表示されてない人は左上から数えて5番目の田みたいになってるアイコン(「Snap」の真下)をクリックしてくれ。
f:id:ossyaritoori:20180126114014p:plain

ブロックを書く

箱を書くところだが以下のように箱のマークをクリックしてグリッドをクリックすることで描画が開始できる。
グリッドが荒く感じたら上の16ptとなっている所をいじろう。
f:id:ossyaritoori:20180126114406p:plain

左上と右下の2点のみを指定すればブロックが書ける。

テキストオブジェクトを挿入

テキストオブジェクトは当然「A」みたいになってるアイコンから呼べる。
f:id:ossyaritoori:20180126115141p:plain
上のような画面が出てくるが,
①で普通の文とLatex数式環境を選択でき,
②で文字サイズ(ただしTex形式)を変更可能。今回はLARGEを使用。

各コマンドの具体的な大きさはLaTeXコマンド集 - 文字サイズを見てくれ。


なお,①で普通の文を選んでも$で囲めば数式環境になるので気にならない。
このウィンドウは右クリックMenu最下段でも呼べる。

テキストオブジェクトの位置調整

IPEはこのグリッド上でしかオブジェクトを移動できないらしい。
しかもデフォルトではこのオブジェクトの位置の基準が左下にあるのでどうやっても綺麗に並ばない。

  • 右クリックで「Horizontal Alignment」→「hcenter」
  • 右クリックで「Vertical Alignment」→「baseline」

として基準を真ん中に持ってくることで解決。

左が提案手法で右がデフォルト。
f:id:ossyaritoori:20180126120240p:plain

矢印でつなぐ

線を呼ぶオブジェクトをクリック。
始点はクリック1回。終点はクリック2回。
その際以下の赤線で囲った所をクリックして矢印オブジェクトを指定する。
f:id:ossyaritoori:20180126120709p:plain

丸を付ける

フィードバックなどの結合部に◯を書くには以下のような,中心と円周を指定して円を描くモードを使うと良い。
この際上のグリッドを細かくしておかないといい大きさの◯が書けない。
f:id:ossyaritoori:20180126135021p:plain

ファイルの保存とエクスポート

ちなみにこんな感じになる。
f:id:ossyaritoori:20180126141227p:plain

ファイルの保存

左上のFileからSaveを押す or Ctrl+S で保存可。
この時点でDirectにPDFまたはxmlとして図を保存できる。

基本的にPDFで保存するのが良さそうだ。(xmlで保存するとCUIでデザインを変更しやすいとかなんとか)

PDFで保存

PDFで保存すればTexにそのまま貼れるのでPPTで作る際の「EMF→EPS→DVI変換」というクソ面倒なチェーンを組まなくて済む。
また,IPE形式で作成したPDFはそのままIPEで編集可能。

これは結構論文図作成界隈では重要な事項なのではないだろうか。

エクスポート

左上のチェックボックスからエクスポート先を選べる。デフォルトではEPSとPNGの二択。
PNGは時々使うかもしれない。EPSはPDF保存が出来るので必要なさそう。



ちなみに極めるとこれでスライドも作れるらしく,Beamerより良いという説もあるらしい。
使いながら見極めたい。

基本操作や小技など

上のメニューのModeという所から選択モード,並進移動モード等が用意されている。
詳しくはマニュアル参照。
http://simtec.jp/IPE7Manual_JPN.pdf

移動などのショートカット

オブジェクトの移動にはAltを押しながらドラッグする。
他にも覚えておくと操作が楽になるショートカットがあるので適宜覚えて置くと良い。
f:id:ossyaritoori:20180126140351p:plain

プリアンブルの作成

「Edit」→「Document Propaties」からTexのプリアンブルを変更可能。

MATLABのFigureからの連携?

Matlab FigureをTexで使えるTikzに変換する的なやつ。これ関連してたかどうか記憶にないが同カテゴリとして認識しているので加えておく。
https://jp.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz-matlab2tikz

PythonでYoutube動画検索

以下を参照。
Google API Python Clientを使ってYouTube Data APIv3をいじる - Qiita

APIを許可する

Google Cloud Platformにアクセスして,新しいプロジェクトを作成。
Youtube Data APIを入れる。

YouTube Data API の概要  |  YouTube Data API (v3)  |  Google Developers


パッケージ導入

ここを元にYoutubeに関するAPIのパッケージを導入。
Installation  |  API Client Library for Python  |  Google Developers

pip install --upgrade google-api-python-client

管理者権限で実行することを忘れずに。

サンプルコード

サンプルコードはこちらから。
Python コード サンプル  |  YouTube Data API (v3)  |  Google Developers

使ったのはYoutube検索API。なんとなく構造がわかったのでそれでよし。
適当なキーワードを入れて動画を検索し,その結果を表示。
動画とプレイリスト,チャンネルを区別できる。

APIのKEYを含めることを忘れずに。

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 21 23:38:58 2018

@author: Edwin Ri
"""

#!/usr/bin/python

from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.tools import argparser


# Set DEVELOPER_KEY to the API key value from the APIs & auth > Registered apps
# tab of
#   https://cloud.google.com/console
# Please ensure that you have enabled the YouTube Data API for your project.

DEVELOPER_KEY = "ここのKeyは最初に取得したAPIキーを用いること。"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

def youtube_search(options):
  youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
    developerKey=DEVELOPER_KEY)

  # Call the search.list method to retrieve results matching the specified
  # query term.
  search_response = youtube.search().list(
    q=options.q,
    part="id,snippet",
    maxResults=options.max_results
  ).execute()

  videos = []
  channels = []
  playlists = []

  # Add each result to the appropriate list, and then display the lists of
  # matching videos, channels, and playlists.
  for search_result in search_response.get("items", []):
    if search_result["id"]["kind"] == "youtube#video":
      videos.append("%s (%s)" % (search_result["snippet"]["title"],
                                 search_result["id"]["videoId"]))
    elif search_result["id"]["kind"] == "youtube#channel":
      channels.append("%s (%s)" % (search_result["snippet"]["title"],
                                   search_result["id"]["channelId"]))
    elif search_result["id"]["kind"] == "youtube#playlist":
      playlists.append("%s (%s)" % (search_result["snippet"]["title"],
                                    search_result["id"]["playlistId"]))

  print("Videos:\n", "\n".join(videos), "\n")
  print("Channels:\n", "\n".join(channels), "\n")
  print("Playlists:\n", "\n".join(playlists), "\n")


if __name__ == "__main__":
  # 検索ワード
  argparser.add_argument("--q", help="Search term", default="ベートーベン")
  # 検索上限
  argparser.add_argument("--max-results", help="Max results", default=10)
  args = argparser.parse_args()

  try:
    youtube_search(args)
  except HttpError as e:
    print("An HTTP error %d occurred:\n%s" % (e.resp.status, e.content))


結果はこんな感じ。

Videos:
 ベートーベン メドレー 長時間 BGM No.1 (JdjNRU9QtnQ)
ベートーベン ピアノソナタ メドレー (Uuws9GxHnpQ)
ベートーベン作曲 交響曲第6番「田園」 (DZJHWkk0x7I)
ベートーベン『運命』交響曲第五番第一楽章 (PTr1v1ksWkQ)
The Best of Beethoven (W-fFHeTX70Q)
ベートーヴェン 交響曲第七番 小澤征爾 1975ライブ (tbVsJcX8V5w)
ベートーベン・ピアノ協奏曲第5番「皇帝」 (o5fNRKUOsco)
Beethoven 9 - Chicago Symphony Orchestra - Riccardo Muti (rOjHhS5MtvA)
【作業用BGM】 ベートーヴェン 名曲ピアノメドレー 13曲 (mE0WsSxB-T0)
Symphony No. 9 ~ Beethoven (t3217H8JppI)
Beethoven: Symphony No. 7 - Royal Concertgebouw Orchestra & Iván Fischer (-4788Tmz9Zo)
Beethoven - Moonlight Sonata (FULL) (4Tr0otuiQuU)
Beethoven: Symphony No.6, "Pastorale"; Jarvi, DKB (iQGm0H9l9I4)
ベートーヴェン「月光」 Beethoven "Moonlight Sonata" (-uVmGm9yiGg)
Beethoven "Moonlight" Sonata op 27 # 2 Mov 3 Valentina Lisitsa (zucBfXpCA6s)
ベートーヴェン 歓喜の歌 交響曲第九番 Beethoven Symphony No 9-video part1- (SKWm4SWzDjg)
Beethoven: Symphony No.2; Jarvi, DKB (VAnjfp7vUvA)
ベートーベン 月光ソナタ 全楽章 (xOMetY6Y-AA)
Beethoven Pathetique Sonata - 2nd mov 「悲愴」2楽章 Eric Heidsieck (bE2Zok2eL1Q)
ベートーヴェン 第9 合唱 『歓喜の歌』訳詞付 Choral "Ode to Joy" Beethoven (iU5av55T2Yk)
ベートーヴェン:交響曲 第6番 「田園」 ワルター/コロンビア響 Beethoven Symphony No.6 (byayR-OnN3U)
Beethoven: Symphony no. 3 Eroica - Philippe Herreweghe - Full concert in HD (kwRVR-TmKYw)
ベートーヴェン ピアノ・ソナタ 第8番 「悲愴」 バックハウス Beethoven: Piano Sonata No.8〈Patheyique〉 (-JpkaNWdJDA)
Wilhelm Kempff plays Beethoven's Moonlight Sonata mvt. 3 (oqSulR9Fymg)
ベートーベン - トルコ行進曲 (SexvTXYNcjY)

Channels:


Playlists:

もう少し詳細な説明

Search  |  YouTube Data API  |  Google Developers
メソッドが返すのは次のようなJSONで表されるデータ形式

{
  "kind": "youtube#searchResult",
  "etag": etag,
  "id": {
    "kind": string,
    "videoId": string,
    "channelId": string,
    "playlistId": string
  },
  "snippet": {
    "publishedAt": datetime,
    "channelId": string,
    "title": string,
    "description": string,
    "thumbnails": {
      (key): {
        "url": string,
        "width": unsigned integer,
        "height": unsigned integer
      }
    },
    "channelTitle": string
  }
}

ちょっと使ってみたんですけどいろいろ勉強すべきことが多くて面倒っぽいなぁ

font "Times-Roman" of type "Type 1" is not embedded の解決

W32Texのフォント修正について。
上記Texインストーラ3を使っている人に起こり得る学会提出時のエラーです。

TeXインストーラ 3は非常に簡単にTex環境を構築できる便利ツールですが,
フォントの設定をおかしくしてしまうという不具合が2018年1月現在確認されています(インストールしたのは2015年ですが)。

具体的にはここを参照。
PDF を生成したとき txfonts を使った TeX 文書でフォントが変わる問題の対処法メモ - Ichiro Maruta Homepage

解決策

w32texを使っている人は
C:\w32tex\share\texmf-dist\dvipdfmx\config\dvipdfmx.cfg
のファイルを開いて

f  txr2.map

の1文を加えれえば良いです。

anacondaやpipでSIFTやSURFを使う

Windows側のAnacondaで環境を改変したのでメモ。

OpenCVでSIFTが使えない問題

出るよね。こういうエラー。

module 'cv2' has no attribute 'xfeatures2d' anaconda

OpenCV3以降になってからSIFTやSURF等のライセンスが必要な奴らはcontribというExtensionみたいなフォルダに分離され,普通のインストールでは入らなくなっています。
解決法はcontribを自分でコンパイルするか,誰かがコンパイルしたのをいただく事。

なお,2017年12月のROS Kinetic のモジュールにはきちんと含まれています。
なのでウチのUbuntuPCでは大丈夫。
問題はWindowsのPCでおこりました。

セットアップ内容は以下を参照
ossyaritoori.hatenablog.com

Anacondaでの解決法

以下を参照。contribを含むパッケージを探します。
OpenCV 3(core + contrib)をWindows & Python 3の環境にインストール&OpenCV 2とOpenCV 3の違い&簡単な動作チェック - Qiita

以下の通りでダウングレードはしましたが無事使えるようになりました。

conda install -c https://conda.anaconda.org/menpo opencv3

pip 使いのための解決法

普段pipを使っている人はこちら。

pipとAnaconda併用するとわけわからない事になりがち。
どうもVerの新しい方が優先されるっぽい?

contribも別で配布しているので両方入れるには以下の様にやります。

pip install opencv-python
pip install opencv-contrib-python

どう使うか

マッチングのやり方とかは公式OR以下の例を参照。
ossyaritoori.hatenablog.com