まさかろぐ

プログラムのこと、DTMのこととか

gnuplotのグラフ配色のデフォルトを見やすいものに変更する

gnuplot、実験結果をグラフにしたりするのに便利ですよね。
plotコマンドとreplotコマンドで1つのグラフに複数プロットすることができますが、デフォルトの配色はだいぶ奇抜でなんか見づらいです。

そこで、今回はデフォルトの配色を変更して見やすくしたいと思います。

一応デフォルトで3種類配色が用意されているが…

デフォルトで用意されている配色はこれです。
set colorsequence [default/classic/podo]で指定できます。

「default」

最初の色が紫から始まっていたりして、割と奇抜な配色です…。
そのまま使うとパワポとかで比較説明するときに紫と緑で図を作ることになってアレです。あと黄色が見づらい。

「classic」

原色系です。昔のバージョンはこれがデフォルトだったらしい。
2色目の緑色と4色目の水色が特に見づらいです。あと6色目あたりからグラデーションが始まってしまっています。

「podo」

色覚障害のある方にも優しい配色らしいです。
それ自体は良いのですが、黒色から始まっているので2つのプロットを比べるときに黒と黄土色を比較することになってしまいます。
あと黄色が見づらい。

オレオレ改良版配色

個人的に見やすそうな配色を作成してみました。
以下の内容を~/.gnuplotへ書き込むと起動時に自動で読み込まれます。
(試してないけどWindowsの場合はC:\Users\ユーザー名\AppData\Roaming\GNUPLOT.INIに書けばいいらしい)

set linetype 1 lc rgb "#0070f0" lw 1
set linetype 2 lc rgb "#e36c09" lw 1
set linetype 3 lc rgb "forest-green" lw 1
set linetype 4 lc rgb "dark-violet" lw 1
set linetype 5 lc rgb "dark-pink" lw 1
set linetype 6 lc rgb "#00d0f0" lw 1
set linetype 7 lc rgb "#60d008" lw 1
set linetype 8 lc rgb "brown"   lw 1
set linetype 9 lc rgb "gray50"  lw 1
set linetype cycle 9

最初が青、次がオレンジなのでPowerPointで資料を作成したりするときにも使いやすい配色になっているかなと思います。

HSP3のpicload命令で画像ファイルが読み込めなかった時にファイル名を表示する

HSPで画像を読み込むときは通常picload命令を利用すると思います。
しかし、実行時に画像ファイルが見つからなかったら「内部エラー13」を出力してプログラム自体が落ちてしまいます。

スクリプトエディタからデバッグ実行しているときは行数なども出るのでまだマシですが、実行ファイルにした後は「内部エラー13」としか出ないのでかなり不便です。

解決策

プログラムの上の方にこのプログラムを差し込むと、picload命令が置き換わってくれます。

#undef picload
#module
#deffunc picload str filename
  exist filename
  if(strsize=-1){
    dialog "Cannot open image \""+filename+"\""
  }
  picload@hsp filename
  return
#global

ファイルが見つからなかった場合には「Cannot open image "(ファイル名)"」というダイアログが表示された後に内部エラーとなってくれるので、最悪どのファイルが欠けているかがわかるようになります。

1行目の#undef picloadでpicload命令を(グローバルスコープから)削除し、3~9行目で定義したpicload命令に差し替えています。
このやり方はpicload命令以外(noteloadなど)にも応用可能だと思います。

細かい注意点

内部でexist命令を呼ぶようになるので、picload命令使用時にstrsizeの値が変化します。使用する場合は、strsizeを使用する部分にまたいでpicload命令を入れないよう注意して下さい。

(まっとうなプログラム言語なら、ファイルが見つからなかったとしてもエラーにならずに例外が発生するので、try-catchでファイルが見つからなかった場合の処理が書けたりするはずなんですがね。。。あとなんでstrsize変数なんていうstaticな変数に結果を出力するんだろう(疎結合化できない)。。。)

K-Shoot MANIAのマイナーな機能 16選

マニュアルに書くのが面倒だったりして埋もれてしまっているマイナーな機能があるので、雑に紹介していきます。
Windows起動するのが面倒だったのでスクショはUbuntuです…(Wineで割と快適に動く)。

チップBTオブジェクトにDDR風の色を付ける

選曲画面でBT-C(Kキー)を押すと出てくるメニューの「NOTE SKIN」を「NOTE」にすると使用できます。

どこで使うねん。DDRマットを繋いで足で踏みたい時にでもどうぞ。

プレイヤー別にハイスコアを分ける

複数人で使っている共用PCとかだったりして、数人で交代しながらプレイすると、プレイヤーごとにハイスコアを別にしたいことがあります。

そのような場合は、scoreディレクトリに新しくフォルダを作ってください。

ゲームを再起動すると、BT-B(Dキー)とBT-C(Fキー)を同時押ししながら左右矢印キーでプレイヤーが選べるようになり、ハイスコアがプレイヤー別で保存されるようになります。

左下にいつも「PLAYER」と表示されていたのは飾りではなくて選択中のプレイヤー名だった訳です。

譜面動画作成用の連番png出力をする

kshootmania.exeと同じディレクトリにあるconfig.iniを書き換えます。

メモ帳で開くと、以下のような行があると思います。

「output=」の値を1にして上書き保存するとプレイ時に連番png書き出しされるようになります。

ただし、「output_path=」の保存先のディレクトリパスは存在するものを指定してください。「c:\output\」のまま行く場合はC:の中にoutputフォルダをあらかじめ作成しておいてください。

「output_downscale=」の値を上げると画像を縮小することができます。例えば2にすると、1/2の画像サイズになります。昔はドットが荒かったので、ウィンドウサイズを上げた上でこれを使うことで、画質を上げていました。

連番PNG画像を動画にできるソフトにはVirtualDubなどがあります。
ただし、音声を別録りしないといけない、音ずれを治すのが大変、などなどの面倒さがあるので、よほどPCスペックに困っていなければ使わなくていいと思います。
Windows10からOSデフォルトでWinキー+G押せば動画が撮れるようになりましたし。

選曲画面で譜面が入っているフォルダ名を表示する

だんだんマニアックになっていきます。

config.iniを編集して、以下の行を足してください。

viewfoldername=1

すると、フォルダ名が曲名の横にカッコ書きで出るようになります。

譜面公募で同じ曲名ばっかりで困ったときとかに役立ちます(たぶん)。

エディタで使えるエフェクトの種類を追加する(ユーザー定義エフェクト)

譜面ファイル(.ksh)をメモ帳などで開いて、例えば最後の行の後に次のような行を足して保存、エディタで開くと、音の低いFlangerエフェクトが選べるようになっています。

#define_fx LoFl type=Flanger;delay=80samples;depth=60samples

そのほかLaserオブジェクトでピッチ変更など、いろんなエフェクトが追加できます(が、テキスト編集しないといけなくて割と面倒)。

詳細は昔のブログ記事をご参照ください。

[K-Shoot MANIA v1.60] ユーザー定義エフェクトの作成方法
K-Shoot MANIA v1.60以降では外部ソフトウェア(REAPER)によるエフェクト書き出しが不要になったため、譜面データの配布にはmp3ファイルと譜面ファイルのみで良くな...

よほどのこだわりがなきゃデフォルトのやつでやりくりできると思うので、個人的にはユーザー定義エフェクト不要論を唱えておきます(過激派)。

レーンの拡大(視点変更)を一瞬で変化させる

直角レーザーなどに合わせて変更する時、視点を一瞬で変化させたい場合があります。

その場合は、半角セミコロン(;)で区切って2つの値を指定すれば、その瞬間で値を変化させることができます。

例えばTOPの値に「0;100」を指定すると以下のようになります。

一瞬とは言っても本当に一瞬で変わると不自然なので、多少滑らかに変化するよう調整されています。

直角レーザーとBOTTOMの値をセミコロンで同時に変えると割と合います。

譜面内でレーンを横に移動させる(zoom_side)

「ばねエフェクト」を使うと譜面でレーンを揺らすことができます(回転を入れた上でCtrl+クリックを2回押すと入れられます)。
しかし、揺らすだけじゃなく横で固定したいことがあるかも知れません。その場合、「zoom_side=」という行を譜面内に追加することでレーンを横移動することができます(マイナスで左、プラスで右にずれる)。

例えば「zoom_side=100」にした場合、以下のようになります。

複数入れれば0→100へ徐々に変化させたりなど、レーン拡大(視点変更)と同じように使えます。

エディタで挿入できないので、どこに入れたら良いか調べるのが大変かも知れません。
その場合、例えばエディタでTOPの値を123にするレーン拡大を追加した上で、メモ帳で「zoom_top=123」を検索し、zoom_sideの値を指定する行に書き換えるなどすればスムーズです(それでも面倒臭そう)。

エディタ上で確認すること自体はできます。「編集」→「選択範囲のレーン拡大をコピー」、「貼り付け」で一応コピペもできます。が、変更はできません(v1.66a時点)。

プレイ背景を自分で用意した画像に差し替える

これは譜面ごとに可能です。

まず、譜面のフォルダに背景に使いたい画像(推奨: 720x640px, JPEG形式)を入れてください。

次に、譜面ファイル(.ksh)をメモ帳などで開き、「bg=」の行の指定をファイル名に書き換えてください。

bg=(ファイル名).jpg

すると、譜面フォルダに入れた画像が使われます。

半角セミコロン(;)で区切ってファイル名を2つ指定すると、ゲージがクリアライン(70%)を超えた場合に別の背景を出すことができます。

同じように背景アニメーションも変更できます。その場合は「layer=」の行を画像ファイル名に変更してください。
アニメーション画像の作成はimgsフォルダ内のbgフォルダにあるgifファイルを参考にしてください。アニメーションGIFとかではなく、600x480pxの画像を横に任意枚数並べたものをゲージ70%未満・70%以上の2種類縦に並べたものです(つまりnフレームの場合(600*n)x960px)。

こだわりのある譜面パッケージとかだと独自背景を使ってるようですね。

背景アニメーションの傾き方を変える・再生速度を変える

背景アニメーションを独自のものにした場合、再生速度を変えたいことがあると思います。

例えば背景アニメーションを「雪(snow)」にした場合、譜面ファイル(.ksh)をメモ帳で開くと以下のようになっています。

layer=snow/1100/1

半角スラッシュ(/)区切りになっていることがわかります。左から画像の名前(またはファイル名)、再生1周にかける時間(ミリ秒)、アニメーションの傾き方の設定となっています。

再生1周にかける時間を変えることで、スピードを変更することができます。
雪背景では1100なので、1.1秒で1周します。大きくすれば遅くなり、小さくすれば速くなります。ちなみにマイナスにすれば逆再生されます(雪が上がっていく…)。

アニメーションの傾き方の値は0〜3の値で指定します(デフォルトは3)。
0を基準に、以下の規則に従って計算してください。

・レーンの傾きと一緒にアニメーションも傾けたい場合: +1
・回転と一緒にアニメーションも回転させたい場合: +2

雪背景では1なので、アニメーションは傾くけど回転だけはしないということになります。

なんでここだけセミコロンじゃなくスラッシュ区切りにしたのかと、今でも後悔しています(このせいでここだけディレクトリの区切り文字の「/」が使えなくなった)。

判定タイミングだけじゃなく画面の表示タイミングも一緒にずらす

ゲーム内のOPTIONで変更できるのは、コントローラーなどからの入力の遅延を修正するためのものなので、判定のタイミングしか変更されないよう工夫されています。

しかし、画面にも遅延がある場合(TV画面など)やPC側の問題で音声再生が遅れるといった場合には入力タイミングだけでなく画面のタイミングも修正する必要がある場合があります。

その場合は、config.iniを編集します。

「inputdelay=」と書かれた行があるので、これを0にします。

inputdelay=0

その上で、もともと「inputdelay=」の行に書かれていた判定調整の値を「globaloffset=」の行に書いてください。

globaloffset=(もともとinputdelayに書いていた数値)

例えば「inputdelay=5」だったなら「inputdelay=0」に変更した上でglobaloffsetを「globaloffset=5」にします。
こうすることで、プレイ時に譜面のoffset(曲の再生タイミング)を変更した場合と同じように譜面をずらすことができ、結果的に画面もずれることになります。

ただし、画面とともに音声エフェクト(ロングFXで鳴るもの)のタイミングもずれるので、使う場合は以下の行を足して音声エフェクトをずらすことをオススメします。

soundfx_delay=(globaloffsetに指定したものを-1倍した数値)

例えば「globaloffset=5」にしたなら「soundfx_delay=-5」です。
こうすることで、音声エフェクトのタイミングが治ります。

ただし、ずらし幅が大きいと直角音や効果音付きチップFXオブジェクトの音のずれが気になると思います。以下の行を足せばノーツを押した/押していないに関わらず、効果音が正しいタイミングで自動的に鳴るようになります。

auto_play_se=1

これで割と快適です。
ほんとはOPTIONで変えられるようにすべきだけど、判定タイミング調整が2つあると混乱を生みそうなので入れられていません…

Windowsを使わずにLinux上でプレイしたりすると77msも音声タイミングがずれるようだったので、私は「globaloffset=77」「soundfx_delay=-77」「auto_play_se=1」にして、それとは別に判定調整を「inputdelay=4」にしています…

↓redditにこの(ひどい)仕様に気づいてる人がいた

あるフォルダ内の曲の判定タイミングを全曲ずらしたりする(conf.ini)

判定調整毎回どっちかにずれてる人っていますよね(ステマニあるある)。

songsディレクトリ内のフォルダ(「K-Shoot MANIA」とか)内に「conf.ini」というファイルを作ると、曲の判定を譜面ファイルをいじらず一括でずらしたりできます。

conf.iniの内容は、例えば以下のように書くことができます。

offset=10

これで譜面ファイルで指定されたタイミングより判定を10ms遅くずらしてくれます。

音量調整毎回でかい人っていますよね(ステマニあるある)。
conf.iniに「volume=」という行を追加すると、音量も一括調整できます。

volume=80

これで譜面ファイルで指定された音量の80%の音量になってくれます。

ところで話は変わるけど、譜面パッケージとかでスコアツイートにハッシュタグ付けて欲しかったりしますよね。
conf.iniに「tweet_option=」という行を入れると、スコアツイートにハッシュタグとかURLとかをデフォルトで後ろに付けたりもできます。

tweet_option=#SF2018

お気に入りフォルダに自由なフォルダ名を付けたい

選曲画面でSTARTボタン(Enterキー)を長押しすると、お気に入りを登録できます。ただ、デフォルトでは「Favorite1」「Favorite2」などのフォルダ名になってしまい、ジャンルとか難易度とかで分けたいときにわかりにくいです。

その場合は、songsフォルダ内に「Favorite1.fav」などがあるので、「高難易度.fav」とかに変えればフォルダ名が「高難易度」になってくれます。

ただ、お気に入りへの新規追加はゲーム内からできなくなるので、その場合は適宜ファイル名を戻すか、favファイルをメモ帳などで編集するようにしてください(面倒臭そう)。

サブフォルダ名の表示を変更したい/消したい

songsフォルダ内のフォルダ(「K-Shoot MANIA」など)の中に「foldername.csv」というファイルを作成することで、そのフォルダ内のサブフォルダの表示名を変更したり、サブフォルダの表示を消したりすることができます。

foldername.csvは以下の形式で記述します。複数行入れれば複数指定できます。

(元のサブフォルダ名),(変更後のサブフォルダ表示名)

例えば海外版Windowsは日本語ファイル名に対応していないので、フォルダ名自体は「subfolder1」とした上で、

subfolder1,サブフォルダ1

などと指定すれば海外環境でもサブフォルダ名を日本語表示できます。ただし、csvファイルの文字コードは必ずUTF-8(BOM付き)で保存してください(Excelを使って作成すると問答無用でShift-JISになるので注意)。

全サブフォルダを対象にする場合、元のサブフォルダ名には「*」を指定できます。また、変更後のサブフォルダ表示名は「""」と指定すればサブフォルダの見出しを非表示にできます。

つまり、以下のように指定すればサブフォルダ名の見出しをすべて非表示にできます。

*,""

このテクニックはSF2016でも使われているようです。
これを応用することで、All表示やお気に入りでABC順をフォルダ名変更によって乱すことなくパッケージ内での曲の順序を変えることができます(サブフォルダの実際の名前を順番の数字にし、foldername.csvを「*,""」にする、など)。

譜面のある部分だけゲージの重みを変えたい

譜面の一部だけ、ゲージが増えやすく&ゲージが減りやすくすることができます。
譜面のある部分だけ重要度が増す形になります。

chiprate=2x
longrate=2x
laserrate=2x

デフォルトは「1x」で、他に「2x」と「3x」を選ぶことができます。譜面の途中で変更することが可能です(特定のノーツに対してではなく、その行以降すべてのノーツに適用されます)。

「2x」にした場合、ゲージの増え方が2倍、減り方が1.5倍になります。
「3x」にした場合、ゲージの増え方が3倍、減り方が2倍になります。

ただしTOTAL値の自動算出にも影響するので、TOTAL値を固定していない場合は譜面全体のゲージ増減もあわせて変わります。
あくまで特定の部分だけ2倍にしたいといった場合の用途にのみ使えると思います。

もともとINPUT GATEの『-if- 扉のその向こう側へ』の譜面でオートプレイ時に背景がぴったりのタイミングで変わるようにするためのゲージ調整用に実装したのですが、ミスって配信前にkshファイルから記述が消えちゃったようでした。
同じくINPUT GATEの『Happycore☆Tightcore』のIN譜面が難しすぎるとのことで緩和のためにこっそり入れられていますが、ゲージが減りやすくもなるのであまり緩和になっていない説が…

曲名やアーティスト名に画像を使う

曲名やアーティスト名には実は画像を使うことができます。使用する場合は、譜面ファイル(.ksh)をメモ帳などで開いた上で、以下のように行を追加してください。
画像を追加しても、テキストで書かれた曲名やアーティスト名は消さないよう注意してください。

title=タイトル
title_img=(画像ファイル名).png
artist=アーティスト名
artist_img=(画像ファイル名).png

基本的に黒背景に白い文字で入れてください。色を使った場合でもグレースケールに変換された上で処理されます。

INPUT GATEの『Mou Nè Yo』を追加する際、当時譜面ファイルがUTF-8に対応していなかったため「è」を入れることができず、これを解決するために実装しました。『Mou Nè Yo』では200x50pxのJPEG形式の画像として「mouneyo_title.jpg」が入れられています。

StepMania用譜面を遊ぶ

K-Shoot Editorは地味にステマニ用譜面ファイル(.sm)を開くことができます。

「ファイル」→「開く」からファイル選択ダイアログを出し、ファイルの種類を「StepMania譜面ファイル(*.sm)」に変更すれば選択できます。

開くとどの難易度を変換するか順番に聞かれ、StepMania譜面を開くことができます。

ショートノーツはチップBT、ホールドノーツはロングFXに変換されます。
譜面停止も一応変換できますが、計算が正確でないのか、譜面停止がある譜面ではタイミングがずれることが多く、プレイできない場合が多いです。

ぜひDDRマットを繋いで足で踏みたい時にでもどうぞ(2回目)。

Ubuntu 18.04でファイルマネージャのキー入力を先頭一致でのフォーカス移動に変更

Nautilus 3.6を境に、キーをしばいた時の挙動が先頭一致によるファイルへのフォーカス(Type-ahead search)からキーワード検索に変更されたようです。

これに伴ってUbuntu 17.04以降ではキー入力時にはキーワード検索されるようになっているようでした。

キーワード検索でも良いっちゃ良いんですが、表示までに少し時間がかかるので割とイライラします。

有志による非公式パッチで先頭一致フォーカスへ変更

先頭一致へ変更する非公式パッチ版(https://github.com/halkotron/nautilus-typeahead)がPPAリポジトリで配布されているので、それを利用します。

以下のコマンドで、PPAリポジトリを追加してインストールします。

$ sudo add-apt-repository ppa:lubomir-brindza/nautilus-typeahead
$ sudo apt full-upgrade

nautilusを一旦終了します。

$ nautilus -q

結果

「op」と入力すると「opt」へ即フォーカスされるようになりました。
遅延なくフォーカスされるのでとても快適。

Ubuntu18.04のnautilusを非公式のものに置き換えることになるので、もし気になる場合は他のファイルマネージャを利用するという選択肢もあります。

情報元

Type Ahead search using Nautilus on Ubuntu 18.04
I am new to Linux and have a little question, more a preference than a problem. Before upgrading to Ubuntu 18.04 LTS, i was using Ubuntu 16.04.1 LTS. When i ...

OpenCV&C++ でアクリルキーホルダーの重心を調べる

ゆいのあ氏(@yuinore)が書いた↓の記事を見て、C++だとどれくらい長くなるのかな~と適当につぶやいたところ、うえぽん氏(@imaginary_uepon)が勢いで書いてくれました。

うえぽん氏が長くなるよう?Windows Imaging Componentを使って低レイヤーな部分も含めて書いてくれたので、私はOpenCVを使うとどれくらい短くなるか試してみました(ぶち壊し…)。

プログラム

以下がOpenCVでアクリルキーホルダーの重心を調べるプログラムです。

#include <iostream>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/core.hpp>

int main()
{
    cv::Mat image = imread("image.png", cv::IMREAD_UNCHANGED);

    // アルファ値を重みとした座標合計, およびアルファ値の合計を算出
    cv::Vec2d posSum(0, 0);
    double alphaSum = 0;
    for (int i = 0; i < image.rows; ++i)
    {
        for (int j = 0; j < image.cols; ++j)
        {
            double alpha = image.at<cv::Vec4b>(i, j)[3] / 255.0;
            posSum += cv::Vec2d(j, i) * alpha;
            alphaSum += alpha;
        }
    }

    if (alphaSum > 0)
    {
        // 座標の重み付き平均(=重心)を算出
        cv::Vec2d center = posSum / alphaSum;

        // ピクセルの大きさを考慮して0.5px右下にずらす
        center += cv::Vec2d(0.5, 0.5);

        std::cout << center << std::endl;
    }
    else
    {
        std::cout << "error: no alpha" << std::endl;
    }

    return 0;
}

40行くらい。
OpenCVはアルファブレンド付き画像に完全対応しているわけではないようなので、アルファ値をとるにはIMREAD_UNCHANGEDで読み込む必要があります。
この際、エンディアンの影響なのか縦横が逆になったりr/g/bが逆向き(BGRA)になったりするので注意が必要です。

試してみる

適当に描いた画像で試してみたところ、以下の座標になりました。だいたいあってそう。

AKAZE/ORB/BRISKでホモグラフィー行列推定(OpenCV3)

OpenCVで特徴点マッチングを行い、一方の画像がどこにあるかをボックスで表示するC++のサンプルを探していたところ、下のページに行き着きました。
しかし、OpenCV2時代のものらしく動かなかったので、今回OpenCV3用に修正しました。

どうやらOpenCV3からは特徴点の種類を簡単に変更できるようにするため、クラスの構成が変更されたみたいです。

OpenCV3用に修正したプログラム

#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv/cv.hpp>

// --------------------------------------------------------------------------
// main(Number of arguments, Argument values)
// Description  : This is the entry point of the program.
// Return value : SUCCESS:0  ERROR:-1
// --------------------------------------------------------------------------
int main(int argc, char **argv)
{
    // ORB
    auto detector = cv::ORB::create();
 
    // 読み込み
    cv::Mat image1 = cv::imread("box.png");
    cv::Mat image2 = cv::imread("box_in_scene.png");

    // 特徴点1
    std::vector<cv::KeyPoint> keypointsA;
    cv::Mat descriptorsA;
    detector->detectAndCompute(image1, cv::noArray(), keypointsA, descriptorsA);
 
    // 特徴点2
    std::vector<cv::KeyPoint> keypointsB;
    cv::Mat descriptorsB;
    detector->detectAndCompute(image2, cv::noArray(), keypointsB, descriptorsB);
 
    // マッチング
    cv::BFMatcher matcher(cv::NORM_HAMMING, true);
    std::vector<cv::DMatch> matches;
    matcher.match(descriptorsA, descriptorsB, matches);
 
    // 最小距離
    double min_dist = DBL_MAX;
    for (int i = 0; i < (int)matches.size(); i++) { 
        double dist = matches[i].distance;
        if (dist < min_dist) min_dist = dist;
    }
 
    // 良いペアのみ残す
    std::vector<cv::DMatch> good_matches;
    for (int i = 0; i < (int)matches.size(); i++) { 
        if (matches[i].distance < 3.0 * min_dist) good_matches.push_back(matches[i]);
    }
 
    // 対応点の表示
    cv::Mat img_matches;
    cv::drawMatches(image1, keypointsA, image2, keypointsB, good_matches, img_matches, cv::Scalar::all(-1), cv::Scalar::all(-1), std::vector<char>(), 0*cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
     
    // 十分な対応点がある
    if (good_matches.size() > 10) {
        std::vector<cv::Point2f> obj, scene;
        for (int i = 0; i < (int)good_matches.size(); i++) {
            obj.push_back(keypointsA[good_matches[i].queryIdx].pt);
            scene.push_back(keypointsB[good_matches[i].trainIdx].pt);
        }
 
        // ホモグラフィー行列を計算
        cv::Mat H = cv::findHomography(obj, scene, cv::RANSAC);
        //std::cout << H << std::endl;
 
        // 行列が空ではない
        if (!H.empty()) {
            std::vector<cv::Point2d> obj_corners(4), scene_corners(4);
            obj_corners[0] = scene_corners[0] = cv::Point2d(0,           0);
            obj_corners[1] = scene_corners[1] = cv::Point2d(image1.cols, 0);
            obj_corners[2] = scene_corners[2] = cv::Point2d(image1.cols, image1.rows );
            obj_corners[3] = scene_corners[3] = cv::Point2d(0,           image1.rows);
 
            // ホモグラフィ行列の推定
            cv::perspectiveTransform(obj_corners, scene_corners, H);
 
            // 緑の線で囲む (開始点を元画像が左にあるので右にオフセット)
            cv::line(img_matches, scene_corners[0] + cv::Point2d(image1.cols, 0), scene_corners[1] + cv::Point2d(image1.cols, 0), cv::Scalar(0, 255, 0), 4);
            cv::line(img_matches, scene_corners[1] + cv::Point2d(image1.cols, 0), scene_corners[2] + cv::Point2d(image1.cols, 0), cv::Scalar(0, 255, 0), 4);
            cv::line(img_matches, scene_corners[2] + cv::Point2d(image1.cols, 0), scene_corners[3] + cv::Point2d(image1.cols, 0), cv::Scalar(0, 255, 0), 4);
            cv::line(img_matches, scene_corners[3] + cv::Point2d(image1.cols, 0), scene_corners[0] + cv::Point2d(image1.cols, 0), cv::Scalar(0, 255, 0), 4);
        }
    }
 
    // 表示
    cv::imshow("camera", img_matches);
    cv::waitKey(0);
 
    return 0;
}

元記事のプログラムからの変更箇所はinclude部分と13~28行目の特徴点抽出部分のコードです。OpenCV3ではクラスの構成が少し変わっています。

gccの場合は以下のコマンドでコンパイルが通ると思います。

$ g++ [ファイル名].cpp `pkg-config --cflags --libs opencv`

特徴点の種類について

はじめのauto detector = cv::ORB::create();の中の「ORB」を変更するだけで使用する特徴点の種類を変更できます。AKAZE/ORB/BRISKの3種類が使用可能のようです。

特徴量で有名どころのSIFT/SURFは特許が取られているらしく、商用利用不可らしいです。その関係でopencv_contribという拡張モジュールに隔離されているので、使用するには別途これを導入する必要があるようです。

試してみる

とりあえずAKAZEとORBとBRISKを試してみた↓

AKAZE:

ORB:

BRISK:

BRISKだけやたら点が多い…
ORBも写真のクッキーの部分の特徴を全然取ってくれていないので、とりあえずこの写真を見る限りではAKAZEが良さそう?
(このあたりは屋外・屋内とか被写体によって変わってきそう)

WordPressで「--」(ハイフン2つ)を入力する方法

WordPressでハイフン2つを連続入力しようとすると短いダッシュ記号(–)に置き換えされてしまうようです。

以下のように文字コードを直打ちすると、うまく「--」として表示してくれました。
記事タイトルへの使用も有効のようです。

&#45;&#45;

ただし、再編集の際にビジュアルモードに切り替えると勝手にハイフンに置き換えられてしまう模様…

git commit --amendを取り消すorキャンセルする方法

git commit --amendの取り消し方法について、ググっても出てこない2つ目の解決策が見つかったので記事にしてみます。

通常のgit commitではコミットメッセージを空のままで終了すればコミットをキャンセルできますが、git commit --amend(前のコミットへ上書き追加)の場合はそのまま終了してもコミットされてしまうので、うっかり実行するとキャンセルできなくて困ります。

解決策1

git commit --amendを行った後に取り消したい場合には、以下のコマンドを実行します。

$ git reset --soft HEAD@{1}

git commit --amendの実行がなかったことになってくれます。

解決策2

git commit --amendでコミットメッセージを入力する際、すでに入力されているコミットメッセージを削除して空にしてから保存&終了します。

すると、以下のようにgit commit --amendがキャンセルされてくれます。

$ git commit --ammend
Aborting commit due to empty commit message.

個人的にはこっちのやり方の方が毎回コマンドをググらなくて良いので楽かなと。

dynabookでUbuntu Live USBをブートするとGRUBでフリーズする際の解決策

dynabook R83にUbuntu 18.04を入れようとしたところLive USB stickのブート画面で固まってしまいましたが、BIOS設定をいじったら直ったのでそれについて書いておきます。

症状

Ubuntu公式の手順にしたがって作成したLive USB stickを接続し、ブート画面でF12連打→USBメモリから起動するオプションを選択しました。

すると、USBメモリからのブート自体には成功したものの、以下の画面(GNU GRUB version 2.02)で固まりました。
上下キーを押してもカーソルが移動しない状況でした。

解決策

原因はBIOS設定でSecure Boot機能を有効にしていたことだったようです。
同様にF12連打で起動してBIOS設定に入った後、以下のように設定を変更したところ、うまく起動できるようになりました。

  • [Security] → [Secure Boot]: Disabledに変更

海外フォーラム(Ask Ubuntu)ではBIOS設定から「Intel Virtualization Technology」を無効化すると動作するようになるという報告がありましたが、私の環境では特に変化がないようでした。

PuTTYからのSSH接続を経由してブラウザを閲覧する方法

ブラウザでウェブサイトを閲覧する際、PuTTYでSSH接続した接続先を一旦経由して接続させることが可能です。

アクセス先のサイトが特定のIPアドレスからのみに閲覧を制限している場合や、インターネット接続に利用しているネットワークでSSH以外の特定のプロトコルを制限されている場合などに有効です。

例えば、自宅から大学のネットワークを経由して学術論文のWebサイトへアクセスしたり、大学のネットワークでSSHは使えるもののFTPの利用は制限されているといった場合に、一旦SSHを経由して別サーバーからFTP接続させたり(いわゆる“FTP over SSH”)することができます。

手順

  1. まずPuTTYの基本設定をします。SSH接続したい接続先のホスト名などを入力します。
  2. 左のメニューから「SSH」>「トンネル」を選択します
  3. 「源ポート」に適当なポート番号(12345など使われていなさそうな番号)を入力し、「ダイナミック」を選択します
  4. 「追加」をクリックすると、上の一覧に指定したポート番号が追加されます。
    (「D1234」 のDは「ダイナミック転送」を表すD)
  5. 下の「開く」をクリックして接続します。

    端末が表示されるので、ログインしてコマンドが打てる状態にしておきます。

    PuTTY側の準備は以上となります。
  6. ブラウザのプロキシ設定でSOCKS5プロキシとして、
    • IPアドレス: 127.0.0.1
    • ポート番号: 3.で指定したポート番号(例では12345)

    を指定します。

    ■ Firefoxの場合:

    「オプション」 → 一番下の「ネットワークプロキシ」から「接続設定」をクリックし、「手動でプロキシを設定する」を選んで以下のように設定(「SOCKS v5」にチェックが付いていることを念のため確認)

    ■ Firefox以外の場合:

    「コントロールパネル」→「インターネットオプション」を開き、「接続」タブ→「LANの設定」をクリックします。

    プロキシサーバーの使用にチェックを入れ、「詳細設定」をクリックします。
    もし「設定を自動的に検出する」にチェックが付いている場合、ネットワーク側の設定によって正常に反映されない場合があるのでチェックを外します。

    Socksの入力欄にIPアドレスとポート番号を入力し、「OK」をクリックします。

以上で設定は完了です。

ブラウザからIPアドレスを確認するサイトなどへアクセスすることで、接続元が変わっていることが確認できます。

通常の接続へ戻したい場合は、SSH接続を終了した上で、

  • Firefoxの場合:
    「オプション」→「ネットワークプロキシ」の「接続設定」
    →「このネットワークのプロキシ設定を自動検出する」などにチェック
  • Firefox以外の場合:
    「コントロールパネル」→「インターネットオプション」→「接続」タブ→「LANの設定」→「LANにプロキシサーバーを使用する」のチェックを外す

というように設定を変更することで元に戻せます。

今回はブラウザでの方法を紹介しましたが、Socks5のプロキシ接続に対応しているソフトウェアであればSSHを経由しての接続が可能です。
例えば、FTPのファイル転送ソフトなども同様のプロキシ設定を行うことでSSHを経由した接続が可能となります。

1 / 2ページ

© 2016-2018 M'z Koo-boo.