PHP 基礎1
PHPはサーバサイド(Webサービス)を開発するのが得意な言語
データベースと連携したり、フォームデータ処理をしたり、
外部APIと連携したり、また自らAPIを公開してオンラインのサービスを作ったり etc..
1992年に開発された言語
現在稼働しているWebサービスのうち約70%がPHPで実装されている
WordpressもPHPで実装されている
以下公式サイト
PHP: Hypertext Preprocessor
変数と代入
変数は $変数名 で宣言する。
文字列と変数を連結するときは . (コンマ) でつなげる
""(ダブルクォーテーション)に変数を入れるときは変数名を{}で囲む
変数にtrue、falseを代入することでブーリアンとして扱える
以下参考実装
<?php $name = "Bob"; echo "<p>my name is " . $name" . </p>"; echo "<p>my name is ${name} .</p>"; $myNumber = 45; echo "<p>No: ${myNumber}</p>"; $calc = $myNumber * 29 - 2 / 2; echo "<p>calc ${calc}</p>"; $myBool = true; echo "<p>Staus is ${myBool} .</p>"; ?>
配列
array()関数を使って配列を宣言する
配列を出力する場合は、print_r()関数を利用する
配列のあるメンバにアクセスする場合は echo $配列名[添え字] とする
添え字は値だけでなく文字列も利用できる
配列のサイズを取得する場合は、sizeof($配列名)
配列から特定のメンバを削除する場合は、unset($配列名[添え字])
以下参考実装
<?php $myArray = array("Bob","Kate","Tom","Ralph"); print_r($myArray); echo "<br><br>"; echo $myArray[0]; echo "<br><br>"; $yourArray[0] = "piza"; $yourArray[1] = "chocho"; $yourArray[3] = "memo"; print_r($yourArray); echo "<br><br>"; $yourArray["favorite"] = "icecream"; print_r($yourArray); $thirdArray = array("France" => "French", "Japan" => "Japanaese", "USA" => "English"); echo "<br><br>"; print_r($thirdArray); echo "<br><br>"; echo sizeof($thirdArray); unset($thirdArray["France"]); echo "<br><br>"; echo sizeof($thirdArray); ?>
条件分岐
他言語同様 if 分で条件分岐
&& でAnd 演算子、|| でOr 演算子
<?php $role = "admin"; // $role = "guest"; $position = "director"; // $position == "manager" if($role == "admin" || $position == "manager" ){ echo "<p>Log in Success</p>"; } else{ echo "<p>Log in Failed</p>"; } if($role == "admin" && $position == "director" ){ echo "<p>Log in Success</p>"; } else{ echo "<p>Log in Failed</p>"; } ?>
ループ分
他言語同様、ループにforが利用できる
また配列分をループさせる場合はforeachが便利
以下参考実装
<?php for($i = 0; $i < 10; $i++){ echo $i."<br>"; } $family = array("Bob","Tom","Jhon","Paul"); foreach($family as $key => $value) { echo $key.":".$value."<br>"; } ?>
while分も利用できる
以下参考実装
<?php //配列のメンバ分、ループする $i = 0; $family = array("Bob","Tom","Jhon","Paul"); while($i < sizeof($family)){ echo $family[$i]." "; $i++; } ?>
※無限ループには気を付ける
OpenCVを利用したアプリ開発 顔認識
カメラ画像から人の顔を検出した場合に赤枠で囲むアプリ開発のメモ
分類器読み込み
OpenCVにはHaar-likeとよばれる明暗で構成される矩形のパターンを検出に使う手法の特徴分類機が予め用意されている。
格納場所:[OpenCV Install Dir]/Library/etc/haarcascades/
haarcascade_frontalcatface.xml は猫の顔、haarcascade_smile.xml は笑顔を分類できる。
今回は、haarcascade_frontalface_alt.xml で正面の人の顔を認識するアプリを作る。
これをオブジェクト検出のためのカスケード分類器クラスに読み込む
//顔を学習した分類器読み込み CascadeClassifier cascade; cascade.load("C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");
※CascadeClassifierの利用には、[opencv_objdetectXXX.lib]を依存ファイルに追加する必要あり
以下参考
初めてのOpenCV開発 ― Visual Studio/CMake/NuGetでプロジェクト作成【OpenCV 3.0/3.1】 - Build Insider
カメラ画像取得
VideoCapture cap(0) でカメラをオープン。引数の"0"はデフォルトのカメラを意味する。
2台目のカメラを接続しオープンする場合は、"1"を指定する。
VideoCapture::isOpened() でカメラがオープンされたかチェック
cap >> frame で現在のフレームをcv::Matに取得。
//カメラ画像取得 Mat frame; VideoCapture cap(0); // デフォルトカメラをオープン if (!cap.isOpened()) // カメラオープンの成否判定 { return -1; } do { cap >> frame; // カメラから新しいフレームを取得 } while (frame.empty());
グレースケール化
2値化処理を行うためにRGB画像からグレースケールへの変換
Mat gray; cvtColor(frame, gray, CV_BGR2GRAY);
物体検出
読み込んだ分類器を元に、入力画像中から該当するオブジェクトを検出
オブジェクトを検出するメソッドは"cascade.detectMultiScale"
//物体検出 vector<Rect> faces; cascade.detectMultiScale(dst, faces, 1.1, 2, CV_HAAR_SCALE_IMAGE, Size(30, 30));
あとは検出した場合、顔を囲む短形を"cv::rectangle"で描画する
プログラミング
※重い処理になるので物体検出用に入力画像を縮小している
#include "opencv2/opencv.hpp" #include "opencv2/objdetect/objdetect.hpp" using namespace cv; int main() { printf("Lesson2\n"); //顔を学習した分類器読み込み CascadeClassifier cascade; cascade.load("C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml"); //カメラ画像取得 Mat frame; VideoCapture cap(0); // デフォルトカメラをオープン if (!cap.isOpened()) // カメラオープンの成否判定 { return -1; } while (1) { do { cap >> frame; // カメラから新しいフレームを取得 } while (frame.empty()); double scale = 4.0; // 1/4 Mat gray, smallImg(saturate_cast<int>(frame.rows / scale), saturate_cast<int>(frame.cols / scale), CV_8UC1); //グレースケール化 cvtColor(frame, gray, CV_BGR2GRAY); // 縮小 resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR); //ヒストグラム均一化 equalizeHist(smallImg, smallImg); //imshow("frame", smallImg); //物体検出 vector<Rect> faces; cascade.detectMultiScale(smallImg, faces, 1.1, 2, CV_HAAR_SCALE_IMAGE, Size(30, 30)); std::vector<Rect>::const_iterator r = faces.begin(); for (; r != faces.end(); ++r) { rectangle(frame, Size(saturate_cast<int>(r->tl().x * scale), saturate_cast<int>(r->tl().y * scale)), Size(saturate_cast<int>(r->br().x * scale), saturate_cast<int>(r->br().y * scale)), Scalar(0, 0, 255), 3, 4); } imshow("frame", frame); if (waitKey(30) >= 0) { break; } } return 0; }
OpenCVを利用したアプリ開発の環境構築メモ(Windows)
OpenCVを利用したアプリ開発の環境構築メモ
以下からOpenCVをダウンロードする。
Releases - OpenCV library
ダウンロードしたexeを実行し任意の場所に解凍。
今回はCドライブ直下に格納。
OpenCVのソースコードをビルドし、Windows向けのライブラリを生成する。
Visual Studioに同梱されている「開発者コマンドプロンプト」上で下記コマンドを実行。
$ cd C:\opencv-2.4.13 $ mkdir build-msvc2015 $ cd build-msvc2015 $ cmake -G "NMake Makefiles" -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DWITH_FFMPEG=OFF -DCMAKE_BUILD_TYPE=Debug ..\sources $ nmake $ nmake install $ cmake -DCMAKE_BUILD_TYPE=Release ..\sources $ nmake $ nmake install $ nmake clean
インストール後、環境変数のPathに下記を追加する。
C:\opencv-2.4.13\build-vs2015\install\x86\vc14\bin;
OpenCVを使ったアプリケーションのプロジェクト作成方法は以下を参考にする。
http://www.buildinsider.net/small/opencv/004#visualstudio
以下のカメラ映像を表示するプログラムにて正しく環境構築ができているか確認し、
frameウィンドウにカメラ映像が表示されていればOK
#include "opencv2/opencv.hpp" using namespace cv; int main() { VideoCapture cap(0); // デフォルトカメラをオープン if (!cap.isOpened()) // 成功したかどうかをチェック return -1; Mat frame; while (1) { cap >> frame; // カメラから新しいフレームを取得 imshow("frame", frame); if (waitKey(30) >= 0) break; } return 0; }