C++

文字列と数値とかの連結

C++

今までboost::formatを使ってたけど使わないとしたら、stringstreamを使うものらしい。めんどい。 #include <sstream> using namespace std; ostringstream os; os << "tmp/" << 35 << ".jpg"; // 連結 string out_filename = os.str();</sstream>

ZeroMQ C++でsub

http://api.zeromq.org/zmq_cpp.htmlこれを #!/usr/bin/env ruby require 'rubygems' require 'zmq' ctx = ZMQ::Context.new sock= ctx.socket(ZMQ::SUB) sock.connect('tcp://127.0.0.1:5000') sock.setsockopt(ZMQ::SUBSCRIBE, 'count') loop do puts sock…

今度こそZeroMQ C++ bindingからpubする

http://d.hatena.ne.jp/shokai/20100811/1281492751 のC++ binding版 Cの関数のラッパーなので先にCで試してからだったら照らし合わせて(http://api.zeromq.org/zmq_cpp.html)理解が早かった pub.cpp #include <stdio.h> #include <iostream> #include <string> #include <zmq.hpp> #include <boost/format.hpp> usi</boost/format.hpp></zmq.hpp></string></iostream></stdio.h>…

sprintf

C++

mbedでstdは使えるけどboostが使えないのでsprintfの使い方を勉強した。 c++のstringとcのchar配列を行ったり来たりするのがめんどい・・ test.cpp #include <iostream> #include <string> #include <stdio.h> using namespace std; int main(int argc, char* argv[]){ string result_st</stdio.h></string></iostream>…

boost::regexで文字列に正規表現がmatchするかどうか判定

C++

regex_matchを評価すればいい regex_match.cpp #include <iostream> #include <boost/regex.hpp> #include <string> using namespace std; using namespace boost; int main(int argc, char* argv[]){ string str = "asdftesthogehoge"; if(regex_match(str, regex(".*t.st.*"))){ cout << "matc</string></boost/regex.hpp></iostream>…

libcurlで画像をHTTP-GET

curlppがうまくいかなかったのでlibcurlの方を使おう 参考:http://ja.doukaku.org/41/nested/result.jpgとしてファイルに保存する curl.hはmacportsでcurlインストールしたら入った?気がする ubuntuでは sudo apt-get install libcurl4-gnutls-devでインス…

ファイルが存在するかどうか

C++

sudo apt-get install libboost-filesystem-dev#include <boost/filesystem.hpp> string fileName = "/home/sho/tmp.txt"; boost::filesystem::path fpath(fileName); if(boost::filesystem::exists(fpath)){ cout << "already exists " << fileName << endl; } Macではlibboost_sy</boost/filesystem.hpp>…

template

C++

なるほどなるほど #include <stdio.h> #include <stdlib.h> #include <string> #include <iostream> using namespace std; template <class T> void foo(int i){ cout << "int:" << i << endl; } void foo(double d){ cout << "double:" << d << endl; } void foo(string s){ cout << "string:" << s << end</class></iostream></string></stdlib.h></stdio.h>…

boost::regex_replaceで置換

C++

"と'の前にバックスラッシュをつけたい。 \\\\と4つ連続で書かないと、置換できなかった。まさか4つとは。 regex_replace.cpp #include <iostream> #include <string> #include <boost/regex.hpp> using namespace std; using namespace boost; int main(int argc, char* argv[]){ string str = </boost/regex.hpp></string></iostream>…

boost::any

C++

boost::anyで何型でも入る変数を作れる。参考 letsboost::any 本の虫: Inside Boost.Any qune: プログラミングメモ - boost::any を読む 内部の実装についても詳しく書かれていて勉強になったが、templateはなんとなくわかるけどそもそもC++でclass設計をし…

boost::tieでtupleを展開

C++

参考:http://www.gesource.jp/weblog/?p=1654前の http://d.hatena.ne.jp/shokai/20091231/1262248887 をboost::tieで受け取ってみた tupletest.cpp #include <iostream> #include <string> #include <boost/tuple/tuple.hpp> using namespace std; using namespace boost; // 多値を返す tuple<int, double, string> test_</int,></boost/tuple/tuple.hpp></string></iostream>…

boost::tupleで多値を受け取る

C++

簡単だった。もっと早く使ってれば良かった。画像処理は座標とかサイズを複数返したい時がよくあるから 関数宣言とmake_tupleの引数の数が違うとコンパイル時にエラーになる。intやdoubleは混ぜるとcastされる。tupletest.cpp #include <iostream> #include <string> #include <boost/tuple/tuple.hpp></boost/tuple/tuple.hpp></string></iostream>…

stringから正規表現でマッチした箇所を抜き出す

C++

最初にソース文字列を入れて、次に正規表現を何度も試せる非常にインタラクティブかつシンプルなコード例regex_split.cpp #include <iostream> #include <boost/regex.hpp> #include <string> using namespace std; using namespace boost; int main(int argc, char* argv[]){ cout << "--input </string></boost/regex.hpp></iostream>…

stringのsplit

C++

boost::algorithm.splitを使う参考:Boost.String Algorithm - Faith and Brave - C++で遊ぼう #include <iostream> #include <vector> #include <string> #include <boost/algorithm/string.hpp> using namespace std; using namespace boost::algorithm; int main() { string s = "a,b.c,as/df"; vector<string> results; </string></boost/algorithm/string.hpp></string></vector></iostream>…

boost::regexのmatch

C++

正規表現 http://freepg.fc2web.com/cpp/topic_boost_regex_001.html regex_match.cpp #include <iostream> #include <boost/regex.hpp> #include <string> using namespace std; using namespace boost; int main(int argc, char* argv[]){ string str = "asdftesthogehoge"; regex reg(".*t.st</string></boost/regex.hpp></iostream>…

スマートポインタのscoped_ptr

スコープ内で宣言してスコープ外に出ると自動破棄されるmain.cpp #include <boost/scoped_ptr.hpp> #include <string> #include <iostream> using namespace std; using namespace boost; int main(int argc, char* argv[]) { scoped_ptr<string> p(new string("scoped ptrを使う")); if(p) cout << *p << end</string></iostream></string></boost/scoped_ptr.hpp>…

PlayStation3 eyeでキャプチャして表示

windowsでプレステ3のカメラを使う場合は準備が必要。macはmacamでいけるはず。 準備:VS2008 OpenCVでPlaystation3 eyeを使う 普通のUSBカメラの場合:単純にキャプチャして表示 - 橋本詳解(このコードと比較するとわかりやすい) プロジェクトごとupした …

単純にキャプチャして表示

これを基本形にしてカスタムする #include <stdio.h> #include <highgui.h> int main(int argc, char** argv) { bool isStop = false; CvCapture *capture; IplImage *image; char winNameCapture[] = "Capture"; capture = cvCreateCameraCapture(0); if(capture == NULL){ prin</highgui.h></stdio.h>…

VS2008 OpenCVでPlaystation3 eyeを使う

プレステ3のカメラをWindowsのC++/OpenCV環境で使う。Macはmacamで動くし、linuxも普通にカメラとして使う事はできるらしいけど windowsはAlexさんの作ったドライバを入れるとDirectShowのソースとして使えるようになる。どうやらFlashからwebcamとしては使…

CvImage/IplImageからSystem::Drawing::Bitmapへの変換

できた なんで^を付けるのかとかそこらへんの作法がわからん System::DrawingのDLLへの参照を追加してから using namespace System::Drawing; グローバル変数を作っておく private: System::Drawing::Bitmap^ shadow; C#側のためのアクセサ public: System::…

cvRunningAvgを使って背景統計を取り背景差分する

背景差分法で背景と物体を分離するコードで、opencv.jp - OpenCV: 背景統計量の累積(Accumulation of Background Statistics)サンプルコード -が大変すばらしかったので自分用に使いやすいようにいじくりまわした。 #include <cv.h> #include <highgui.h> #include <ctype.h> #includ</ctype.h></highgui.h></cv.h>…

赤色領域を検出(4) 輪郭を囲む

OpenCVプログラミングブック p.154に2値画像の輪郭抽出がcvFindContourでできて、cvDrawContours で線で囲えると書いてあったので、ちょうど赤色領域抽出でカメラから2値画像を作っていたのでコードを合体させた。 輪郭抽出前に収縮・膨張でノイズを減らして…

赤色領域を検出(3) 重心も計算

opencvプログラミングブックのp.61肌色領域の重心を検出していたので、同じようにやってみた。この本は説明はわかりやすいけどプログラムが省略されてて肝心の変数宣言の部分や定数define部分が書いてないので大変困る。 まあドキュメント読めば十分わかるか…

収縮・膨張で砂嵐ノイズフィルタ

cvErode()とcvDilate()を使うと砂嵐ノイズを消せる。効果はそれぞれ収縮と膨張で、収縮→膨張とすると小さなゴミは消えるし、膨張→収縮でひびわれは押し潰される。 いや2回やらなくても良い気もしてきた。 これが こうなる こういうas3のColorMatrixFilterみ…

肌色領域検出

参考 http://pw137.cs.ie.u-ryukyu.ac.jp/repos/complex_back/OpenCV_sample/tutorial_03.cpp opencvプログラミングブック p.59 グレースケールで背景差分取っておく(背景差分 - 橋本詳解) BGRをHSVに変換してからHueのみを見て肌色に近い範囲のピクセルの…

aviファイルの読み込み

動画ファイル(aviファイル)の読み込み - OpenCV@Chihara-Lab. こうしておくとカメラの無いマシンでもtest.aviを読み込んでテストできるので便利 CvCapture *capture = NULL; //capture = cvCreateCameraCapture(0); // カメラ読み込み capture = cvCapture…

赤色検出

MacbookのWindowsXPでVMWareで動かしてるUbuntuでも動いた。カメラがQV-40で暗すぎるので認識部分の数値いじってある colortrack.cpp #include <stdio.h> #include <highgui.h> #include <cv.h> IplImage *img = NULL; IplImage *imgR, *imgG, *imgB, *imgThreshold_R, *imgThreshold_G</cv.h></highgui.h></stdio.h>…

赤色領域を検出(2)

前の方法だと光、影、カメラの種類などの環境変化に弱かったので、もっと相対的に赤を検出する。 cvDiv()という2つの画像の全ピクセルの商を一発で求める関数があるので、「赤の要素が青・緑それぞれの1.5倍あり、さらに赤が100以上の値のピクセル」を赤とみ…

赤色領域を検出(1)

前の肌色領域検出で、ようするにOpenCVはproce55ingみたいに泥臭くピクセルを一つずつx,y座標で走査して比較するのではなく、画像(=バイト配列)に対してビット演算する専用の関数群(cvThreshold,cvSplit,cvAnd,cvSub,cvDivなど)があるからそれを使って、…

背景差分

/*** シンプルな背景差分 参考: opencvプログラミングブック p.55 ***/ #include <stdio.h> #include <highgui.h> #include <cv.h> int main(int argc, char** argv) { bool isStop = false; CvCapture *capture = NULL; capture = cvCreateCameraCapture(0); if(capture == NULL){ pri</cv.h></highgui.h></stdio.h>…