OpenNH

日常のひとこま(自分用のメモとかあれこれ)

Windows10でアプリ表示がぼやけてしまう場合の対処

 

ノートパソコンを新しくしてMATLAB R2017aを起動したことろ、以下のように画面がぼやけて表示されてしまう現象にあいました。

この現象が現れるのは、外部ディスプレイに接続して表示した場合のみで、組み込みディスプレイではちゃんときれいに表示されています。

f:id:FounderLeis:20181107141728p:plain

 

原因はなんなのか…高画素ディスプレイを使用しているためにアプリが対応していなくで微妙に拡大表示されているのかな、とも考えながらググっていたらいい記事を発見したので転載しておきます

www.itmedia.co.jp

 

解決方法

アプリの実行ファイルのショートカットの"プロパティ"から、

互換性 > 高DPI設定の変更 >

 ・"プログラムDPIにチェック"  

 ・"DPIの使用をプログラムを開いたときに変更"

を設定すれば完了です。

f:id:FounderLeis:20181107142538p:plain

f:id:FounderLeis:20181107142719p:plain

f:id:FounderLeis:20181107142251p:plain

 

これで、きれいに表示されるようになりました。

f:id:FounderLeis:20181107143129p:plain

 

よかったです。

 

 

 

 

OpenCV3.4.3の環境構築【Windows10】

はじめに

Windows環境かつVisual Studioで、OpenCVを利用したアプリケーション開発を行いたい人向けの環境構築方法について載せておきます。なお、OpenCV3.4.3をCmakeを用いてビルドする方法を紹介します。動作確認としてVisual Studio 2015を利用します。

OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)

OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)

環境

Windows10 Pro
Visual Studio 2015
OpenCV3.4.3
CMake3.13.0

CMakeのインストール

現行で最新のcmake-3.13.0のwindows版を公式サイトからダウンロードします。今回はzipファイルを選択します。
↓ダウンロードリンク(zipファイルがダウンロードされます)
https://cmake.org/files/v3.13/cmake-3.13.0-rc2-win64-x64.zip

f:id:FounderLeis:20181104092609p:plain:w514

zipファイルをインストールしたら任意のフォルダに展開(解凍)してください。私の環境では2,3分かかりました。

f:id:FounderLeis:20181104093645p:plain:w216

このようなフォルダとなっているはずです。

「~\bin\cmake-gui.exe」でもうCMakeを使うことができます。

f:id:FounderLeis:20181104093934p:plain:w135

 cmake-gui.exeを実行すると以下のようなGUIが表示されれば正常にインストール完了です。

f:id:FounderLeis:20181104094633p:plain:w490
 

もし以下のような注意が表示された場合は、「詳細情報」から「実行」を選択してください。
f:id:FounderLeis:20181104094404p:plain:w300
f:id:FounderLeis:20181104094459p:plain:w300

コマンドプロンプトから実行したい場合

コマンドプロンプトからCMakeを実行したい場合には、環境変数に以下のパスを追加してください。

環境変数  環境値
Path C\:<保存先>\CMake\bin 

 コマンドプロンプトで、"cmake --version"コマンドを実行して以下のようなメッセージが表示されていればCMakeの環境変数設定が正しく行われています。
f:id:FounderLeis:20181104102908p:plain:w460


CMakeのインストールはこれで終わりです。それでは、OpenCVをインストールしていきましょう。

 

OpenCVのインストール

現行でOpenCV3シリーズ最新の”OpenCV3.4.3”のwindows版を公式配布サイトからダウンロードします。今回はCMakeでビルドするので「Sources」を選択します。

↓ダウンロードリンク(zipファイルがダウンロードされます)
https://github.com/opencv/opencv/archive/3.4.3.zip

f:id:FounderLeis:20181104095105p:plain:w380

zipファイルをインストールしたら任意のフォルダに展開(解凍)してください。私の環境では3分くらいかかりました。

f:id:FounderLeis:20181104100818p:plain:w210

このようなフォルダ構成となっているはずです。

  
それではCmakeでビルドしていきます。
Cmake-GUIを起動して、以下の操作をしてください。

  1. ソースコード場所には、さっき解凍した先のルートディレクトリ「C:\<保存先>\opencv-3.4.3」を、ビルド先(ソリューションファイルの生成先)には,「C:\<保存先>\opencv-3.4.3\build」をそれぞれ指定
  2. 「Configure」をクリック
  3. 今回はVisual Studio 2015の環境なので、コンパイラは「Visual Studio 14 2015 Win64」を指定

f:id:FounderLeis:20181104103803p:plain:w415

 そうすると、
下図のように設定可能なパラメータが赤く表示されます。任意で設定項目を変更してください。特に設定をしない場合は、そのままで結構です。
CUDAの設定を行いたい方は、次節を読んでください。

f:id:FounderLeis:20181104105030p:plain:w400

設定をカスタマイズした後に「Configure」をクリックし、最後に「Generate」をクリックことで、ソリューションファイルを生成できます。

 

CUDAの設定を行う

使用するパソコンにCUDAがインストールされており、OpenCVのCUDA機能を使いたい人のみ以下の設定を行ってください。なお、この設定を行うとビルド時間がとても長くなります。
(以前に他のPCでセットアップした時の設定なのでVersionが異なります)

f:id:FounderLeis:20181104110735p:plain:w400

↓↓ GPUアーキテクチャ番号の確認
https://developer.nvidia.com/cuda-gpus

 f:id:FounderLeis:20181104111003p:plain:w400

OpevCVでCUDAを利用する場合の設定は以上です。

 

以下はCUDAを利用しない人も共通です。

OpenCVのビルド

 ソリューションファイルの生成先に指定した「C:\<保存先>\opencv-3.4.3\build」直下にある「OpenCV.sln」をVisual Studioで開きます。

  1. バッチビルドから”ALL_BUILD”のDebugとReleaseをチェックします。
  2. チェックしたら”ビルド”します。
  3. ビルドが終了し「C:/<保存先>/opencv-3.4.3/build/install」にinclude、libおよびbinが正しく保存されていれば完了です。

f:id:FounderLeis:20181104112001p:plain
 

環境パスの設定

プログラムを作成するたびにOpenCVのdllファイルをコピーしてくるのは面倒なので、環境パスに設定しましょう。環境変数"Path"にOpenCVのdllファイルが存在するフォルダのパスを追加してください。

 環境変数 環境値
Path C:\<保存先>\opencv-3.4.3\build\install\x64\vc14\bin  

これで、いちいち面倒な作業がなくなります。

 

サンプルプログラム

黒背景に緑色の「OpenCV」の文字を描画した画像を生成するだけのプログラムになります。実行すると以下のような画像が表示されます。
f:id:FounderLeis:20181104204555p:plain:w250

ソースコード

#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

// OpecCVのライブラリの読み込み
#ifdef _DEBUG
#pragma comment(lib,"opencv_core343d.lib")
#pragma comment(lib,"opencv_highgui343d.lib")
#pragma comment(lib,"opencv_imgproc343d.lib")
#else
#pragma comment(lib,"opencv_core343.lib")
#pragma comment(lib,"opencv_highgui343.lib")
#pragma comment(lib,"opencv_imgproc343.lib")
#endif

int main()
{
// 幅320px-高さ240pxの画像を生成
cv::Mat img(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 0));

// 画像に「OpenCV」の文字列を描画
cv::Mat dst = img.clone();
cv::putText(dst, "OpenCV", cv::Point(80, 100), cv::FONT_HERSHEY_SIMPLEX, 1.2, cv::Scalar(0, 200, 0), 2, CV_AA);

// 描画
cv::imshow("dst image", dst);
cv::waitKey(10000);

return -1;
}


注意点

プロジェクトのプロパティでOpenCVのインクルードディレクトリとライブラリディレクトリを指定してから実行してください。
f:id:FounderLeis:20181104212053p:plain:w350

Cドライブのアイコンにビックリマークが表示された場合の対処【Windows10】

先日ノートPCを新しくしてセットアップをしていたら、気づいたらCドライブのアイコンにビックリマークが表示されていました。

f:id:FounderLeis:20181031094742p:plain

最初ドライブ名を設定していなかったので、「Local-Drive」と変更したのですがそれでもビックリマークは消えない…なぜなんだー?

 

といことでググッてみたら同じ症状が出てる人がわりといまして、この方の記事がわかりやすく原因と対処方法を載せてくれていました。

zaka-think.com

 

原因

どうやら、ドライブが暗号化されていないためのようです。

 

対処

暗号化されてないって、じゃぁどーすればいいの?

「BitLocker」というWindows10に標準搭載されているディスク暗号化機能を使って暗号化すればよいそうです。

 

まず、Cドライブを右クリックして「BitLockerを有効にする」をクリックしてください。

f:id:FounderLeis:20181031095358p:plain

 以下のような画面が表示されるはずです。

Microsoftアカウントのサーバー(たぶんonedrive)にバックアップを保存したい人は「Microsoftアカウントに保存する」を指定してください。今回はローカルもしくは個人サーバーのファイルにバックアップ場所を確保したいので、「ファイルに保存する」を選択します。

f:id:FounderLeis:20181031133402p:plain

保存先のフォルダを指定するダイアログボックスが開かれるので、保存先を指定して”保存する”ボタンをクリックしてください。

 

最後にアクティブ化の画面が出てくるので、「BitLockerのアクティブ化」をクリックして終了です。

f:id:FounderLeis:20181031134041p:plain

 

これで、Cドライブは暗号化されアイコンに表示されていたビックリマークが消えるはずです。

 

 

 

 

 

 

 

OpenCV3.2のVideoWriterを使って動画作成

連続した画像から動画を作成するプログラムです。

詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識

詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識


開発環境

・windows10
Visual Studio 2015
・OpenCV3.2
 

サンプルプログラム (C++)

サンプルでは↓のような300回カウントアップしていくだけの動画が作成されます。
各自で画像を読み込むコードを追加していただければ、好きな画像を読み込んで動画にすることができます。
f:id:FounderLeis:20181024173434g:plain
 
以下c++のサンプルコードです。

#include <opencv2/highgui.hpp>
#include <iostream>

#ifdef _DEBUG
// Debugモード
// OpecCVのライブラリの読み込み
#pragma comment(lib,"opencv_core320d.lib")
#pragma comment(lib,"opencv_highgui320d.lib")
#pragma comment(lib,"opencv_imgproc320d.lib")
#pragma comment(lib,"opencv_imgcodecs320d.lib")
#pragma comment(lib,"opencv_videoio320d.lib")
#else
// Releaseモード
// OpecCVのライブラリの読み込み
#pragma comment(lib,"opencv_core320.lib")
#pragma comment(lib,"opencv_highgui320.lib")
#pragma comment(lib,"opencv_imgproc320.lib")
#pragma comment(lib,"opencv_imgcodecs320.lib")
#pragma comment(lib,"opencv_videoio320.lib")
#endif

int main()
{
	// 幅320px-高さ240pxの画像を生成
	cv::Mat img(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 0));

	int    fourcc  = cv::VideoWriter::fourcc('X', 'V', 'I', 'D'); // コーデックを指定 
	double fps     = 30.0;   // 動画のフレームレートを指定
	bool   isColor = true;   // カラーで保存するか否か
	int    N       = 300;    // 動画にする画像の枚数を指定
	char   str[32];

	// 出力する動画ファイルの設定
	cv::VideoWriter writer("Sample_video.avi", fourcc, fps, img.size(), isColor);

	// 動画ファイルの初期化に成功したか判定
	if (!writer.isOpened()) {
		std::cout << "Can't VideoWriter open" << std::endl;
		return -1;
	}

	for (int i = 0; i < N; i++)
	{
		// 画像に「OpenCV "画像番号"」の文字列を描画
		cv::Mat dst = img.clone();
		sprintf(str, "%d", i + 1);
		cv::putText(dst, "OpenCV", cv::Point(80, 100), cv::FONT_HERSHEY_SIMPLEX, 1.2, cv::Scalar(0, 200, 0), 2, CV_AA);
		cv::putText(dst,      str, cv::Point(80, 150), cv::FONT_HERSHEY_SIMPLEX, 1.2, cv::Scalar(0, 200, 0), 2, CV_AA);

		// 入力画像を表示
		cv::imshow("image", dst);
		cv::waitKey(1);

		// 動画ファイルに出力
		writer << dst;
	}
	return -1;
}

 
 
 

注意点

実行する際につまづいた場合のために記載しておきます。

  1. VideoWriterで動画ファイルの初期化エラー(上記のソースコード内の”writer.isOpened()”でfalseが返されるとき)の解決方法

    • OpenCVに同梱されているffmpegのDLL("opencv_ffmpeg320_64.dll")にパスが通っていない可能性があります。
    • パスを通すか、カレントディレクトリ(プログラムの実行ファイル"***.exe"が存在するディレクトリ)にコピーしてください。
    • "opencv_ffmpeg320_64.dll”は、基本的には「...\build\x64\vc14\bin」直下に存在します。


  2. OpenCVのDLLファイルがないと怒れらるときの解決方法

    • プログラムで使用しているDLLファイルにパスが通っていない場合にそのような警告がでます。
    • パスを通すか、カレントディレクトリ(プログラムの実行ファイル"***.exe"が存在するディレクトリ)にコピーしてください。
    • 今回のおプログラムで使用しているOenCVのDLLは以下の5つです。

 
 

よく使うかもしれない線形代数まとめ

はじめに

線形代数学、それは大学で勉強はいろいろしてきましたが講義聞いてるだけでは何につかうの?って感じで全く頭に入っていなかったものです。ですが、研究をするようになって線形代数学の重要性を身にしてみ感じるようになりましたね。ほんとに単純な計算で躓いてしまうと開発速度が遅くなって仕方ないですよね…...。式が解ければ制御できるのに解き方がわからん!ってなって式を解くのに何時間もかけるのはもったいなく感じます。

なので、少しでも時間の節約になればと思い線形代数の計算式をメモ書き程度に載せておきます(あくまで自分用)。

まだ全然項目がありませんが、時間あるときに随時載せていく予定です。
 
 

ヤコビ行列(ヤコビアン

ヤコビ行列(Jacobian matrix)って、要はベクトルをベクトルで微分したものですね。
ベクトル値関数
 f(x) = [ f_1(x), f_2(x), . . . , f_m(x) ]^T
をベクトル
 x = [ x_1, x_2, . . . , x_n ]^T
微分すると、
\[ \frac{\partial f(x)}{\partial x} =
\left[ \begin{array} {rrr}
\frac{\partial f_1}{\partial x_1} & \ldots & \frac{\partial f_1}{\partial x_n} \\
\vdots & \ddots & \vdots \\
\frac{\partial f_m}{\partial x_1} & \ldots & \frac{\partial f_m}{\partial x_n}
\end{array} \right]
\]
となります。これが f xに関するヤコビ行列(ヤコビアン)です。


<例題>
ベクトル値関数 fとベクトル xが以下のように与えられた場合のヤコビ行列は?
\[ f(x) = \left[
\begin{array}{c}
x_1 \\
x_1^2+x_2 \\
x_1^3+x_2^2+x_3 \\
x_1^4+x_2^3+x_3^2+x_4
\end{array}
\right]
~~~~~~~
x = \left[
\begin{array}{c}
x_1 \\
x_2 \\
x_3 \\
x_4
\end{array}
\right]
\]
このときのヤコビ行列は以下のようになります。
\[ \frac{\partial f(x)}{\partial x} =
\left[ \begin{array} {rrrr}
1 & 0 & 0 & 0 \\
2x_1 & 1 & 0 & 0 \\
3x_2 & 2x_2 & 1 & 0 \\
4x_3 & 3x_3 & 2x_3 & 1
\end{array} \right]
\]


ヘッセ行列

ヘッセ行列(Hessian matrix)は、スカラ値関数をベクトルで二階微分したものですね。
ヘッセ行列を考えるにはまず勾配ベクトルを考えるとわかりやすいです。

スカラ値関数 f(x)をベクトル x = [ x_1, x_2, . . . , x_n ]^T 微分すると、
\[ \frac{\partial f(x)}{\partial x} = \left[ \frac{\partial f}{\partial x_1}, \ldots, \frac{\partial f}{\partial x_n} \right]^T \]
となります。これが、 f xに関する勾配ベクトルです。
(ただし、上式は物理学で用いられる勾配ベクトル \nabla fを表しています。)

それで、ヘッセ行列とは勾配ベクトルをさらにベクトル x微分したものなので、
\[ \frac{\partial^2 f(x)}{\partial x^2} =
\left[ \begin{array} {rrr}
\frac{\partial^2 f}{\partial x_1 \partial x_1} & \ldots & \frac{\partial^2 f}{\partial x_1 \partial x_n} \\
\vdots & \ddots & \vdots \\
\frac{\partial^2 f}{\partial x_n \partial x_1} & \ldots & \frac{\partial^2 f}{\partial x_n \partial x_n}
\end{array} \right]
\]
となります。ベクトルをベクトルで微分するのは上述したヤコビ行列の導出でやっているので同様にして解けます。
 
 
 
参考となる資料:

非線形最適制御入門 (システム制御工学シリーズ)

非線形最適制御入門 (システム制御工学シリーズ)

 
 

平均二乗誤差(MSE)

ある値cに対する,データ配列x_iの差分の平方の平均値を平均二乗誤差(MSE:Mean Squared Error)といい、以下の式で表す.
\[ MSE(c) = \frac{1}{n} \sum_{i=1}^n(x_i-c)^2 \]

なお、上式MSE(c)の平方根を平均二乗誤差平方根(RMSE : Root Mean Squared Error)と言い,以下の式で表す。
\[ RMSE(c) = \sqrt{\frac{1}{n} \sum_{i=1}^n(x_i-c)^2} \]

MATLABで音源を利用してみる

MATLABに任意の音源ファイルを読み込んで再生したいなんて時のメモです。

コードはこんな感じで書けばオッケーです!

% 音源ファイルの読み込みと再生
Volume = 0.1;                                 % 音量調整(オリジナル音源振幅に対する倍率)
[y,Fs] = audioread('<ファイル名>. <拡張子>');  % 読み込み
player = audioplayer(y*Volume,Fs);            % 再生オブジェクトの生成
play(player);   % 再生(これだけだと最初から最後まで再生され途中で終了できません)
pause(5);       % 5秒再生
pause(player);  % 一時停止
pause(2);       % 2秒停止
resume(player); % 一時停止した時点から再生を開始
pause(5);       % 5秒再生
stop(player);   % 再生の停止

ちなみに、
サポートしているファイル形式はここに載っています。
オーディオ ファイルの読み取り - MATLAB audioread - MathWorks 日本

VisualC++でOpenMPを使ってみる


OpenMP

OpenMPとはマルチコアCPUによるメモリ共有型の並列化を簡単に実装できる並列化技術です。

目次

  • 目次
  • 開発環境
  • 初めてのOpenMP
  • 並列化数を指定
  • forループを並列化
  • セクションで並列化
  • OpenMPとマルチスレッドの記述比較
  • まとめ

開発環境

Visual Studio 2015 c++
Windows 10 Home
Intel Core i7-6700K

初めてのOpenMP

まず最初に新規プロジェクトで空のアプリケーションを作って、以下のソースを実行してみましょう。
この例では、OpenMPの実行時ライブラリを使用しないので、インクルードする必要はありませんが、後々使うので一応インクルードしています。

#include <omp.h>
#include <stdio.h>

int main()
{
#pragma omp parallel
	printf("Hello OpenMP!\n");

	return 0;
}
続きを読む