スポンサーサイト

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

リサイズする【OpenCV】【G++】【C++】【DTI】

表題通り、OpenCVでお気軽にリサイズしてファイル吐き出すめも。
ある所から640*480のBMPかJPGしか受け付けないよwwwwwww ということだったので、それにあわしてあげる。
・・・くっそ。


リサイズ方法は非常にお気軽。
今考えれば、特徴量もお気軽だったのでOpenCVすごいね!

参考サイトはこのサイト


1.事前準備
環境はまったく同じため何回か前の記事参照(OpenCVでSURF特徴量計算な記事)
いつもどおり格安DTIのVPSにて実行してます。


2.内容

①ファイル読み込み

IplImage *img=0, *dst = 0;
char* filename = argv[1];
if( (img = cvLoadImage( filename, 1)) == 0 ){
//ミス時
}


②リサイズ
2行で実装完了する。すてき!
dstにリサイズした画像がはいってる感じです。先に領域確保しなきゃあかんので、640*480のものを作ってます。


dst = cvCreateImage( cvSize(640,480),IPL_DEPTH_8U, 3);
cvResize(img, dst, CV_INTER_CUBIC);



③吐き出す
リサイズしたのを保存すればいいだけ、簡単。
ちなみにnew_file_pathはstd::stringなので。

int saveResult = cvSaveImage( new_file_path.c_str(), dst);


3.出来たヤツの抜粋
includeしてるやつには不要なものが入ってるかもしれない。
外部仕様
 リクエスト:
  argv[1] ・・・ リサイズ対象の画像のローカルパス(/var/www/html/aaaa/hogegege.jpgみたいな)
 argv[2] ・・・ リサイズ後のファイルをおくローカルフォルダ(/home/bokubokuみたいな)

 レスポンス:
  ・省略!

---

#include < stdio.h>
#include < string.h>
#include < fstream>
#include < iostream>
#include < sstream>
#include < sys/stat.h>
#include < opencv2/highgui/highgui.hpp>
#include < opencv2/nonfree/nonfree.hpp>
#include < opencv2/legacy/legacy.hpp>

using namespace std;
IplImage *img=0, *dst = 0;


int main(int argc, char *argv[]){

//locd image
char* filename = argv[1];
if( (img = cvLoadImage( filename, 1)) == 0 ){
return -1;

}

//640*480
dst = cvCreateImage( cvSize(640,480),IPL_DEPTH_8U, 3);

//リサイズ
cvResize(img, dst, CV_INTER_CUBIC);

srand((unsigned)time(NULL));
char random[25];
char material[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int currentrandom;
for(currentrandom = 0; currentrandom<26; currentrandom++){
random[currentrandom] = material[rand()%(sizeof(material)-1)];
}
random[currentrandom] = '\0';

//new folder path
std::string new_file_path(argv[2]);
new_file_path += "/";
new_file_path += random;
new_file_path += ".bmp";

//
int saveResult = cvSaveImage( new_file_path.c_str(), dst);

// 解放
cvReleaseImage(&img);
cvReleaseImage(&dst);

return 0;

}

---


4.しめ
あとはこいつをどう使うか、どう呼び出すか、どう値を返すか などなどを考えればいい。
速きこと、島風の如し、です!


C++である理由
・僕はJavaが嫌い。(仕事で使ってる言語:Java。フレームワーク:SAStruts)
・回線早くなってる時代にローカルで処理させる必要ない。
・解析とか改修したときにローカルで処理させる構成だとみんなアップデートしてくれないかもしれない。
・サーバー負荷はなんとかなる(オートスケールなど)
・単純に実行結果をサーバー側であつめたい(どういう画像が多いかなど解析できる)



追伸、最近タイトルにDTIってつければDTIのTwitterアカウントがRTしてくれるんじゃないかなって思ってます。
スポンサーサイト

C++でnanowwwでバイナリファイルをDLする(g++)

PHPからC++で書いたソフトを呼び出して使う予定なんだけど、大量にローカルで処理するとなるとやはりC++に任せた方が早いものだと思う、常識的に考えて。
ところがC++でHTTP通信なDLするコード書くのは面倒・・・。
ところがどっこいnanowwwを使うと凄く短く分かりやすいコードになる。

ファイルDLするところだけのソースを貼るよ。

環境
CentOS 6.4
gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
※環境については1個前の僕の記事に記載あり。

nanowwwの準備
nanowwwはこちらを参考にしました。感謝!
http://d.hatena.ne.jp/snaka72/20110803/1312390989
※Pullしてsubmoduleもってきてってのを3行でできることをしった。素敵


コーディング
書いたコードはこちら。ほぼ上記URL先サイト様のサンプルにファイル吐き出しとコメント追加しただけ。


#include < stdio.h>
#include < fstream>
#include "../nanowww/nanowww.h"

using namespace std;

int main(void){
nanowww::Client client;
nanowww::Response res;

if (client.send_get(&res, "http://svc.2chan.net/dat/l/src/1379832730989.jpg"))
if (res.is_success()) {

//success
//std::cout << res.content() << std::endl;

   //データ保存
ofstream fs1("test.jpg");
// for (int i = 0; i < 10; i++) {
   fs1 << res.content() << endl;
// }

}else{
//error
std::cout << client.errstr() << std::endl;

}
return 0;
}




シメ
もともとはテキスト的なものをDLするコードだったので「std::cout << res.content() << std::endl;」があったんだけどコメントアウト。
画像DLするようにしたあともそのままにしちゃってて実行したらPuttyがファーwwwwwww

追記、不要なfor文あったのでコメントアウト。きがつかんかった。

DTILABからの移行。Ubuntu12.04->CentOS6.4(OpenCV)

前回のブログで作ったコードをUbuntuからCentOSにもっていかなくてはならなくなった。
というのも、DTIのVPS LABの期限が迫っているからである。
(本来は8月いっぱいだったのを環境移行しても良いよってことで期間が増えた)

ソースコード自体は前回のを使用するんだけど、前回の記事に不足していた事項だったかもしれない...という作業をこっちで紹介するので!
(URLは参考サイト)

結論として、作業内容に差はなくて前回迷ったところをなぞったような形でした。


環境)
CentOS 6.4
gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)


0)OpenCVのインストール
http://shun-ichiro.com/log/reminder/centos-opencv/
http://d.hatena.ne.jp/naruoga/20090527/1243382202


1)GCC(G++)のインストール
そもそもOpencvをcmake .ができなかった。
yum でインスコできるらしいんだけどtarしてcmake . と make と make install の方が作業してる感がいいと思います。

yum install gcc*


2)pkg-configの準備
ないよー><って怒られた。
pkg-configが動いていたので別途インスコとかする必要なくてパスが足りなかっただけでした。

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/


3)nonfree問題
勝手に命名。単純にヘッダファイルに一個ぬけているだけでSURFが使えなくなるというもの。
cv.hの#includeの塊の下に追加↓

#include "opencv2/nonfree/nonfree.hpp"
http://extendevernote.blogspot.jp/2012/06/opencv-24-surf.html


4)コンパイル方法
前回書いた文とちょっと違う気がしないでもないので、訂正の意味も含んで
g++ `pkg-config opencv --cflags` f_surf_cmd_xml2.cpp -o f_surf_cmd02 `pkg-config opencv --libs`


5)libopencv_core.so.2.3がnotでfound
実行時エラーがでる:error while loading shared libraries: libopencv_core.so.2.3: cannot open shared object file: No such file or directory
↓のコマンド打てば良い。結局はないよー><ってだけ。

export LD_LIBRARY_PATH=/usr/local/lib
http://www.ozbotz.org/opencv-install-troubleshooting/



これで実行できるので。あとはいじるだけ。へωへ

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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。