忍者ブログ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

OpenCVをCMake使ってでビルドするならfind_packageに丸投げするだけではいけない

起きたこと

今まで上手くビルドできていたのに、別プログラムをビルドしようとしたらむっちゃ怒られた。上手く動かないのである。

環境

  • Windows 10 64bit
  • cmake version 3.16.0
  • MSVC 19.24.28314.0

詳細

今まで~/testcode/hello/main.cppをビルドしていた。 ここで別の実装を試したくなり、~/testcode/next/main2.cppを実装。ビルドをしようとすると、怒られまくる。具体的には、未定義のコードを参照しようとしているみたいなことを書かれた。(実際のエラーは記録してませんでした。載せられず申し訳ない。) エラーを見る限り明らかに自分が記述したところではなかったが、念のためmain.cppを~/testcode/next/に持ってきてビルドを試みるも結果は変わらず。加えて~/testcode/hello/main.cppのビルドは上手くいくのである。困った。
以下に概略図を示す。汚い手書きですまない。
概略図

原因

cmakeを実行したときの出力とにらめっこしていると、MSVC向けにビルドしているにもかかわらずMinGW用のOpenCVを使おうとしていた。
(私の環境に入っているOpenCVはMSVC用のとMinGW用の2種類がある。)
CmakeLists.txtは全く同じものを利用していたため予想だにしていなかったが、CmakeLists.txt中のfind_package(OpenCV REQUIRED)は状況によって異なる OpenCVConfig.cmake・opencv-config.cmakeを見つけてくるらしい。
(OpenCVConfig.cmakeやopencv-config.cmakeはOpenCVの利用に必要なものを記述したもの...だと思う。)

解決方法

CmakeLists.txtに次の一文を追加した。

set(OpenCV_DIR "使いたい方のOpenCVに付属したOpenCVConfig.cmakeやopencv-config.cmakeを含むディレクトリ")

つまり、使いたい方のOpenCVに付属したOpenCVConfig.cmakeやopencv-config.cmakeを含むディレクトリをOpenCV_DIRという変数に設定したのである。

これは一度MinGW用のOpenCVを消去してcmakeコマンドを実行したときに出た以下のメッセージをみて知った方法である。

Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set
  "OpenCV_DIR" to a directory containing one of the above files.

結論

OpenCVをCMakeからビルドするときにはOpenCV_DIR変数を設定することでパッケージの探索先を明示的に示そう。

拍手[0回]

PR

TeXを入れる

パソコンにTeXを導入したときのメモ。

環境

  • Windows10

TeX Liveのインストール

  1. ISOイメージのダウンロード。
    Acquiring TeX Live as an ISO image の download from a nearby CTAN mirrorへ。
    texlive2019.iso をクリックしてダウンロードする。
    ISOイメージを使う方法以外もある。
  2. ダブルクリックによりマウント。
  3. install-tl-windows.bat をダブルクリック。
  4. 適当に設定してインストール開始。
    • インストール先は変更した。
      →プログラミング言語のコンパイラ等を入れているディレクトリと同じ場所にした。
        雰囲気近そうだからね。
    • TeX Worksはインストールしない。
       代わりにTexStudioを導入するため。
    • 詳細設定→コレクションを選択していらないものを除く。
      ゲーム組版, 音楽パッケージ
  5. インストールの完了を確認してコンピュータの再起動を行う。
  6. パッケージのアップデート。
    「TeX Live 2019」→「TeX Live Manager」によってアップデートが可能...らしい
    私は以下のコマンドを使用
     tlmgr update --self --all
  7. 埋め込む日本語フォントの設定(未)

TeXstudioのインストール

  1. ダウンロードする
    TeXstudioの公式ダウンロードページへ行く。
    WindowsのType Installerをクリックする。
    今回はインストーラを用いた。zip版もあると思われる。
  2. 実行
  3. 設定
    1. ビルド
      DVI->pdfチェーン
      LaTeX
      PDFビューア
      組み込みPDFビューア
    2. コマンド(変更したものを以下に示す。元はここから
      LaTeX
      uplatex.exe -no-guess-input-enc -kanji=utf8 -synctex=1 -interaction=nonstopmode %.tex
      PdfLaTeX
      pdflatex.exe -synctex=1 -interaction=nonstopmode %.tex
      XeLaTeX
      xelatex.exe -synctex=1 -interaction=nonstopmode %.tex
      LuaLaTeX
      lualatex.exe -synctex=1 -interaction=nonstopmode %.tex
      外部PDFビューア
      "後述のPDFの実行ファイルとパス" -reuse-instance -inverse-search """"TeXstudioの実行ファイルとパス""" """%%f""" -line %%l" "?am.pdf" -forward-search "?c:am.tex" @
      DviPs
      ruby.exe -e "cmd='dvips -Ppdf -z -f '+0x22.chr+'?am.dvi'+0x22.chr+' '+0x7c.chr+' '+'convbkmk -u'+' '+0x3e.chr+' '+0x22.chr+'?am.ps'+0x22.chr;system(cmd)"
      BibTeX
      upbibtex.exe %
      Biber
      biber.exe --bblencoding=utf8 -u -U --output_safechars %
      Makeindex
      upmendex.exe %.idx
      Metapost
      upmpost.exe -interaction=nonstopmode ?me)
      Asymptote
      asy.exe %m*.asy
      Ghostscript
      rungs.exe
      Latexmk
      latexmk.exe -e "$latex=q/uplatex %%O -kanji=utf8 -no-guess-input-enc -synctex=1 -interaction=nonstopmode %%S/" -e "$bibtex=q/upbibtex %%O %%B/" -e "$biber=q/biber %%O --bblencoding=utf8 -u -U --output_safechars %%B/" -e "$makeindex=q/upmendex %%O -o %%D %%S/" -e "$dvipdf=q/dvipdfmx %%O -o %%D %%S/" -norc -gg -pdfdvi -silent %
      SVN
      svn.exe
      SVNADMIN
      svnadmin.exe
    3. エディタ
      インラインチェックを外す。(日本語文書だとこれが必要らしい)
      フォントファミリーは変更した方がいいかもしれない。
    4. 高度なオプションの表示(左下)にチェックを入れる
    5. 詳細なエディタの設定
      「ハック/回避策」⇒「最適なディスプレイオプションの選択」のチェックを外し、「描画モード」を「QT」に変更する。
      日本語の場合、これをしないとカーソルのずれといった問題に直面することになるらしい。
      一番上にある「行番号を表示」を「すべての行番号」に設定する。
      これにより、行番号が表示される。
※設定ファイルについて
ここのサイトに、各OSにおける設定ファイルの保管場所が記載されている。アンインストール時には、これを消すことも忘れないようにする。

PDFビューア

SumatraPDFを使用。
これを使うにはTeXstudioで設定を変更する必要がある。

関係ないけれど

源ノ明朝, 源ノゴシックのJP Subset OTFsを導入した。
 元のデータは取り敢えず/usr/usrname/document/font/の下に置く。

Note

DVI->pdfチェーン
LaTeX
PDFビューア
組み込みPDFビューア
dvipdfmx

・tlmgrとは
 TeX Liveのパッケージ管理ソフト

・tlmgrのアクセス先は変更できる。
 参考:http://www.fugenji.org/~thomas/tori-tex/node15.html

・自分で処理をすることもできる
  platex hoge.tex
  dvipdfmx hoge.dvi
 のような手順で hoge.tex から hoge.pdfを作ることができる。

・パッケージの文書(技術文書)を表示することができる。
  texdoc パッケージ名
 参考:ここ

・\documentclass[a4j]{jsarticle} が上手くいかない。
 →\documentclass[uplatex, a4j]{jsarticle} にする。
  jsarticleなどは、そのままではupLaTeXで使うことができない。
  参考:ここ
 →或いは \documentclass[a4j]{ujarticle} にする。

・LaTeXドキュメントをHTML二変換したい場合
 こことか使えそう。


便利
https://qiita.com/zr_tex8r/items/a924be192ecea7e6bbe4

Linuxに入れたくなった時のために

以下のリンクを(片っ端から)参照
https://user.ecc.u-tokyo.ac.jp/users/user-15826/wiki/?TeX/Install

拍手[0回]

ABC001-010まとめ

AtCoderBeginnerContestの各問題におけるミソを自分用にまとめた記事。
その001-010。
リンク先はそのミソについてまとめられた(まとめた)記事になっています。


ABC001

A問題 なし

B問題 なし

C問題
小数の計算誤差。
http://kikihijidarake.blog.shinobi.jp/nocategory/avoidcalcerror
一般には私がまとめたのより、こちらのサイトの方が詳しいし良いかも。http://d.hatena.ne.jp/komiyam/20111210/1323503019

D問題


ABC002

A問題 なし

B問題 なし

C問題
小数の計算誤差。
同上

D問題


ABC003

A問題
計算順序とかもっといい方法があった。
詳細はいずれ。(書かないかも)

B問題
別解:文字に点数をつけて、その合計点を見ることで条件を満たすか否かを判別する方法。
文字と点数の結びつけは連想配列で。C++ならstd::mapとか。
→連想配列の詳細 http://vivi.dyndns.org/tech/cpp/map.html
詳細はいずれ。(書かないかも)

C問題
組み合わせが膨大な問題に対してどう取り組むか。
詳細はいずれ。(書かないかも)

D問題


ABC004

A問題 なし

B問題
マスをどうやって回転させるか。
→c[i][j]とc[3-i][3-j]をswapすればよい。

C問題
膨大な計算をどう削減するか。
→今回は繰り返し(規則性)の発見。
→やっている計算も同じようなことを繰り返しているだけだしね。
詳細はなし。

D問題


ABC005

A問題 なし

B問題 ソートするか入力段階でmin値を更新していくか。

C問題 別解の二部グラフってなに。調べたら追記。

D問題


ABC006

A問題 なし

B問題 なし

C問題 1変数の固定とか、3変数のうち既に求めた2変数を用いて残りの1変数を導出するとか。

D問題


ABC007

A問題 なし

B問題 なし

C問題 幅優先探索の例題

D問題


ABC008

A問題 なし

B問題 なし

C問題

D問題


ABC009

A問題 なし

B問題 降順ソートのやり方
http://kikihijidarake.blog.shinobi.jp/Entry/8/

C問題

D問題


ABC010

A問題 なし

B問題 なし

C問題
小数の計算誤差。
ABC001 C問題と同じ

D問題


拍手[0回]

小数計算の誤差を回避する

ききひじの競プロ備忘録

割り算の結果が小数になる場合、その誤差が時に問題を生じさせる。
特に比較をするときなどは顕著だろう。
その解決策である。

因みに私は記事を書いてなおよくわかっていない。

回避策1:少しだけ小さい数を足す

割られる数が整数などの場合、計算結果に、例えば0.00001のような小さめの値を足すという方法がある。

double ans = 241 / 60 + 0.00001;

「少しだけ」が曖昧なので、妥当な数字がどれくらいかを考えるのは難しい気がする。
また割られる数が小数以下の細かい数字の場合、この方法をとることが出来ない。


回避策2:10のn乗倍してから、整数として計算する。

整数xを整数yで割る。このとき、商を10^-nの精度で求めたいとする。
解決策2では、xを先に10^n倍してyで割るのだ。そして計算結果を10^-n倍すればよい。

もし計算結果をそのまま出力するとか、文字にするのならば10^-n倍しないことも可能だろう。こうすると完全にずれはなくなる…気がする。

// n = 1, y=2 のとき
const int a = 何かしらの値1
const int b = 何かしらの値2

cin>>x;
x = x * 10 / 2;
cout<< x / 10 << '.' << x % 10 << flush;

また、計算が続くのならば、すべての計算が終わった段階で10^-n倍するとよいかもしれない。 この方法で注意すべきは、変数のオーバーフローである。特に計算が長く続き、かつ最後に10^-n倍をする場合、その計算途中で桁が溢れる危険があるので使う際には留意されたし。


回避策3:そもそも計算しない

そもそも小数を扱わなければいけないような計算をしなければいい。

例えば、入力xについて、xを7で割った商で条件分岐する場合を考える。
このとき、境目となる値を先に7倍し、7倍された値とxを比較すればよいのだ。

before
// a > b
const double a = 何かしらの値1
const double b = 何かしらの値2

cin>>x;
double quotient = x/7;
if(quotient > a){
  //何かしらの処理
}
else if(quotient > b){
  //何かしらの処理
}
else{
  //何かしらの処理
}

after AやBは可能なら先に自分で計算をしておくとよりよい(のだろうか)。
// a > b
const double A = 何かしらの値1*7
const double B = 何かしらの値2*7

cin>>x;
if(x > A){
  //何かしらの処理
}
else if(x > B){
  //何かしらの処理
}
else{
  //何かしらの処理
}

拍手[0回]