今見てくれてる人の数

ホンキートンク・スーダラブルース

ゆるコラム、oF、邦ロックや歌謡曲、小説の感想。ドラクエ、JavaScript、ドラゴンボール超など。湘南あたりを転がってる石コロのゆるゆる生きてく超雑多な軌跡です。

【openFrameworks 冒険記9】ofxOpenCvで色々やってみる!まずはPCカメラのカラー映像グレースケール映像を表示。目指せ笑顔検知。

今回はofxOpenCvを使ってこれを作ります!!!!

パソコンのカメラから取り込んでる映像のスクショです。

 

f:id:sudara_bluse:20171115153444p:plain

 

皆さんは、「コンピューターの目」と称されるライブラリ

OpenCVを知ってますか?

OpenCV(正式名称: Open Source Computer Vision Library)は、オープンソースのコンピューター・ビジョン・ライブラリです。

コンピューターで画像や動画を処理するのに必要な、
さまざま機能が実装されており、
BSDライセンスで配布されていることから学術用途だけでなく商用目的でも利用できます。

加えて、マルチプラットフォーム対応されているため、幅広い場面で利用されていることが特徴です。

 

画像、動画処理、顔や人検知など色々使われています。

デジカメやkinectなどでも使われていることでしょう。snowでも使われてるのかな?

 

ofxOpenCvはoFでOpenCVを使いやすくしたアドオンです!

今回からしばらくこれをいじり倒したいと思います。目指せ笑顔検知!

oFのexampleフォルダのopencvHaarFinderExampleが顔検知のサンプルになっているようです。誤検知もちらほらありますね。

f:id:sudara_bluse:20171115150913p:plain

 

まずハローワールド的に、

先ほどのカラー映像と、グレースケール映像を表示させます。

f:id:sudara_bluse:20171115153444p:plain

 

実装方法

処理内容

ofApp.hで
ofVideoGrabber // カメラ使いますよ宣言
ofxCvColorImage  // カメラから入った1フレーム分のカラー画像 
ofxCvGrayscaleImage // カメラから入った1フレーム分のグレースケールの画像 

インスタンスをそれぞれ定義

 

ofApp.cppで

initGrabberでカメラ映像を取り込み

allocate()で処理するメモリ領域を確保

cam.update()でカメラからの映像更新

一個一個のカメラからのピクセルデータをカラーイメージに格納する
colorImg.setFromPixels(cam.getPixels().getData(), 320, 240);

ofxCvGrayscaleImageにカラーイメージデータを突っ込んで変換
grayImg = colorImg;

drawで描画

 

になります。

 

コードはこちら

ofApp.h
#pragma once

#include "ofMain.h"

/* これ追加 */
#include "ofxOpenCv.h"

class ofApp : public ofBaseApp{

    public:
        void setup();
        void update();
        void draw();

        void keyPressed(int key);
        void keyReleased(int key);
        void mouseMoved(int x, int y );
        void mouseDragged(int x, int y, int button);
        void mousePressed(int x, int y, int button);
        void mouseReleased(int x, int y, int button);
        void mouseEntered(int x, int y);
        void mouseExited(int x, int y);
        void windowResized(int w, int h);
        void dragEvent(ofDragInfo dragInfo);
        void gotMessage(ofMessage msg);

    // カメラ
    ofVideoGrabber cam;

    // カメラから入った1フレーム分のカラー画像
    ofxCvColorImage colorImg;

    // カメラから入った1フレーム分のグレースケールの画像
    ofxCvGrayscaleImage grayImg;

};

 
 
ofApp.cpp
#include "ofApp.h"

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

    // カメラからの取り込み
    cam.initGrabber(320, 240);

    // カラー画像を格納する領域を確保
    colorImg.allocate(320, 240);
    // グレースケール画像を格納する領域
    grayImg.allocate(320, 240);

    /* (allocate 格納の意味) */

}

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

    // カメラの更新
    cam.update();

    // 一個一個のピクセルデータをカラーイメージに格納する
    colorImg.setFromPixels(cam.getPixels().getData(), 320, 240);

    // ofxCvGrayscaleImageにカラーイメージデータを突っ込んで変換
    grayImg = colorImg;



    /*  おまけコーナー */
    //colorImg.blur(10);   これでblurもかけれます
    /*
     colorImg.mirror(false, true); これで画像反転できます。
     void ofImage_::mirror(bool vertical, bool horizontal) 関数の仕組み
    */


}

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

    colorImg.draw(0,0, 320, 240);
    grayImg.draw(330,0, 320, 240);

}


 

次は差分と境界線か...
航海は続く!!