スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

DTIのServersMan@VPS LABで借りたタダVPSでOpenCVのSURFで特徴量算出API開発っ

ソースコードなんて雰囲気で読めばいんだよ。動かなくなったらごめんなさいするだけ。by僕



ServersMan@VPS LABのタダサーバーとは
無料トライアルベータ版「ServersMan@VPS LAB」のことです。
保証メモリ1Gでディスク容量50Gで8月30日まで使わしてくれます。
詳細はこちら 


前置き
画像認識、音声認識、自然言語処理には未来を感じる!
うち自然言語はMeCab
うち画像認識(画像処理)はOpenCV
うち音声認識は...しらない。仕事で使った気がするけど知らない
やはり人工知能って大まかにくくられる類いのは胸が熱くなります。

閑話休題。
今回の目標はURLを与えて叩けば、SURF特徴量を算出するAPIの開発です。
なので、GUIな開発はしません。


環境
root@lab-vps-srv127:/usr/local/include/opencv# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04.2 LTS
Release: 12.04
Codename: precise
root@lab-vps-srv127:/usr/local/include/opencv# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

root@lab-vps-srv127:/var/www# php -v
PHP 5.3.10-1ubuntu3.7 with Suhosin-Patch (cli) (built: Jul 15 2013 18:05:44)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies

使う言語とか
C/C++ バージョンは↑に記載
PHP バージョンは↑に記載

まずインスコ
先苦者もとい先駆者がいるのでそっちを参考にしてください。
① http://d.hatena.ne.jp/kotaQ/20120807/1344357359
② http://www.kkaneko.com/rinkou/opencv/opencvinstalllinux.html
③ http://ser1zw.hatenablog.com/entry/20101030/1288441129

③だけで十分

今回の環境はUbuntuだけど、②を最初にすすめててうまくいかねーってなってましたが、①のみて
「あっ これでいいんだ・・・」
ってなったのでOpenCVをwgetしたら①みておけばいいと思います。

情報の公開元に感謝!



あとインスコ確認
下記フォルダにcv.hなどの*.hがあればOKだと思います。

/usr/local/include/opencv



次にビルド方法
先苦者もとい先駆者がいるのでそっちを参考にしてください。
http://www.ok.ctrl.titech.ac.jp/~tkanda/opencv_programming.htm#include

はしょると、ビルドは下記でOKです。
gcc -I/usr/local/include/opencv -c -o test.o test.c

情報の公開元に感謝!

サンプルソースはこちらにあるのを使用
http://opencv.jp/sample/basic_structures.html

情報の公開元に感謝!


helloworld.cppって名前で保存します。
内容を編集します。
cvNamedWindow ("Image", CV_WINDOW_AUTOSIZE);
cvShowImage ("Image", img);
cvWaitKey (0);

cvDestroyWindow ("Image");
cvReleaseImage (&img);
は削除します。
あとp[0]などを標準出力できるようにします。


下記コマンドを叩きます
root@lab-vps-srv127:~/sift# gcc -I/usr/local/include/opencv -c -o hello.o helloworld.cpp

すると、hello.oができる。
(↓な感じ)
root@lab-vps-srv127:~/sift# ll
total 156
drwxr-xr-x 2 root root 4096 Jul 28 05:57 ./
drwx------ 5 root root 4096 Jul 28 04:56 ../
-rw-r--r-- 1 root root 127248 Mar 3 2009 hatsunemiku03.jpg
-rw-r--r-- 1 root root 4200 Jul 28 05:57 hello.o
-rw-r--r-- 1 root root 1012 Jul 28 04:56 helloworld.cpp
-rw-r--r-- 1 root root 1324 Jul 28 04:48 sample01.cpp


あとインスコ確認2
できた実行ファイルhello.oを実行します。



g++ helloworld.cpp -o hello 'pkg-config --cflags --libs -I/usr/local/include/opencv'
gcc -I/usr/loca/include/opencv -L/usr/local/lib -lcxcore -lcv -lhighgui -lcvaux -lml helloworld.cpp -o helloworld


g++ -I/usr/local/include/opencv -L/usr/local/lib -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab helloworld.cpp

---------------
pkg-configについて
なんかうごかねぇ!!
⇒再インスコしたらおk


↓で実行できる
root@lab-vps-srv127:~/sift# g++ `pkg-config opencv --cflags` helloworld.cpp -o my_code `pkg-config opencv --libs`

./my_code 画像ファイル

ってやると大変なことになる。@Putty使い
????????????????????????????????ってのが沢山でてくるのでどうしようもなくなったらPutty使いはタイトルバー?右クリックより「端末をリセット」ってやるとOK


error: 'SURF' was not declared in this scope
は↓
http://extendevernote.blogspot.jp/2012/06/opencv-24-surf.html
g++ `pkg-config opencv --cflags` sample01.cpp -o my_code `pkg-config opencv --libs`
http://nyoke.hateblo.jp/entry/20101221/1337336837
g++ `pkg-config opencv --cflags` sample02.cpp -o my_code `pkg-config opencv --libs`

49 features2d.hpp
-rw-r--r-- 1 root root 5410 Jul 10 07:49 gpu.hpp
-rw-r--r-- 1 root root 2355 Jul 10 07:49 nonfree.hpp
-rw-r--r-- 1 root root 5946 Jul 10 07:49 ocl.hpp

#include "opencv2/nonfree/ocl.hpp"
#include "opencv2/nonfree/gpu.hpp"
---------------


.
.
.
電子レンジで3分チンします!
.
.
.

さて、既にチンしてあるものが、こちらです。





<?php
if(isset($_GET['file'])) {
$file = $_GET['file'];
}

$fileexte = ".jpg";

$url = $file;
$data = file_get_contents($url);
$filename = date('Ymd') . $fileexte;
file_put_contents('./data/' . date('Ymd') . $fileexte ,$data);

echo exec('/root/sift/f_surf_cmd ' . "/var/www/data/$filename");

?>



---
#include <iostream>
#include <string>
#include <fstream>
#include <cv>
#include <highgui>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
// (1)load Color Image
const char *imagename = argc > 1 ? argv[1] : "../image/lenna.png";
Mat colorImage = imread(imagename,1);
if(colorImage.empty())
return -1;

// (2)convert Color Image to Grayscale for Feature Extraction
Mat grayImage;
cvtColor(colorImage, grayImage, CV_BGR2GRAY);

// (3)initialize SURF class
SURF calc_surf = SURF(500,4,2,true);
// (4)extract SURF
vector<KeyPoint> kp_vec;
vector<float> desc_vec;
calc_surf(grayImage, Mat(), kp_vec, desc_vec);

// (5)draw keypoints
// cout << "Image Keypoints: " << kp_vec.size() << endl;

float x;
float y;
float size;
float angle;
float octave;

printf("<surf>
");


for(int i = 0; i < kp_vec.size(); i++) {
KeyPoint* point = &(kp_vec[i]);
int radius; // Radius of Key Point
radius = cvRound(point->
size*0.25);

x = point->pt.x;
y = point->pt.y;
size = point->size;
angle = point->angle;
octave = point->octave;

printf("<keypoint>");
printf("<id>%d</id>",i);
printf("<x>%f</x>",x);
printf("<y>%f</y>",y);
printf("<size>%f</size>",size);
printf("<angle>%f</angle>",angle);
printf("<radius>%d</radius>",radius);
printf("</keypoint>");

}
printf("</surf>");

return 0;
}



C++のソース実行の方法はこれ
root@lab-vps-srv127:~/sift# g++ `pkg-config opencv --cflags` f_surf_cmd_xml.cpp -o f_surf_cmd `pkg-config opencv --libs`
root@lab-vps-srv127:~/sift# ./f_surf_cmd hatsunemiku03.jpg
<surf>
.
.
.
</surf>


PHPはGETでfileって名前の値のURLをつけて叩けば、C++のが動きSURF特徴量が算出され算出結果がXMLとして帰ってきます。(動かしてないから知らない)

KeyPointクラスの詳細はこちら
http://opencv.jp/opencv-2svn/cpp/features2d_common_interfaces_of_feature_detectors.html#KeyPoint



シメ
気持ちよくて脳汁でまくったけど、Apacheはいってないことに気がついて一瞬で冷めたよね。
なので、PHPのソースは動くかは、知りません。
別鯖にコード持って行ってそっちで動かします。ノシ

追伸、不要なところを削除しました。(電子レンジでチンの箇所)
スポンサーサイト

コメントの投稿

非公開コメント

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。