RaspberryPi openFrameworksでBoost Libraryを使う

#include <boost/algorithm/string.hpp>
using namespace boost;

int main() {

string str("192.168.0.1 192.168.0.2");
list<string> list_string;

split(list_string,str,is_space());

for(auto list : list_string){
ofLog() << list;
}

}

#includeでヘッダ読み込むだけで使えました。functionなど一部std名前空間と名前がかぶっているようなので注意する。

ofPath::getOutline() and ofPolyline::getBoundingBox() でofRectが返って来ない問題 #openFrameworks

capture

ofPath::getBoundingBox();

ofxSvgの各パスをgetBoundingBox()でゲットしようとしたのが、値が返って来ない問題がありました。この問題の解決策としては、アウトラインを取るのに線の太さが設定し、またofPathのWindingModeも適したものを選択しておく必要があります。

サンプルコード


ofPath path; //パスを追加してください。
path.setStrokeWidth(1.0); //太さがないとアウトラインは取れない
path.setPolyWindingMode(OF_POLY_WINDING_ODD); //適した
auto polyLine = path.getOutline()[0]; //とりあえず0番目のアウトライン
auto rect = polyLine.getBoudingBox();

参考

Get ofPath bounding box

ofImage画像をofPath描画でマスクする #openFrameworks

ofImageへのマスク処理

alpha

0.9.0~ できるようになったというofImageへのマスク処理 setAlphaMask (参考:画像を形を指定してマスクする)を試してみました。

サンプルコード


ofPath path;
ofImage img;
ofFbo fbo;

void ofApp::setup(){

ofHideCursor();

//set path
for(auto i = 0 ; i < 100 ; i++){
ofSetColor(255);
const auto pos = ofPoint(ofRandom(float(ofGetWidth())),float(ofRandom(ofGetHeight())));
path.lineTo(pos);
}

//set fbo
fbo.allocate(ofGetWidth(),ofGetHeight(),GL_RGBA /*GL_LUMINANCE*/);
fbo.begin();
path.draw();
fbo.end();

//set img
//dataフォルダに好きな画像を入れてください。
if(!img.load("mirrorboy.jpg")){
ofLog() << "image is not loaded." ;
};

img.setAnchorPercent(0.5,0.5);
img.getTexture().setAlphaMask(fbo.getTexture());
}

void ofApp::draw(){

 ofBackgroundGradient(ofColor::yellow,ofColor::gray);

 ofSetColor(255);
 img.draw(ofGetWidth()/2,ofGetHeight()/2);

}

ofxCvHaarFinderとofBeginShape()を一緒に使ったら顔認識されなくなった #openFrameworks

cvgraphics

ofxCvHaarFinder × ofBeginShape()

Raspberry PI の openFrameworks で ofxCvHaarFinderのfindHaarObjects()とofBeginShape() / ofEndShape()を使ったコードを書いていたら、何故か顔認識動かない。ofBeginShape() ~ ofEndShape()をコメントアウトすると認識される。

とりあえず解決案 – ofPushStyle() ~ ofPopStyle();


ofPushStyle(); //追加

ofBeginShape();

ofVertexes(); //描画

ofEndShape();

ofPopStyle(); //追加

ofBeginShape() ~ ofEndShape()するときに内部で描画設定を変えられてるからかな〜と推測して、前後にofPopStyle()とofPushStyle()で囲んだら顔認識動いた。

openFrameworks & Raspberry PI 2 & ArchLinux (Rasbianでも使える) 設定メモ

Raspi

対応OSがいつの間にか変わった(Armv7で使いたい場合)

Raspberry Pi版 openFrameworksの推奨OS(?)が、0.9.2以降はArchLinuxになっていた openFrameworks http://openframeworks.cc/ja/setup/raspberrypi/raspberry-pi-getting-started-archlinux/ ラズパイ版のoFは毎度の事ですが、すんなりインストールできない。設定で困った所をメモっておきます。

※armv7 → ArchLinux , armv6 → Rasbian という事みたいです。なのでRaspi2でもarmv6で動かすならRasbianのままでOK。

ArchLinuxをMacで用意

oFサイトの方法はLinuxで用意する方法ですね。oFを使ってる方は、MacやWin使いが多いのかなと思うのでちょっと不親切。

oF公式のGetting Startに補足

  • ファイルの解凍のステップを飛ばしてる → tar zxvf filename
  • 日本語キーボードの選択 → loadkeys jp106
  • piユーザーを作ったけどログインしなおすステップが抜けてる → Preliminary work以降は、piユーザー
  • コンパイル中に言語設定で怒られる → .bash_profileに”export LANG=C”記入

パーティションの容量を増やす

openFramworks本体をコンパイルしてると”virtual memory exhausted”なんてエラーが出て止まります。原因は、パーティションが2GBになっていたから。こちらを参考に32GBまで増やしました。

スワップファイルを作成

“virtual memory exhausted: Cannot allocate memory”

OpenCVのサンプルプロジェクトをコンパイルしてるとメモリ足りない的な事を言われるので、Wikiを参考にSwapファイルつくりました。で、コンパイルできたと思ったら実行できなかった。

.profile に追記

MAKEFLAGS=-j4 PLATFORM_VARIANT=rpi2

ラズパイカメラ

RaspiCamera

初期設定

https://wiki.archlinuxjp.org/index.php/Raspberry_Pi

ofxRPiCameraVideoGrabber

https://github.com/jvcleave/ofxRPiCameraVideoGrabber

PlayStation Eyetoy

opencvExampleで使おうとすると、カメラから映像が取得できないので vidGrabber.setDesiredFrameRate(60); を指定すると使えるようになる。

コンパイルめっちゃ遅い

コンソールに出てくる文字列すら遅すぎて謎だなと思ったら、rasps-config で出来るGPUのメモリ指定を間違えて0MBに間違えてしてた。

openFrameworks 基本描画 メモ

//背景
ofBackground(color);

//スムース
ofEnableSmoothing();
ofDisableSmoothing();

//円の解像度
ofSetCircleResolution(resolution);

//図形を色で埋める
ofFill();

//色の指定
ofSetHexColor(0xb5de10);

//Text
ofDrawBitmapString("str",x,y);

//ポリゴンモードの指定
ofSetPolyMode(OF_POLY_WINDING_ODD);

//アルファブレンド用の設定
ofEnableAlphaBlending();
ofDisableAlphaBlending();

//線幅
ofSetLineWidth(size);

//描画
ofBeginShape();
//ここに以下の頂点系の処理を書く
ofEndShape(bool bClose=false);

//頂点
ofVertex(x,y);

//Curve用の頂点(指定した頂点を通るようにカーブを作成可能)
ofCurveVertex(x,y);

//Circle
ofDrawCircle(x,y,r /*円のサイズ*/);
ofDrawEllipse(x,y,w,h);

//Hole
ofNextContour(true);

//中心位置変更
ofPushMatrix();
ofTranslate(x,y);
ofPopMatrix();

//Scale変更
ofScale(x,y);

Raspberry Pi 2 & openFrameworks でI2C接続のジャイロセンサー(InvenSense ITG-3200)を使う

Raspberry Pi2 & openFrameworksでI2C接続のジャイロセンサーを使ってみた


InvenSense ITG-3200のブレイクアウトボードをSwitchScienceで購入し、セッティングやコードは、こちらのページを参考にしました。Raspberry PiにおけるwiringPiとI2C自体のセッティングは、ググると色々あるのでopenFrameworksの部分のみ。wiringPiI2CSetupを使ったらとにかく楽でした。

openFrameworksのコード


#include "ofApp.h"
#include "wiringPiI2C.h"

using namespace std;

const auto itgAddress = 0x69;

const char WHO_AM_I = 0x00;
const char SMPLRT_DIV= 0x15;
const char DLPF_FS = 0x16;
const char GYRO_XOUT_H = 0x1D;
const char GYRO_XOUT_L = 0x1E;
const char GYRO_YOUT_H = 0x1F;
const char GYRO_YOUT_L = 0x20;
const char GYRO_ZOUT_H = 0x21;
const char GYRO_ZOUT_L = 0x22;

const char DLPF_CFG_0 = 1<<0;
const char DLPF_CFG_1 = 1<<1;
const char DLPF_CFG_2 = 1<<2;
const char DLPF_FS_SEL_0 = 1<<3;
const char DLPF_FS_SEL_1 = 1<<4;

auto fd = -1;

//--------------------------------------------------------------
void ofApp::setup(){

        //I2C Setting
        fd = wiringPiI2CSetup(itgAddress);
        cout << "fd:" << fd  << "\n";
        cout << "WHO_AM_I:" << wiringPiI2CReadReg16(fd,WHO_AM_I) << "\n";       
        cout << "Write DLPF_FS:" << wiringPiI2CWriteReg8(fd,DLPF_FS,(DLPF_FS_SEL_0|DLPF_FS_SEL_1|DLPF_CFG_0)) << "\n";
        cout << "Write SMPLRT_DIV:" << wiringPiI2CWriteReg8(fd,SMPLRT_DIV,9) << "\n";

        ofSetFullscreen(true);  
}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){

        ofPushMatrix();

        ofTranslate(0,ofGetHeight()/2);

        ofBackground(0);

        function getValue = [](char H,char L){

                int data = 0;
                data = static_cast(wiringPiI2CReadReg8(fd,H)) << 8;
                data += static_cast(wiringPiI2CReadReg8(fd,L));

                return data;
        };

        ofSetColor(255);

        const auto MAX_DATA = 10000;

        auto x = getValue(GYRO_XOUT_H,GYRO_XOUT_L);
        ofRect(0,0,ofGetWidth()/3.,ofMap(x,-MAX_DATA,MAX_DATA,ofGetHeight()/2.,-ofGetHeight()/2.));

        ofTranslate(ofGetWidth()/3,0);
        auto y = getValue(GYRO_YOUT_H,GYRO_YOUT_L);
        ofRect(0,0,ofGetWidth()/3,ofMap(y,-MAX_DATA,MAX_DATA,ofGetHeight()/2,-ofGetHeight()/2));

        ofTranslate(ofGetWidth()/3,0);
        auto z = getValue(GYRO_ZOUT_H,GYRO_ZOUT_L);
        ofRect(0,0,ofGetWidth()/3,ofMap(z,-MAX_DATA,MAX_DATA,ofGetHeight()/2,-ofGetHeight()/2));

        ofPopMatrix();
}

Raspberry Pi用のopenFrameworksがNightly Buildでしか動かせなかった。けれど、openFrameworks0.9.0からC++11になってたのでfunctionやラムダ式を使ってみました。

Raspberry Pi2 & openFrameworks TIPS

ofxRPiCameraVideoGrabber

Sampleをmakeすると

could not convert ‘ofGLProgrammableRenderer::TYPE’ from ‘const string {aka const std::basic_string<char>}’ to ‘std::shared_ptr<ofBaseRenderer>’ ofSetCurrentRenderer(ofGLProgrammableRenderer::TYPE);

とでる。

こちらを参考にmain.cppを以下に変更

int main{

ofGLESWindowSettings settings;

settings.width = 1280;

settings.height = 720;

settings.setGLESVersion(2);

ofCreateWindow(settings);

ofRunApp( new testApp());

}

でmake成功した

makeオプション指定を楽にする

makeする時にいちいち、オプション指定するのが面倒くさいので

cd
ls -a

で表示される

.profile

nano .profile

してnanoでオープンして

export MAKEFLAGS=-j4 PLATFORM_VARIANT=rpi2

と書き込むと

openFrameworksのExampleフォルダ等で

make

するだけで、コンパイルが走る!

GPIOの番号を表示

gpio readall

openFrameworksからgpioを使う場合は、wiringPiを使うようです。GPIOの番号は、Raspberry PiとwiringPiで割当が違うようで番号を調べてる中で、上記のコマンドを見つけました。

接続されているI2Cデバイスを探す

i2cdetect -y 1

addonの追加

addonフォルダにて

git clone 使いたいofxAddonのリポジトリURL

プロジェクトフォルダのaddons.makeにAddon名を記入

ofxAddon

debug

Program received signal SIGILL, Illegal instruction と出て起動時に止まってしまう問題。gdbで以下のコマンドを打つと取り敢えず回避できる。

handle SIGILL nostop
handle SIGINT nonstop