WindowsにUbuntuの仮想環境を導入する。
Windows10にUbuntu14.04の仮想環境を導入します。
取りあえず流れだけ。と言いつつ、だいたいこれがほとんどです。
環境
- Windows10
- Ubuntu14.04
参考URL
- VirtualBox 最大パフォーマンスでUbuntu環境を構築する | ほりべあぶろぐ
- 仮想化ソフトウェアの比較
- WindowsのVirtualBoxにUbuntu 13.04をインストールしてみた -VirtualBoxの使い方
- VirtualBox:仮想マシンの作成で64bit OSを選択可能にする方法
- VirtualBoxの仮想マシンの作成で32bitしか表示されない
- Ubuntuでホームディレクトリの中身を英語にする - Qiita
- Ubuntu のデスクトップ環境のフォルダ名を日本語から英語にする - Qiita
- 【Ubuntu 14.04】ディレクトリを英語名に変更する
- VirtualBox 共有フォルダー設定 - ホストとゲスト間でフォルダーを共有 - PC設定のカルマ
- [VirtualBox] VirtualBoxで仮想マシンを別環境や別フォルダに移動する方法 | Dr.Clover's Computer Clinic
- VirtualBoxを全画面(フルスクリーン)で表示する方法 - VirtualBoxの使い方
- VirtualBox にインストールした Ubuntu の画面サイズ(解像度)を640×480以外に変更する方法 | mogi2fruitsどっとねっと
- 雑記 VirtualBoxでの USBメモリ認識方法 - hoge774-nazeのブログ
- VirtualBoxをインストールしたらVirtualBox Extension Packもインストールしよう | Windows on Mac BootCampを使って MacでWindowsを動かそう
USB切替機を自作する。
メインのPCに加えてラズベリーパイをいじるようになりました。
まあラズベリーパイならメインのPCから遠隔操作すればいいのですが、そこに最近はSurfaceが追加されてキーボードマウスがもう一セット必要になってしまいました。
予備キーボードマウスはあるっちゃあるんですが、置くスペースもないし、何よりいちいち使い分けるのが非常に面倒です。
そこでUSB機器を複数のPCで切り替えられるUSB切替機を探してみたんですが、なぜかすごく高い。4つ切り替える切替機で1万とかします。(今はなんかすごく安くなっていますね。探し方が悪かったのかも。)
ということで、そんな高いもん買うならと思い、作ってみました。
作り終わってから記事にしようと思いついたので画像は完成したものしかありません。完成したものしかないといいつつ画像は今度アップロードします。
材料
- ケース
- 配線
- オス―オスUSB端子 3つ
- メス―メスUSB端子
- ユニバーサル基盤
- ロータリースイッチ
作り方
原理は簡単。単純にUSBの4端子をロータリースイッチで切り替えるだけです。
回路図は以下の通り。
他の人が自作しているものを見ると、グランドが共通だったり電源が共通だったりしますが、
電位のズレによる電流の逆流等が怖いので、電源もグランドも信号線ごとすべて切替えます。(本当はスイッチングノイズ対策とかしたほうがいいのかも)
そのためロータリースイッチは4回路3接点のものを使います。
ロータリースイッチの回路図は以下の通り。
家には電動ドリルなんてものはないので、ミニリューターとやすりとデザインナイフで頑張ってケースに穴をあけます。
メス―メスUSB端子とオス―オスUSB端子を無理やり分解して端子の部分に無理やり半田します。
伸ばした配線をロータリースイッチに半田してケースに収めて完成です。
今のところ問題なく使えてますが、やっぱり既製品を買ったほうが良いでしょう。
既製品は何より、PCやUSB機器を壊す心配がないのがいいですね。
今なら4分岐を2000円くらいで買えるようです。というか結局買っちゃいました。↓
Amazon CAPTCHA
OpenCVを使ったカメラの歪み補正。
OpenCV3.1を使ってカメラの歪み補正を行う。
取りあえず流れだけ。
流れ
- チェスボードの画像を用意する。
- チェスボードのコーナーを検出する。
- 検出したコーナーの情報の精度を上げる。(サブピクセル精度。)
- チェスボードのコーナーの世界座標系を指定する。(要はチェスボードのマス目の現実での大きさを指定する。)
- これらの情報からカメラの内部パラメータを取得する。
- 取得したパラメータを使ってキャリブレーション。
主な参考URLまとめ
- OpenCVとVisual C++による画像処理と認識(17)----- 三次元再構成の準備として、カメラキャリブレーションを行う -----
- OpenCVで魚眼カメラのキャリブレーション - takminの書きっぱなし備忘録
- カメラ校正 - Qiita
- 機械の目が見たセカイ -コンピュータビジョンがつくるミライ (5) 意外と知らないカメラキャリブレーション | マイナビニュース
- OpenCV2系のAPIを使って歪み補正を行う - Qiita
- レンズ歪みの補正 - TB-code
- カメラキャリブレーションと3次元再構成 — opencv 2.2 documentation
【その他参考URL】
- fisheye::undistortImage() doesn't work. What wrong with my code. - OpenCV Q&A Forum
- opencv.jp - OpenCV: カメラキャリブレーション(Camera Calibration)サンプルコード -
- OpenCV: Fisheye camera model
- Camera Calibration and 3D Reconstruction — OpenCV 2.4.13.2 documentation
- JugglerYou日記 :: ステレオカメラの歪み補正&平行化
- 【OpenCV】広角レンズの歪み補正 - SOARISTO工房blog
- AR.Droneのカメラキャリブレーション - Puku's Laboratory
- OpenCVで遊ぼう!: OpenCVのカメラキャリブレーションとARもどき
- OpenCVのundistort(レンズ歪み補正)で端っこが欠けてしまうのをなんとかする - Qiita
- fisheye::undistortImage() doesn't work. What wrong with my code. - OpenCV Q&A Forum
OpenCV3.2とcontribをWin10に導入してビルドしてサンプル実行。
Win10にOpenCV3.2を導入します。基本的に導入方法はどのバージョンでも同じだと思います。
流れ
- Visual Studio Community 2015をインストールする。
- Cmakeをインストールする。
- OpenCV3.2のソースをダウンロードする。
- OpenCV3.2のcontribのソースをダウンロードする。
- Cmakeを使って自分の環境にあったOpenCVのソースを作る。
- Visual Studioを使ってソースをビルドする。
- ビルドしてできたDLLのパスを通して、ヘッダーとライブラリをVisual Studioで指定する。
- サンプルプログラムをビルドする。
Visual Studio Community 2015をインストールする。
Visual Studioの公式サイトからインストーラをダウンロードして、インストールします。
インストールの方法は特に変わったことはありません。インストーラに従ってインストールしてください。
OpenCV3.2のソースをダウンロードする。
OpenCVの公式サイトから3.2のWindow版をダウンロードします。
OpenCVのGitHubからダウンロードしても同じだと思っていたのですが、うまくいかなかったので公式サイトからダウンロードしましょう。
ダウンロードしたら解凍して、適当な場所に置きます。置く場所はどこでもいいです。(多分)
今回はCドライブの直下に置いてフォルダ名をopencv320に変えておきます。
OpenCV3.2のcontribのソースをダウンロードする。
contribのソースはGitHubからダウンロードします。
ここのサイトから
opencv_contrib → release → 3.2.0と飛んで、
Source code (zip)をクリックしてダウンロードします。
ダウンロードしたら解凍して、適当な場所に置きます。置く場所はどこでもいいです。(多分)
今回はCドライブの直下に置いてフォルダ名をopencv_contrib320に変えておきます。
Cmakeを使って自分の環境にあったOpenCVのソースを作る。
Cmakeを解凍したフォルダの中のbinフォルダのcmake-gui.exeを実行します。
そしたら、Where is the source code:の欄にダウンロードしたOpenCVのソースを指定します。
今回は
C:/opencv320/sources
となります。
その下の欄のWhere to build the binaries:には
C:/opencv320/build
と入力します。これはビルドされるバイナリが保存される場所になります。
その後、Configureをクリックします。
コンパイラ環境を聞かれると思うのでVisual Studio 2015を選びます。86と付いているのは32bit版で何もついてないのは64bit版です。
すると、赤くずらずらと出てきます。
これはどういう風にOpenCVをインストールするかといったオプションです。(多分)
まず、Pythonは入っていないのでPython関係のチェックを外します。
NvidiaのGPUも積んでないのでWITH_CUDAのチェックを外します。
それと何故かBUILD_opencv_hdfにチェックが入っているとビルドで失敗するのでチェックを外す。
contribのフォルダを指定します。OPENCV_EXTRA_MODULES_PATHに以下を指定します。
C:/opencv_contrib320/modules
そしたら再びConfigureを押します。
その後Generateをクリックします。
すると、自分の環境にあったソースのソリューションファイルが生成されます。
Visual Studioを使ってソースをビルドする。
CmakeのOpen Projectボタンを押すか、もしくはC:/opencv320/buildの中に生成されているOpenCV.slnをVisual Studioで開きます。
メニューバーのビルドを押してバッチビルドを選択します。そしたら、INSTALLをDebugとReleaseのどちらもチェックしてビルドボタンを押す。
ビルドが終わるのをしばらく待ってエラーなく終了したら成功です。
ビルドしてできたDLLのパスを通して、ヘッダーとライブラリをVisual Studioで指定する。
ビルドして生成されたもので本当に必要なのは3種類です。(多分)
『ヘッダファイル』(拡張子.hpp)と『ライブラリファイル』(拡張子.lib)と『ダイナミックリンクライブラリ』(拡張子.dll)の3つです。
それ以外のファイルはダウンロードしたものを含めて全て削除しても多分大丈夫です。(サンプルプログラムとかサンプルコードは別として)
ヘッダファイルはOpenCVに使われている関数とかの定義が書いてあるファイル。(多分)
ライブラリファイルは関数とかの内容が書かれているファイル。(多分)
ダイナミックリンクライブラリはOpenCVでビルドされたプログラムを実行するときに一緒に実行されるファイル。(多分)
つまり、ビルド時にはヘッダファイルとライブラリファイルが必要で、実行時にはダイナミックリンクライブラリが必要になります。(多分)
この3つのファイルをうまく配置指定してやる必要があります。
ダイナミックリンクライブラリのパスを通す。
ダイナミックリンクライブラリはC:/opencv320/build/install/binの中に有ります。プログラムを実行するのはWindowsなのでこのフォルダをWindowsに教えてやる必要があります。
Windowsのスタートボタンを右クリックしてシステムを選択します。
左の欄のシステムの詳細設定をクリック。詳細設定のタブの一番下の環境変数をクリック。
システムの環境変数の中のPathを選択して編集を押します。
新規を押して、
C:/opencv320/build/install/bin
と入力してOK。パソコンを再起動します。
もう一つの方法として、C:/opencv320/build/install/binの中にある.dllのファイルを
64bitでビルドしたならC:\Windows\System32に
32bitでビルドしたならC:\Windows\SysWOW64に
コピーしても良いようです。
ヘッダファイルの指定
ヘッダファイルはC:/opencv320/build/install/includeの中に有ります。プログラムをビルドするのはVisual StudioなのでこのフォルダをVisual Studioに教えてやる必要があります。
まずVisual Studioで適当なプロジェクトを作成します。
ファイル → 新規作成 → プロジェクト
Visual C++で空のプロジェクトを選んで名前を適当付けます。今回はopencv-testとします。
そしたらソリューションエクスプローラーの欄でopencv-testを右クリックしてプロパティを選択します。
構成ですべての構成を選んでC/C++を選択します。追加のインクルードディレクトリに以下を追加します。
C:/opencv320/build/install/include
ライブラリファイルの指定
ヘッダファイルはC:/opencv320/build/install/libの中に有ります。プログラムをビルドするのはVisual StudioなのでこのフォルダをVisual Studioに教えてやる必要があります。
ライブラリファイルの指定はコード上に書いて指定することができます。
面倒なので全てのライブラリを指定します。
コードの一番上に以下のように記述します。
#ifdef _DEBUG //Debugモードの場合 #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_aruco320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_bgsegm320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_calib3d320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_ccalib320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_core320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_datasets320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_dnn320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_dpm320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_face320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_features2d320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_flann320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_fuzzy320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_highgui320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_imgcodecs320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_imgproc320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_line_descriptor320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_ml320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_objdetect320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_optflow320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_photo320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_plot320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_reg320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_rgbd320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_saliency320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_shape320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_stereo320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_stitching320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_structured_light320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_superres320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_surface_matching320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_text320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_tracking320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_video320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_videoio320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_videostab320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_xfeatures2d320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_ximgproc320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_xobjdetect320d.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_xphoto320d.lib") // opencv_core #else //Releaseモードの場合 #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_aruco320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_bgsegm320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_calib3d320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_ccalib320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_core320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_datasets320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_dnn320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_dpm320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_face320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_features2d320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_flann320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_fuzzy320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_highgui320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_imgcodecs320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_imgproc320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_line_descriptor320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_ml320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_objdetect320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_optflow320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_photo320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_plot320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_reg320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_rgbd320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_saliency320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_shape320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_stereo320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_stitching320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_structured_light320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_superres320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_surface_matching320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_text320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_tracking320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_video320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_videoio320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_videostab320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_xfeatures2d320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_ximgproc320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_xobjdetect320.lib") #pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_xphoto320.lib") #endif
もしくは、もう一つの方法としてヘッダファイルの時と同じように、プロパティを開きリンカーの追加のライブラリディレクトリに
C:/opencv320/build/install/x86/vc14/lib
を追加します。
次にリンカーの入力の追加の依存ファイルにlibフォルダの中身を追加します。構成のDebugかReleaseかによって追加するファイルを分けてください。
opencv_xxxd.libはDebugに、opencv_xxx.libはReleaseといった感じに追加してください。
OpenCVあれこれ。
OpenCVでよく使う色んな物を適当に追加していく。
- cvtColor()
【参考URL】
【OpenCV】色変換(cvCvtColor)の組合せ 画像処理ソリューション
cvtColor(src_image, dest_image, CV_BGR2GRAY);
src_imageの色空間を変換してdest_imageに出力する。CV_BGR2GRAYならカラーをグレースケールに。RAW画像を使えば『CV_BayerGB2RGB』,『CV_BayerRG2RGB』,『CV_BayerGR2RGB』のどれかでカラー画像にもできる。そのときはベイヤーパターンに注意。
- VideoCapture
- resize()
- rectを使ったトリミング
OpenCVのVideoWriterを使って画像から動画を作る。
連続した画像(パラパラ漫画のうような画像)から一つの動画を作ったのでメモを残しときます。
流れ
- VideoWriterのクラスがあるライブラリをインクルードする。
- 動画ファイルの箱を作る。
- 動画ファイルが正しく開けているか確認する。
- 動画ファイルに画像を追加していく。
VideoWriterクラスについて
コンストラクタで箱となる動画ファイルを作って設定を行います。
VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true)
【引数の説明】
引数 | 説明 |
---|---|
filename | 書き出すファイル名。 |
fourcc | コーデックを指定するための関数。(4つの文字を引数に取ります。) |
fps | 動画像のフレームレート。(=1秒あたりのフレーム数) |
frameSize | 動画像の縦横サイズ。 |
isColor | カラーの動画像ファイルとして書き出すかを指定する。 |
fourccは実際にはこう使います。
VideoWriter::fourcc('W', 'M', 'V', '1')
引数となる4つの文字は以下の通り。
コーデック名 | 引数 | 拡張子 |
---|---|---|
MP4S | ('M', 'P', '4', 'S') | .mp4 |
MP4V | ('M', 'P', '4', 'V') | .mp4 |
DIV3 | ('D', 'I', 'V', '3') | .avi |
DIVX | ('D', 'I', 'V', 'X') | .avi |
I420 | ('I', '4', '2', '0') | .avi |
IYUV | ('I', 'Y', 'U', 'V') | .avi |
MJPG | ('M', 'J', 'P', 'G') | .avi |
PIM1 | ('P', 'I', 'M', '1') | .avi |
XVID | ('X', 'V', 'I', 'D') | .avi |
dv25 | ('d', 'v', '2', '5') | .wmv |
dv50 | ('d', 'v', '5', '0') | .wmv |
dvc | ('d', 'v', 'c', ' ') | .wmv |
dvh1 | ('d', 'v', 'h', '1') | .wmv |
dvhd | ('d', 'v', 'h', 'd') | .wmv |
dvsd | ('d', 'v', 's', 'd') | .wmv |
dvsl | ('d', 'v', 's', 'l') | .wmv |
H263 | ('H', '2', '6', '3') | .wmv |
M4S2 | ('M', '4', 'S', '2') | .wmv |
MP43 | ('M', 'P', '4', '3') | .wmv |
MPG1 | ('M', 'P', 'G', '1') | .wmv |
MSS1 | ('M', 'S', 'S', '1') | .wmv |
MSS2 | ('M', 'S', 'S', '2') | .wmv |
WMV1 | ('W', 'M', 'V', '1') | .wmv |
WMV2 | ('W', 'M', 'V', '2') | .wmv |
WMV3 | ('W', 'M', 'V', '3') | .wmv |
WVC1 | ('W', 'V', 'C', '1') | .wmv |
mp4v | ('m', 'p', '4', 'v') | .mov |
サンプルプログラム
下記のサンプルプログラムは『C:\log\』にある『0000000.jpg』『0000001.jpg』『0000002.jpg』...といった画像を一つの動画にして『C:\Users\shibafu\Documents\OutVideo.wmv』というファイルに出力するプログラムです。
#include "opencv2/highgui.hpp" #include "opencv2/Videoio.hpp" #include <opencv2/core.hpp> #include <stdio.h> #include <iostream> using namespace std; using namespace cv; int main(){ //出力する動画ファイルの設定をします。拡張子はWMV1で、毎秒15フレーム、画像縦横サイズは1024*1024。 VideoWriter writer("C:\\Users\\shibafu\\Documents\\OutVideo.wmv", VideoWriter::fourcc('W', 'M', 'V', '1'), 15.0, Size(1024, 1024)); //動画ファイルがちゃんと作れたかの判定。 if (!writer.isOpened()){ return -1; } //動画にする画像の名前を入れる文字配列。 char image_name[100]; //動画にする画像を入れるMat。 Mat image; //『0000000.jpg』から『0001000.jpg』までの画像を動画にしていく。 for (int i = 0; i < 1001; i++){ //画像の名前を更新。 sprintf(image_name, "C:\\log\\%07d.jpg", i); //名前に対応した画像を取り込み。 image = imread(image_name); //画像がなければ処理を飛ばす。 if (image.empty()) { cout << "no image : " << image_name << endl; continue; } //動画ファイルに画像を出力。 writer << image; } return 0; }
まっさらな状態からUbuntu14.04LTSでChainerのFaster-RCNNを使って物体検出
Faster-RCNNを実装したのでそのメモを残します。
なるべく初めてでもできるように、まっさらな状態から環境構築して実装までやっていきます。が、この分野の知識が全くない状態から始めているので、間違いがあるかもしれません。気をつけてね。
ちなみにCaffeじゃなくてChainerを選んだ理由は導入が簡単だったからです。最初Caffeでもやろうとしたけど挫折しました。Caffeはまた時間があるときに再挑戦してみます。
とりあえず投稿したけど、書きかけでまだわかりづらいところもあると思うので、時間があるときに加筆修正したいと思います。長いから記事を分けるかも。
環境
【ハードウェア環境】
- Quadro6000
全体の流れ
実装までの流れは以下の通り。
Ubuntu14.04LTSのインストールから始めて、実際にデモを動かすところまでやります。
- Ubuntu14.04LTSをインストール、設定する。
- pyenvをインストールする。
- Anaconda3-4.1.1をインストールする。
- OpenCV3.1をインストールする。
- Nouveauドライバを無効化する。
- CUDAをインストールする。(Nvidiaドライバのインストール含む。)
- cuDNNをインストールする。
- Chainerをインストールする。
- Faster-RCNNをインストールする。
- 実装する。
Ubuntu14.04LTSをインストールする。
Chainerを動かすためのOSをインストールします。
が、申し訳ありませんが今回インストール手順は説明してません。また今度別記事にて説明する予定です。
pyenvをインストールする。
Ubuntu14.04LTSをインストールしたらさっそくPython管理ツール『pyenv』というものをインストールします。
Faster-RCNNを実装するにはPythonにいろんなパッケージをインストールしなきゃいけない。そのパッケージそれぞれが導入に結構なハードルがあって一つ一ついれていくのはかなり面倒。
そこで元からいろんなパッケージが入ったお得セットみたいなPythonがある。それがAnacondaです。そして、このAnacondaと普通のPythonをお手軽に切り替えることができるソフトがpyenv(PYthon ENVironmentの頭文字かな?)というもの。(私個人の理解なので、間違った認識をしているかもしれません。)
今回の実装ではAnacondaを使うのでPythonの切り替えにpyenvを使います。
【導入方法】
まず、以下の操作をしてUbuntu14.04LTSに入っているいろんなソフト(パッケージ)やら何やらを最新にします。
Control + Alt + T を押してターミナルを起動して、以下のコマンドを一行ずつ打ち込みます。
sudo apt-get update sudo apt-get upgrade
これが終わったら次にpyenvをインストールするためにgitのインストールを行います。下記のコマンドを打ち込んでください。
sudo apt-get install git
次に、gitを使ってpyenvをcloneします。
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
cloneしたpyenvのパスを通します。
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc source ~/.bashrc
これでpyenvがインストールされました。
Anacondaをインストールする。
【参考記事】
次にAnaconda3-4.1.1をインストールします。
pyenvのインストールでも書いたが、Anacondaはいろいろ入ったお得なPythonセットのようなものだ。これを入れることで、OpenCVの導入もものすごく簡単になる。
【導入方法】
Anacondaの導入はpyenvを使って行う。
まず、下記のコマンドでインストールできるAnacondaのバージョン一覧を確認する。
pyenv install -l | grep anaconda3
すると、このように一覧が表示されると思う。
anaconda3-2.0.0 anaconda3-2.0.1 anaconda3-2.1.0 anaconda3-2.2.0 anaconda3-2.3.0 anaconda3-2.4.0 anaconda3-2.4.1 anaconda3-2.5.0 anaconda3-4.0.0 anaconda3-4.1.0 anaconda3-4.1.1
そしたら、この中から最新のバージョンを選び下記のコマンドでインストールしよう。この記事を書いたときはAnaconda3-4.1.1が最新だったのでそれをインストールする。
pyenv install anaconda3-4.1.1
すると、
Downloading Anaconda3-4.1.1-Linux-x86-64.sh... -> https://repo.continuum.io/archive/Anaconda3-4.1.1-Linux-x86-64.sh
と出てしばらく止まったままだけどちゃんと動いるので、待ちます。
その後、
Installing Anaconda3-4.1.1-Linux-x86-64... Installed Anaconda3-4.1.1-Linux-x86-64 to ○○
と表示されたらリハッシュします。
pyenv rehash
これでインストール完了です。
ちゃんとインストールされたか確認します。下のコマンドで、UbuntuにインストールされているPythonの一覧が表示されます。
pyenv versions
Pythonを切り替えるには
pyenv global anaconda3-4.1.1
切り替わったかの確認
pyenv version
pyenvではなくPython側からも確認できる。
python --version
Anacondaと表示されていれば成功。
OpenCV3.1をインストールする。
Nouveauドライバ無効化
NVIDIA製のGPUを積んでいるパソコンの場合、CUDAを使うためにNVIDIAのドライバをいれたほうがいいでしょう。ですが、どうやらUbuntuに標準で入っているNouveauというドライバとNVIDIAのドライバが競合してしまうらしいのでNouveauを無効化します。
【参考記事】
【導入方法】
blacklist-nouveau.confというファイルを編集します。もし、ファイルがなければ作成してください。
sudo vim /etc/modprobe.d/blacklist-nouveau.conf
で下記を追記して保存します。
blacklist nouveau options nouveau modeset=0
その後、下記のコマンドを打ち、
sudo update-initramfs -u
最後にUbuntuを再起動します。
CUDAをインストールする。(NVIDIAドライバのインストール含む)
CUDAはNVIDIA製のGPUを使って並列処理を行うためのライブラリです。
ちなみにCUDAをインストールするとNVIDIAのドライバも一緒にインストールされるようです。
【参考記事】
【導入方法】
まず、自分のGPUの型番を確認して下記URLから、対応しているCUDAのバージョンを調べます。
そしたらNVIDIAのサイトからCUDA Toolkitをダウンロードします。こちらのサイトは最新版のURLになります。
自分のGPUが最新版に対応していなかった人はこちらから。
Select Target Platformという欄から自分の環境にあったものを選択していきます。今回はUbuntu14.04LTSの64bit環境なので、
Linux → x86_64 → Ubuntu → 14.04 → deb(local)
と選択していきます。
最後のInstaller Typeの欄ですが、deb(local)かdeb(network)を選びましょう。
2つの違いはCUDAをダウンロードしきってからインストールするか、ダウンロードしながらインストールするかの違いです。前者は手元にCUDAのデータが残りますが、後者は残りません。ですので、もし何か手違いがあってCUDA入れ直す事になったとき、後者の場合はもう一度ダウンロードしなければいけなくなります。今回は入れ直す可能性も考えて、deb(local)を選択します。
表示されたDownloadのボタンを押して、ダウンロードします。ダウンロード場所はどこでもいいと思いますが、今回は
~/home/shiba/Download/
にします。
ダウンロードが終わったらダウンロードしたディレクトリにcdコマンドで移動します。そして、
sudo dpkg -i cuda-repo-ubuntu1404-8-0-local_8.0.44-1_amd64.deb sudo apt-get update sudo apt-get install cuda
でCUDAをインストールします。
次に.bashrcか.bash_profileに下記のコマンドを追記します。
export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
.bashrc .bash_profileどちらもhomeにある隠しファイルです。今回は.bashrcに追記します。
具体的な追記方法は、
sudo gedit ~/.bashrc
でエディタを開いて上記のコマンドをコピペして保存します。
もしくは、
echo 'PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc echo 'LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
とコマンドを入力します。
.bashrcに追記した後は、
source ~/.bashrc
と入力します。
なお、『パスを通す』ことや、『export』コマンドについて詳しくは以下のURLを参照。
- UbuntuデスクトップでPATHの設定は、~/.bashrc か ~/.bash_profile か ~/.profile のどれに書けばよいのか? - 部屋の中にも一年
- .bash_profileと.bashrcについて - Qiita
- パス(PATH)の確認と設定方法は? - Pocketstudio.jp Linux Wiki
- PATHを通すとは? (Mac OS X) - Qiita
- [Mac, Linux] PATHを通す方法 | Memo on the Web
- echoコマンドの詳細まとめました【Linuxコマンド集】
『source』コマンドについては、
インストールできたか確認する
nvcc -V
CUDAのバージョンが確認できれば成功。
CUDAのインストールが完了するとNVIDIAのドライバもインストールされるので、確認します。
lsmod | grep nvidia
このコマンドを打つと下の3つが表示されます。
nvidia_uvm ●● nvidia ●● drm ●●
●●の部分は人によって多分違います。
参考にさせて頂いた記事にも書いてありましたが、私の環境でもnvidia_uvmが表示されていませんでした。なので
dpkg -l | grep nvidia
このコマンドで、nvidia-●●-uvmを探します。見つけたら、
sudo modprobe nvidia-352-uvm
と打ってカーネルモジュールにnvidia-uvmを登録します。
再び、
lsmod | grep nvidia
と打って、
nvidia_uvm ●● nvidia ●● drm ●●
の3つが出てくれば成功です。Ubuntuを再起動しましょう。
ちなみに、NVIDIAのドライバを個別にインストールする場合は下記の記事を参考に。
cuDNNのインストール
cuDNNはディープニューラルネットワークを効率よく処理するためのライブラリです。
【参考記事】
【導入方法】
まず、NVIDIAのサイトからcuDNNをダウンロードしなきゃいないんですが、cuDNNのダウンロードにはユーザー登録が必要です。
下記のサイトからユーザー登録を行います。
NVIDIA cuDNN | NVIDIA Developer
Registerをクリックします。
何やら色々書いてありますが、とりあえずJoin nowをクリック。
必要事項を英語で記入していきます。
Organization Nameには個人なのでIndividualと記入して次へ。(どうでもいいけど、13歳未満はcuDNNを使えないのは何故なんでしょう。そんなに過激なものなのか・・・)
自分の環境や使う言語、利用目的やらを記入して登録。
数日すると完了するようなのでそしたら、cuDNNをダウンロードします。
再び下記のサイトへ。
NVIDIA cuDNN | NVIDIA Developer
今度はDownloadをクリック。登録したメールアドレスとパスワードを入力してログイン。
そしたら再び何に使うのかやらどういう分野に使うのかやらをチェックして次へ。
cuDNNのソフトライセンスを熟読して同意したらチェックボックスにチェック。
そしたら、色々バージョンがでてくるので、自分のCUDAのバージョンに合った最新のcuDNNをダウンロードしましょう。
この記事を書いているときは、cuDNN v5.1が最新でしたので、
Download cuDNN v5.1 (August 10, 2016), for CUDA 8.0
をクリック。そして、
cuDNN v5.1 Library for Linux
をクリックして『cudnn-8.0-linux-x64-v5.1.tgz』をダウンロードしましょう。これもダウンロードはどこでもいいと思います。
ダウンロードが完了したらターミナルでダウンロードしたディレクトリにcdコマンドで移動します。移動したら、
tar -zxf cudnn-6.5-linux-x64-v2.tgz cd cudnn-6.5-linux-x64-v2
と打って、cuDNNの解凍と解凍したディレクトリへの移動をします。
ここまできたらcuDNNのインストールを行うのですが、cuDNNのインストールはただファイルをコピーするだけとなっています。なので下のコマンドを打って終わりです。
cd lib sudo cp lib* /usr/local/cuda/lib64/ cd ../ cd include/ sudo cp cudnn.h /usr/local/cuda/include/
インストールできたか確認します。
python -c "import cupy.cudnn"
と打って何も起こらなければOKです。
ちなみに余談ですが、参考記事にもありますが、Chainerを先にインストールしてしまい後からcuDNNをインストールする場合、Chainerを再インストールする必要があるそうです。具体的には
pip unisntall chainer
でchainerをアンインストールした後に、
pip install chainer
Chainerをインストールする。
いよいよChainerをインストールしていきます。
【参考記事】
【導入方法】
まず、Python環境がAnacondaに切り替わっていることを確認します。
pyenv versions
でAnacondaと出てくればOK。もし違うようなら、
pyenv global anaconda3-4.1.1
で切り替える。
次にPythonパッケージ管理ツールpipを使って依存関係をインストールします。ただ、下記のパッケージはおそらくAnacondaと一緒に入っているので(pipも)、入れようとしてももう入っているよって言われると思います。ですが、念のためコマンドを入力しておきます。
pip install numpy pip install cython
そうしたら、次にchainerのインストールを行います。
pip install chainer
これでChainerのインストールは完了です。ちゃんとインストールできたか確認します。
python -c "import chainer"
と入力して何も起こらなければOKです。
Faster-RCNNをインストールする。
【参考記事】
【導入方法】
GitHubからchainer-faster-rcnnをクローンします。
githubからクローンする場所なのですが人によってホントにまちまちでいろんな記事を参考にしているとてんでバラバラになってしまいます。なので、今回は参考にさせていただいた記事にならい ~/github というディレクトリを作成してそこにクローンしたいと思います。
クローン用のディレクトリを作成します。
mkdir ~/github
作ったディレクトリに移動して、chainer-faster-rcnnをクローンします。
cd ~/github git clone https://github.com/mitmul/chainer-faster-rcnn
クローンしたディレクトリに移動して、dataというディレクトリを作成します。
cd chainer-faster-rcnn mkdir data
作ったdataディレクトリに移動して、プレトレーニングモデルをダウンロードします。
cd mkdir wget https://dl.dropboxusercontent.com/u/2498135/faster-rcnn/VGG16_faster_rcnn_final.model
chainer-faster-rcnnディレクトリに戻り、サンプルの画像をダウンロードします。
cd .. wget http://vision.cs.utexas.edu/voc/VOC2007_test/JPEGImages/004545.jpg
が、何故か自分の環境ではサンプル画像がダウンロードできず。なので、適当にネットから画像を引っ張ってきてこのディレクトリに保存しました。
画像が用意できたらついに、デモの実行です。
python forward.py --img_fn 004545.jpg --gpu 0
物体が資格で囲まれたresult.jpgという画像がディレクトリに出力されれば成功です。やったね!
オプションの詳細は
--img_fn 入力画像 --out_fn 出力画像、 省略でresult.jpg --gpu 0でGPUモード、 -1もしくは省略でCPUモード
となっています。
参考にさせて頂いた記事まとめ
- Python3とOpenCV3の環境を構築してみた | SoraLab / ソララボ
- Faster R-CNNのChainer実装で物体検出を試してみた | SoraLab / ソララボ
- Ubuntu14.04のChainer1.9でGPU(CUDA)を使う | めめんと
- UbuntuにCUDAを入れようとしたらハマった - Qiita
- Windows上にChainer v1.5+CUDA+cuDNNを一番簡単に入れれる方法 - Qiita
- Ubuntu 14.04.3 LTS に Chainer をインストールする - 不確定特異点
- Ubuntu 14.04にCUDA 7.0とcuDNNを導入する - Ry0 Note
- GitHub - mitmul/chainer-faster-rcnn: Object Detection with Faster R-CNN in Chainer
- UbuntuでNVIDIAのドライバをインストールする - Qiita