今回は外部ライブラリとリンクする方法,
WEBカメラのようなハードウェアにアクセスするのはPHPの標準機能では不可能なことで,
OpenCVのインストール
まずは公式WikiのLinux向けインストールガイド
specファイルを記述する
今回制作するcvcaptureモジュールのspecファイルの構成はリスト1のようになっています。
リスト1 specファイル概要
<?xml version="1.0" encoding="UTF-8"?>
<extension name="cvcapture" version="0.1.0">
<summary>Capture frames from webcams.</summary>
<!-- モジュール情報(説明は省略) -->
<!-- 依存関係(リスト2-1,2-2) -->
<!-- 定数定義(リスト3) -->
<!-- 関数定義(リスト4) -->
</extension>
依存関係を定義する
依存関係の定義はリスト2-1にあるように,
リスト2-1 依存関係定義
<deps language="c" platform="all">
<!-- pkg-configを使って“opencv”の設定を取得する -->
<with name="opencv" mode="pkg-config">
<!-- ヘッダ名(ヘッダのインクルードパスもpkg-configで設定される) -->
<header name="cv.h"/>
<header name="highgui.h"/>
</with>
</deps>
リスト2-2 pkg-configを使わない依存関係定義
<deps language="c" platform="all">
<!-- configureの引数--with-cvcaptureで指定されたパス(省略時は
“/usr /usr/local”)から“include/opencv/cv.h”を探す -->
<with testfile="include/opencv/cv.h">
<!-- ヘッダ名(includeからの相対パス) -->
<header name="opencv/cv.h"/>
<header name="opencv/highgui.h"/>
<!-- ライブラリ名(libなどの接頭辞や.soなどの拡張子は不要) -->
<lib name="cv"/>
<lib name="highgui"/>
</with>
</deps>
定数を定義する
続いて,
リスト3 定数定義
<constants>
<!-- CV_CAP_*はopencv/highgui.hで定義されているマクロ -->
<constant type="int" name="CV_CAP_ANY" value="CV_CAP_ANY">autodetect</constant>
<-- (省略) -->
<constant type="int" name="CV_CAP_QT" value="CV_CAP_QT">QuickTime</constant>
</constants>
関数を定義する
最後に,
筆者はCodeGen_
値を返す関数のプロトタイプでは関数名の前にvoidではなく戻り値の型を書きます。また,
キャプチャする画像の大きさはカメラによって変わるので,
リスト4 関数定義
<function name="cv_camera_capture">
<proto>bool cv_camera_capture(string filename[, int index[, mixed &size]])</proto>
<summary>Capture from camera.</summary>
<description>(省略)</description>
<test>
<code><?data
if (cv_camera_capture("test_camera.jpg", CV_CAP_ANY, $size)) {
print_r($size);
}
?></code>
<result mode="format"><?data
Array
(
[0] => %d
[1] => %d
)
?></result>
</test>
</function>
<function name="cv_file_capture">
<proto>bool cv_file_capture(string dst_filename, string src_filename[, mixed &size])</proto>
<summary>Capture from video file.</summary>
<description>(省略)</description>
<test>
<skipif><?data
if (!file_exists("sample.3g2")) {
die("skip sample video file does not exist");
}
?></skipif>
<code><?data
if (cv_file_capture("test_file.jpg", "sample.3g2", $size)) {
print_r($size);
}
?></code>
<result mode="format"><?data
Array
(
[0] => %d
[1] => %d
)
?></result>
</test>
</function>
- ※1
ライブラリがpkg-configをサポートしている必要があります。インストール先によっては,
環境変数PKG_ CONFIG_ PATHでパッケージ情報ファイル (*.pc) のあるディレクトリを指定する必要があります。詳しくはpkg-configのmanページをご参照ください。