粗大メモ置き場

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

【Tex】卒論修論には是非ハイパーリンク機能をつけよう

Texの小ネタです。

念のために解説しておくとハイパーリンクとはクリックした時に該当ページとかに飛ぶあれです。

論文の式や図,参照文献へのアクセスを簡単にする為にハイパーリンクをつけるのはとても有用です。
特に長い文章,そう,卒論や修論においてこれはとっても有用なんです。

導入準備

まずは,hyperref.sty と pxjahyper.sty が入っていることを確認してください。

確認方法は,コマンドプロンプトを開いて,

kpsewhich hyperref.sty

と打つとファイルが存在する場合その場所を教えてくれます。
W32texを使っている人ならみな入っていると思われますが,もし入っていなければ以下の記事など参考にして,styファイルをダウンロードして導入してくください。

ossyaritoori.hatenablog.com

プリアンブルの記述方法

ポイントは2つあって,hyperref.styの定義場所とpxjahyper.styの詳細設定です。
dvipdfmxの後ろに[hyperref]の記述を追加するのを忘れないように。

\usepackage[dvipdfmx]{hyperref,graphicx}
% for hyperref
\usepackage{pxjahyper}
\hypersetup{
	colorlinks=false, % リンクに色をつけない設定
	bookmarks=true, % 以下ブックマークに関する設定
	bookmarksnumbered=true,
	pdfborder={0 0 0},
	bookmarkstype=toc
}

至極簡単なこの動作で,CitationとCaptionへのハイパーリンクを付けられます。

設定の中身については以下のところが実用的にわかりやすく説明してくれてます。
ハイパーリンク付きLaTeX文書

記述方法その2 ー 2017年1月追記 ー

上記のやり方は図の変換を扱うdvipdfmxに書き加える形になるのが気に食わないですね。1つの機能は1つの箇所に記述したいものです。
LyX-2.1.4 から生成する PDF のリンクのバグ対応 - stattotto’s blog
上記のブログを参考にした所,下のように書いても良さそうです。

% for hyperref
\usepackage[dvipdfmx, bookmarkstype=toc, colorlinks=false, pdfborder={0 0 0}, bookmarks=true, bookmarksnumbered=true]{hyperref}
\usepackage{pxjahyper}

hyperrefは前述のdvipdfmxと別に宣言しても大丈夫でした。また,初期設定を宣言時に行うことができるようですね。
こちらの方が機能を分けられるのでこちらを採用することにしました。(2017年1月現在)

卒論や修論のためのTips:空の章番号へのジャンプ

卒論や修論ではChapter単位でコンパイルをしていくことかと思います。

謝辞などの空の章,すなわち\chapter*{}などで数字のない章を付ける場合,リンクがズレてしまう仕様があるらしいです。
この場合,仮想的なSectionを作成することでこの問題を回避します。

例えば,

\chapter*{謝辞}

と書く代わりに以下のように書きます。

\newpage
\phantomsection
\addcontentsline{toc}{chapter}{謝辞}
\include{Thanks/Thanks}

URLや単語へのハイパーリンク

当然,ハイパーリンクの関係はつけ放題です。
や,結局これも参考文献を見たほうが詳しいですね。

\url{url} :文字列urlにURLを関連付ける(tildeやunderbar文字も処理する)
\href{url}{text} :textをリンク文字列としてパイパーリンクURLを関連付ける
\hypertarget{name}{text} :textにPDFファイル内のリンクポイント名nameを付与する
\hyperlink{name}{text} :textにPDFファイル内のラベル名nameを関連付ける

エラーについて

少なくとも古いclsファイルなどと一緒に使った場合変なエラーが出る事がわかっています。
誰か教えて~~。



Matlab program for dft,fft (離散フーリエ変換)

突然ですがmaltabのreferenceページって結構見づらくないですか?

特にClassとして実装されてる奴らはどういう処理をするのかかなりわかりづらいと私は思っています。
どの操作が必要だったか忘れがちなので記しておきます。アホらしいですが...

fft in MATLAB

fftコマンドは非常に便利ですが,
ナイキスト周波数で折り返しが生じること
・ 周波数のスケーリングを自分で行う必要があること
の2点が実用上面倒です。

DFT用のコード(FFTも同じ)

以下のように関数化しました。パワースペクトル密度の表示まで意外とやることがあるのでこれで結構快適になったと思われます。

11/08 追記:直流成分の除去も中でするようにしました。単に平均を引いてやっています。

function [f power] = DFTandShow(t,x)
if size(t) == 1
    sampling = t;
else
    sampling = t(2) - t(1);
end

% transpose so that row become longer
if size(x,1) < size(x,2)
    x = x.';
end

sf = 1/sampling % Sample frequency (Hz)
L = max(size(x)) % data length(window length)

% calc average
average = ones(1,L)*x(:,1) / L;

x = x - average;

% fft
N = pow2(nextpow2(L));  % Transform length
N = 512;

y = fft(x,N); %fft

f = (0:N-1)*(sf/N);     % Frequency range ( sampling fq / fft length )
power =abs(y/N) *2 ;   % Power of the DFT

figure;
plot(f,power)
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('frequency (Hz)')
ylabel('Power')
grid on;
xlim([0 f(floor(N/2))]) % cut off faster frequency than nyquist freq
end

MATLAB 画像の相互情報量の計算と比較 (地図と航空写真のマッチング)

随分昔に遊んだコードを掘り出して懐かしくなったのでネットに放流します。
輝度値の二乗誤差(SSD)とはまた違う画像の相互情報量なるものを計算して画像を比較する手法の紹介です。
伝統的に医療用画像なんかのマッチングに使われている感じです。

今現在この手のコードは以下のリポジトリにて管理しています。
EvaluateImage/evaluate_image.m at master · YoshiRi/EvaluateImage · GitHub

Gist版はZNCCのコードに誤りがあります。(あとで直します)

相互情報量とは

ある確率pで起こる事象の情報量Hは次のような式で表されます。

H=\log_2 \frac{1}{p}=-\log_2p

ある事象Aのもつ情報量をH(A),BのをH(B)とすると,それらの間の相互情報量MI(A,B)は次の式で計算されます。

MI(A,B)=H(A)+H(B)-H(A,B)
ここで,H(A,B)はAもBも起こる時の情報量です。

画像の相互情報量

では,この話を画像に持ち込むとどうなるかといいますと,

事象:画像の中である画素値が出現する確率 p_I(i)とする。すなわち,0~255の画素値のうちxという画素がどの頻度で出現するかで先程の情報量を定義します。


画像Iの持つ情報量はIの中の全ての画素値の情報量の総和

H({I})= -\sum_{i=0}^{N_{cI}} p_{{I}}(i)\log(p_{{I}}(i))
として表され,これは実際の計算では出現回数を確率として正規化したヒストグラムを用意することになります。



同様にして結合情報は,
画像Iで画素がx,画像I*で画素がyとなる場合の2次元ヒストグラムを用いて同様に情報量を計算します。

H({I,I^*})=-\sum_{i=0}^{N_{cI}} \sum_{j=0}^{N_{cI^*}} p_{{II^*}}(i,j) \log (p_{{II^*}}(i,j))
注意として,例えば輝度を256階調にするとこのヒストグラムは256*256の結構大きな反復試行を要求されるので計算量が大きくなります。


最終的に画像同士の相互情報量は以下の式で計算されます。

MI({I,I^*})=H({I})+H({I^*})-H({I,I^*})

この値が大きいほど,2つの画像の相関が高い,すなわちより似ていると評価できます。

実際の比較:地図画像と航空写真のマッチング

地図画像と航空写真をあわせるのは人間にはなんてことない作業ですが,
画像処理では画素値の相関が殆ど無いのでこれは結構きついです。

相互情報量はそのあたりなんとか出来るらしい[参考文献1]です。試してやんよ。

入力画像

航空写真 map_MI1
f:id:ossyaritoori:20161102140022p:plain

GoogleMapの地図画像 map_MI2c
f:id:ossyaritoori:20161102140029p:plain
を比較します。


結果の紹介

地図の画像を順次平行移動させながら,相互情報量を図っていくコードを組みました。



これが順次画像をずらしていった時の相互情報量のMappingです。
f:id:ossyaritoori:20161102132457p:plain

ここから,ある特定の地点で相互情報量が最大化されることがわかります。


わかりやすさのために,中心付近でx方向のみ切り出すと次のようになります。
f:id:ossyaritoori:20161102132550p:plain

ちょっとずれてるのが気になりますが,平行移動が0の時に航空写真と地図が最もマッチングしているということがわかります。
逆に言うと2つの画像のうち,片方の位置をずらして比較すると相互情報量が下がるということです。


比較手法

比較手法としてよくあるSSDNCC,ZNCCを載せておきます。

f:id:ossyaritoori:20161212173607p:plain:w200f:id:ossyaritoori:20161212173828p:plain:w200f:id:ossyaritoori:20161212173917p:plain:w200

まぁあまり満足行く結果にはなりません。正直画像が悪すぎるというのもあるのですが。
とにかく相互情報量はこういった画像同士の相関を評価する手法として妥当そうという結論になります。

実際のコード

一年以上前に書いたのですごく汚いですが,
ご容赦ください。

コードを組む際のコツ:軽量化

説明の通り,ヒストグラムを作ってカウントアップしていくことで相互情報量を計算できるのですが,
普通の256階調でやると計算になかなか時間がかかります。

従って階調をダウンサンプリングすることでこの問題を回避できます。論文では8階調程度まで落としても平気そうと書いてありますね。

画像間の相互情報量を計算するコード

gradに階調を与えることで,軽量化を図っています。

比較手法のコード

MIの比較用として,SSDNCC,ZNCCを用いました。
まぁ説明なんかは下のサイトを見てください。教科書にあると思います。
パターンマッチング(正規化相関など) 画像処理ソリューション

Gistに貼っておきました。お好きにどうぞ。

プロット用コード

上で述べた各関数を用いてプロットしています。
コツとしては移動させた時,画面外の領域を参照させないこと。
これをさせると存在しない領域との差を積み上げるため不確かな結果が出ます。

% Read image
AI = imread('map_MI1.png');
BI = imread('map_MI2.png');

% BI=imtranslate(AI,[15, -15]);

% if colored make it grayscaling
if numel(size(AI)) > 2
    AI = rgb2gray(AI);
end
if numel(size(BI)) > 2
    BI = rgb2gray(BI);
end


%% 
 MImap = zeros(101);
 
 for i = 1:101
     for j = 1:101
         Bii = imtranslate(BI,[i - 51, j - 51]);
         MImap(i,j)=MutualInformation(AI(51:205,51:205),Bii(51:205,51:205),16);
     end
 end
 
 %% find position
[mm,yy]=max(MImap);
[mv,mx]=max(mm);
my=yy(mx);
dx = mx -51;
dy = my -51;

% maximum value
MImap(my,mx)
BI_rev= imtranslate(BI,-[dx dy]);

figure(3)
imshow(imfuse(AI,BI_rev))
title('MI based matching')
 %% showing
 % mesh mapping
 figure(1);
 mesh(MImap);
title('MI function')

 
 memory = zeros(101,1);
 for i = 1:101
memory(i) = i-51;
 end

 % linear comparizon
 figure(2);
 plot(memory,MImap(51, :));
 grid on
xlabel('Translation [pix]');
ylabel('Mutual Information')
title('256 gradation');

 %% SSD ,NCC, ZNCC
  SSDmap = zeros(101);
  NCCmap = zeros(101);
  ZNCCmap = zeros(101);

  
 for i = 1:101
      for j = 1:101
          Bii = imtranslate(BI,[i - 51, j - 51]);
          SSDmap(i,j)=SSD(AI(51:205,51:205),Bii(51:205,51:205));
          NCCmap(i,j)=NCC(AI(51:205,51:205),Bii(51:205,51:205));
          ZNCCmap(i,j)=ZNCC(AI(51:205,51:205),Bii(51:205,51:205));
      end
 end

%% showing the results

figure(4);
 mesh(SSDmap);
 title('SSD function')

figure(5);
 mesh(NCCmap);
 title('NCC function')

 figure(6);
 mesh(ZNCCmap);
 title('ZNCC function')

参考論文

A. Dame, E. Marchand,'Second-Order Optimization of Mutual Information for Real-Time Image Registration'' IEEE TRANSACTIONS ON IMAGE PROCESSING, VOL. 21, NO. 9, SEPTEMBER (2012)

pythonマルチスレッド + ビデオ取得からの顔認識&切り出し

pythonでマルチスレッドが思ったよりも簡単にできるっぽいので試してみました。

手順

以下のサイトに親切な説明が付いています。
Pythonでマルチスレッド処理 - Qiita

  • threading.Threadのサブクラスを作る.
  • threading.Threadのインスタンスを作る.

ふむふむ。ってどの事だかよくわかりませんね。(ザコ並の感想)

以下自分用メモですが言い直すと

  • サブクラスの作成:

class hoge(threading.Thread)とすることでhogeはthreading.Threadを継承したサブクラスになる。ということ。

runで定義される関数を作ることで、hoge.startでその関数を実行できるということ。

動画からの画像読み出し

cap = cv2.VideoCapture(0)

でデフォルトのカメラデバイスをオープンします。0のところをファイル名にしたら動画ファイルも読めるのかな?(憶測)

画像をcapから取得するのは

ret, frame = cap.read()

と書け、frameにイメージが。retに成功したかのflagが保存されます。
正直、以下のように書くことが多いのでほとんど気にしないかとは思いますが。

while(cap.isOpened()):

コード

例のごとく様々なところを参考にしています。
cascade_pathのところは過去記事を参照してください。

# -*- coding:utf-8 -*-
#webカメラの映像から顔を探し白の枠線をつけて保存するプログラム

import cv2
import threading
from datetime import datetime

class FaceThread(threading.Thread):
	def __init__(self, frame):
		super(FaceThread, self).__init__()
		self._cascade_path = "haarcascade_frontalface_alt.xml"
		self._frame = frame

	def run(self):
		#グレースケール変換
		self._frame_gray = cv2.cvtColor(self._frame, cv2.COLOR_BGR2GRAY)

		#カスケード分類器の特徴量を取得する
		self._cascade = cv2.CascadeClassifier(self._cascade_path)

		#物体認識(顔認識)の実行 -> each rectangle coordinate of face is in _facerect
		self._facerect = self._cascade.detectMultiScale(self._frame_gray, scaleFactor=1.2, minNeighbors=3, minSize=(10, 10))

		if len(self._facerect) > 0:
			print '顔が検出されました。'
			self._color = (255, 255, 255) #白
			for self._rect in self._facerect:
				##検出した顔を囲む矩形の作成
				#cv2.rectangle(self._frame, tuple(self._rect[0:2]),tuple(self._rect[0:2] + self._rect[2:4]), self._color, thickness=2)	
				
				#現在の時間を取得
				self._now = datetime.now().strftime('%Y%m%d%H%M%S')
				self._image_path = 'faces/' + self._now + '.jpg'
				#切り出し
				self.x = self._rect[0]
				self.y = self._rect[1]
				self.width = self._rect[2]
				self.height = self._rect[3]
				self.dst = self._frame[self.y:self.y+self.height, self.x:self.x+self.width]	
				#認識結果の保存				
				cv2.imwrite(self._image_path, self.dst)



# main


# カメラをキャプチャ開始
cap = cv2.VideoCapture(0)

ret, frame = cap.read()

while(cap.isOpened()):
	ret, frame = cap.read()

	#frameを表示
	cv2.imshow('camera capture', frame)

	if(threading.activeCount() == 1):
		th = FaceThread(frame)
		th.start()

	#10msecキー入力待ち
	k = cv2.waitKey(10)
	#Escキー or'q' を押されたら終了
	if k == 27:
		break
	if k == ord('q'):
		break

#キャプチャを終了
cap.release()
cv2.destroyAllWindows()

結果と反省

結果うまくマルチスレッドを機能させることに成功しました。
すべて一つのコードで書いていた時よりも目に見えて実行速度は向上したと思います。

これで顔領域をたくさん切り取って学習なんかに使えそうですね。

ただ、秒単位でしか名前をつけていないのでいくつかデータを無駄に捨てているのがやや問題でしょうか、
あと、意外と顔以外の領域もキャプチャしてきます。これも学習をするならどける必要がありそうです。

Raspberry Pi3 に OpenCV3をインストール(Raspbian Jessie環境上)&キャリブレーション

前回UbuntuOpenCV入れて遊んだので今度はRaspberryPiに入れてみます。

前回の記事↓
ossyaritoori.hatenablog.com

正直同じような手順な上,完全に以下のサイトの通りやったので特に言うことはありません。

Install guide: Raspberry Pi 3 + Raspbian Jessie + OpenCV 3 - PyImageSearch

以下個人用のメモを残すのみとさせていただきます。

cmake後

手持ちの環境ではPython3にnumpyとOpenCV3が紐付けられた。

OpenCV make 時

非常に熱くなるので適宜冷やしながら行った。途中でフリーズした。

それ以後

現在検証中~~

キャリブレーション

python2系で書いてますけど実際は3の環境でやるので
printまわりは直しておかないと行けないですね。

rmsエラーが自分は0.3程度になりましたがいくつくらいになるといいのかの感覚などはいまだ無いです。

# -*- coding: utf-8 -*-
# largely from here
# http://russeng.hatenablog.jp/entry/2015/06/16/004704

import numpy
import cv2
# get file name efficiently
from glob import glob 

def main():
 
    square_size = 1.0      # 正方形のサイズ
    pattern_size = (10, 7)  # 模様のサイズ
    pattern_points = numpy.zeros( (numpy.prod(pattern_size), 3), numpy.float32 ) #チェスボード(X,Y,Z)座標の指定 (Z=0)
    pattern_points[:,:2] = numpy.indices(pattern_size).T.reshape(-1, 2)
    pattern_points *= square_size
    obj_points = []
    img_points = []
 
    for fn in glob("images/*.jpg"):
        # 画像の取得
        im = cv2.imread(fn, 0)
        print "loading..." + fn
        # チェスボードのコーナーを検出
        found, corner = cv2.findChessboardCorners(im, pattern_size)
        # コーナーがあれば
        if found:
            term = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1)
            cv2.cornerSubPix(im, corner, (5,5), (-1,-1), term)
        # コーナーがない場合のエラー処理
        if not found:
            print 'chessboard not found'
            continue
        img_points.append(corner.reshape(-1, 2))   #appendメソッド:リストの最後に因数のオブジェクトを追加
        obj_points.append(pattern_points)
        #corner.reshape(-1, 2) : 検出したコーナーの画像内座標値(x, y)
 
    # 内部パラメータを計算 rms,CameraMatrix,Distorition,rotate vec,translate vec
    rms, K, d, r, t = cv2.calibrateCamera(obj_points,img_points,(im.shape[1],im.shape[0]),None,None)
    # 計算結果を表示
    print "RMS = ", rms
    print "K = \n", K
    print "d = ", d.ravel()
    # 計算結果を保存
    numpy.savetxt("rms.csv", numpy.array([rms]), delimiter =',',fmt="%0.14f")
    numpy.savetxt("K.csv", K, delimiter =',',fmt="%0.14f")
    numpy.savetxt("Dist.csv", d, delimiter =',',fmt="%0.14f")
 
if __name__ == '__main__':
    main()

地味にnumpysavetxtでスカラー値を保存できない問題

numpy.savetxt で“tuple index out of range”?
などと出る場合、arrayではなく単一の数として認識しているためエラーになります。

numpy.array([rms]) として1行1列の行列として扱ってやることで解決しました。意外とむずい。

Ubuntu16.04 LTSにOpenCV3.1をインストール から顔認識のテストまで

長らく眠っていたUbuntu使用のレッツノートですが、
最近試したいことが増えたので徐々に出番が増えてきています。
現時点(2017年1月)での最新バージョンであるOpenCV3-1-0を入れて動作確認するまでをメモします.

追記:より良いプログラミング環境のために

個人的に初学者がOpenCVを単体でインストールするのはきちんとした目的がない限りあまりお勧めできません.

Pythonで開発したいのであればAnacondaを使って他のパッケージとまとめてインストールするのが良いです.以下,Windows版の記事ですがUbuntuでもほぼ同じ工程をたどります.
ossyaritoori.hatenablog.com

また,Robot制御に興味関心があるのであればROSを入れることでもOpenCVのパッケージは勝手にダウンロードされます.
ossyaritoori.hatenablog.com


これらとは別にOpenCVを入れる動機としては現状,

  • 最新のOpenCVを使ってC++で高速なコードを書きたい.

といった局所的なものになるかと思います.なお,本記事のサンプルコードはどちらの環境でもきちんと動くはずです.(Python2,3系の修正は必要かも)

環境

Ubuntu 16.04.1 LTS
PC:64bit メモリ:8G

Python 2.7.12

所要時間

所要時間は 10分〜30分前後を見たほうがいいと思います。
ダウンロードとmakeのどちらもそれなりに時間がかかります.

インストールファイルの準備

ほぼすべて、以下のブログの手順通りです、
OpenCV3.1.0のインストールメモ (Ubuntu 14.04 LTS) - umejanのブログ

zipの入手

最初のディレクトリは好きに選んでください。とりあえずDownloadsに入れました。
今思えばhome直下に作ってもよかった。

cd ~/Downloads
wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/3.1.0/opencv-3.1.0.zip
unzip opencv-3.1.0.zip

requirement のインストール

詳細はよくわかってません、とりあえず言うとおりにしておきましょう。
時々新しいバージョンを求められるので、適宜書き換えて使ってください。

sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev libtiff5-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy python-tk libtbb-dev libeigen3-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common texlive-latex-extra libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev default-jdk ant libvtk5-qt4-dev

cmakeによる環境の構築

人によってはcmakeのコマンドが入っていないことも多々あるのでまずはターミナルでcmakeと打ってみてください。
ダメなら表示の指示にしたがってコマンドをインストールすることから始めます。

必ず、opencv-3.1.0のディレクトリに移動してから以下のコマンドを順々に実行していってください。
エラーが出る場合はだいたいがパッケージがないからなので、適宜apt-getしてください。

僕の場合はcheckinstallなんかが引っかかりました。
こいつはいろいろ要求してきましたが大体言うとおりにした結果うまく行っています。
責任は取りませんけどね!

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D WITH_FFMPEG=OFF -D BUILD_opencv_python2=ON ..

make -j4
sudo make install
sudo checkinstall
sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
echo "OpenCV ready to be used"

ldconifgを行ったあとで以下のような画面がでて完了かと思います.
f:id:ossyaritoori:20170622183850p:plain

最後に:cv2.soの移動/ Pythonへの認識のさせ方

/usr/local/lib/python2.7/site-packages/
にcv2.soがないらしいので(?)以下の操作をします。
これをするしないでそこまで変化があるかは謎です。確かに上記ディレクトリにはなにも存在しなかったので
一応言うとおりにしています。

sudo cp ~/Downloads/opencv-3.1.0/build/lib/cv2.so /usr/local/lib/python2.7/site-packages/

追記:二度目の環境ではいろいろと変更が加わっていたため違う感じになっていました.
まず,Importを行うとrosのdist-packagesにcv2がないと怒られたので以下のようにしました.

sudo cp ~/opencv-3.1.0/build/lib/cv2.so  /opt/ros/kinetic/lib/python2.7/dist-packages/

動作確認

pythonを起動し以下のように打ち込んで結果を得たらとりあえずはインストール終了と言えるでしょう。

>>> import cv2
>>> cv2.__version__
'3.1.0'

OpenCV3系列を入れたのにimportに書くのはcv2のようです.
どういう意味でしょうね?

インストール後のテストコード

画像のOpen

テストコード実行できればもっと安心ですね。
lenaさんの画像は以下からどうぞ
f:id:ossyaritoori:20161021033709p:plain

import cv2
img = cv2.imread('lena.jpg')
cv2.imshow('img',img)
cv2.waitKey(0)

顔認識

もっと進んだテストがしたい方はこちら。
lenaさんの顔を認識して顔の付近を赤く囲むプログラムです。
実に簡単にかけますね、素晴らしい。

#coding: utf-8

import cv2
import numpy as np

faceCascade = cv2.CascadeClassifier('~/Downloads/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_alt.xml')

img = cv2.imread('lena.png', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face = faceCascade.detectMultiScale(gray, 1.1, 3)

# write rectangle in detected face
if len(face) > 0:
	for rect in face:
		cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0,255), thickness=2)
else:
	print "no face"

cv2.imshow('detected',img)
cv2.waitKey(0)
cv2.imwrite('detected.png', img)

トラブルシューティング

error: (-215) !empty() in function detectMultiScale

と出る場合は” faceCascade = cv2.CascadeClassifier('~/Downloads/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_alt.xml')”
のpathが間違っているので絶対pathで書き直すか、ファイルそのものを同じディレクトリに持ってきてください。

結果:
f:id:ossyaritoori:20161021054958p:plain



初めて自分の環境で書くpythonです(雑魚)
こうしてみると楽ちんでいいですね。python
実行速度さえなんとかなればな〜。ビデオ版使ってみた感じいうほど遅くないですね。
これが風評被害ってやつか。

Webカメラでリアルタイムに顔認識

Webカメラを繋いで検知するバージョンです。
マルチスレッド化したのも以下の記事に書きました。
ossyaritoori.hatenablog.com

#encode: utf-8 
# large part of this source code is from here
# http://qiita.com/Algebra_nobu/items/a488fdf8c41277432ff3

import cv2
import os

# cascade 
cascade_file = "/home/yoshiri/Downloads/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_alt2.xml"

#get feature point
cascade = cv2.CascadeClassifier(cascade_file) 

# Capture from camera
cap = cv2.VideoCapture(0)

color = (255, 255, 255) # white

while(True):

    # get frame from video stream
    ret, frame = cap.read()

    #face recognition
    facerect = cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))

    for rect in facerect:
        # put rectangle
        cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=2)

     # show
    cv2.imshow("Show FLAME Image", frame) 

    # end after 'q' pressed
    k = cv2.waitKey(1)
    if k == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

なんかおかしいな?と思ったら

OpenCVあるあるですがここでpathが通っていないと何もできません
サンプルコードを実行するためにはPATHを通しましょう。

困った場合は以下のページなんかがとっても親切です(バージョンこそ違いますが)
Ubuntu 14.04 LTSにOpenCV2.4.11をインストール | ShumiLinux

Path の通し方

ターミナルにて以下のコマンドを打つことで

PATH= $PATH: 追加したいPath
export PATH

PATHは:(半角)を使って追加してください。

起動時に自動的にPATHに追加

ここからはバージョン依存の話ですが、
上記のコマンドを起動時に毎回するのは面倒です。

実はhomeディレクト以下に.bash_profileというファイルが存在し、
そのファイルの末尾に先ほどの二行を加えることで自動的に実行させることができます。

ただし、Ubuntu14.04以降は.bash_profileの代わりに
.profileになっていますので間違いのないように。

最終的にはpkg-configのところとlibのところをPATHに追加する必要があります。

参考になりそうな書籍

もしPythonを使うのであれば以下の本が基礎からわかってオススメです。
オライリーは原文の方がいいですが和訳版もまぁまぁ実用的ですね。

実践 コンピュータビジョン

実践 コンピュータビジョン

そんでもってDeepLearningの本も載せておきます。これも同様のPython環境で遊べるので初学者にはもってこいでしょう。

以上宣伝コーナーでした。

追記:PC環境再構築

PCをSSDに移行する際にデータのみ移行したのですが,やはり依存関係が不明なのか再セットアップに迫られました.
cmakeの部分より以降をもう一度実行することで解決した模様です.
やはりSSDは早い.

styファイルを置く場所・置いた後にすること

styファイルがありません^^と言われる。

非常に初心者ぽい記事で恥ずかしいのですが
今ふと,styファイルを置いたら全然読み込んでくれなかったのでメモします。

当方の環境等

  • OS:Windows10
  • Tex:win32texを使用。 \binにpathが通っている,(後で\shareにも通した。)
  • mcode.styを導入しようとした
  • clsファイルとかいくつかのstyを入れた記憶があるのだが...

styを読み込ませる手順

1. C:\w32tex\share\texmf-local\tex 以下に置く

具体例:
C:\w32tex\share\texmf-local\tex\latex\mcodeにstyファイルを置きます。
この際,styファイルと同名のフォルダを作成してその下にstyファイルを置きます。

2.該当フォルダ下で mktexlsr コマンドを実行。

手順例:
エクスプローラーのウィンドウの上部(図参照)をクリックして”cmd”と打つとコマンドプロンプトを呼べます。

f:id:ossyaritoori:20161013024125p:plain

この画面のまま mktexlsr を実行。(打ってリターンするだけ)

f:id:ossyaritoori:20161013024255p:plain

こんなんが出て無事に終了です。

余談:mcode.styについて

matlabのファイルをtexにきれいに貼り付けるコード。

\usepackage[]{mcode}

と宣言した後に

\begin{lstlisting}
a = 1;    % MATLAB comment
b = 2;
c = a^2 + b^2;
\end{lstlisting}

matlabで見るような書式出力がでるらしいです。
が,私の環境では謎バグがでて死亡。結果成果なし夫。寝ようかな...