Robinit

IT関連メモ

PHP 基礎1

PHPはサーバサイド(Webサービス)を開発するのが得意な言語
データベースと連携したり、フォームデータ処理をしたり、
外部APIと連携したり、また自らAPIを公開してオンラインのサービスを作ったり etc..

1992年に開発された言語
現在稼働しているWebサービスのうち約70%がPHPで実装されている
WordpressPHPで実装されている
以下公式サイト
PHP: Hypertext Preprocessor

Hello World with PHP

echoで文字列を出力する

<?php
    echo "Hello World!";
?>

変数と代入

変数は $変数名 で宣言する。
文字列と変数を連結するときは . (コンマ) でつなげる
""(ダブルクォーテーション)に変数を入れるときは変数名を{}で囲む
変数に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++;
}
?>

※無限ループには気を付ける

参考 WebブラウザでPHPのエラーを表示する設定

以下のようなコードを書いてWebブラウザでアクセスする

<?php
    phpinfo(); 
?>

すると以下のような画面が表示される
f:id:wonder_three:20180114233748p:plain

"Loaded Configuration File"に設定ファイルが格納されているので、
php.ini ファイルの display_errors と、error_reporting を、
以下のように更新する

display_errors =  on
error_reporting = E_ALL 

更新した後はWebサーバアプリを再起動する

OpenCVを利用したアプリ開発 顔認識

カメラ画像から人の顔を検出した場合に赤枠で囲むアプリ開発のメモ

f:id:wonder_three:20180112002644p:plain

分類器読み込み

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);

ヒストグラム均一化

グレースケール画像のヒストグラム均一化処理を実行、画像のコントラストを改善し、強度範囲を拡張

	Mat dst;
	equalizeHist(gray, dst);

物体検出

読み込んだ分類器を元に、入力画像中から該当するオブジェクトを検出
オブジェクトを検出するメソッドは"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;								
}