今見てくれてる人の数

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

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

【openFrameworks】oFのアドオンでしかOpenCV系をいじってない人がピュアOpenCVの覗き見る

まずはじめに感想。

これやってみて、oFって本当に便利で敷居下げてるんだなぁ

思いました。偉大。大人しくなるべくoFのアドオンでやろうと思いました。

------------------------------------------------------------------

 

ofxOpenCv、ofxCvをいじっていて思うことは、

やはりピュアなOpenCVを理解していないと

数歩踏み込んだ処理ができないということです。

サンプルで見かけた

cv::Mat faceMat(mat, ofxCv::toCv(roi)); とか

 

なのでピュアなOpenCVをこちらのサイトを見ながら学ぼうと思います。

www.buildinsider.net

しかし、環境構築がwindows、しかもかなり面倒くさい

大変そうなので、oFのプロジェクトにofxOpenCv、ofxCvを読み込んでやろうと思います。

いいのかなこれで...。

まずは上記記事のハローワールドです。

ofApp.h
#include "ofMain.h"
#include "ofApp.h"

#include "ofxOpenCv.h"
#include "ofxCv.h"

// 本家ではこの3つを読み込んでいる // #include <opencv2/core.hpp> // coreモジュールのヘッダーをインクルード // #include <opencv2/highgui.hpp> // highguiモジュールのヘッダーをインクルード // #include <iostream> int main(){ // 1幅320px、高さ240pxで赤色の画像データを生成 cv::Mat redImg(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 255)); // 2画像表示用のウィンドウを生成 cv::namedWindow("red", cv::WINDOW_AUTOSIZE); // 3ウィンドウに画像を表示 cv::imshow("red", redImg); // 4キー入力を待機 cv::waitKey(0); // 5作成したウィンドウを全て破棄 cv::destroyAllWindows(); return 0; }

 

真っ赤なウインドウが出て、0のkeyを押すと閉じます。 

 

 f:id:sudara_bluse:20171211120008g:plain

 

読み解きます。

Matクラス
penCVでは画像データを格納するデータ構造としてMatクラスを提供しています。
多くの関数の入出力は、Matクラスを介して行われます。

インスタンス生成
cv::Mat img(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 255));
(画像の幅320px、高さ240px、赤色の画像データ生成)

 

CV_8UC3とは...ビット深度=符号なしの8bit整数、チャンネル数=3

↑謎。


cv::Scalar(0, 0, 255) 画像の色。この例では赤色(B=0、G=0、R=255)

BGR の順番なのがミソですね。

 

Matクラスの幅と高さ取得。

// 画像の幅を表示する
std::cout << "width: " << img.cols << std::endl;
// 画像の高さを表示する
std::cout << "height: " << img.rows << std::endl;
「コンソール」
width: 320
height: 240
 
 

チャンネル数を取得。

チャンネル数ってなに?

グレースケール画像の場合は「1」、
カラー画像の場合は「
3」、
アルファチャンネル付きのカラー画像の場合は「
4
が返ってきます。

img.channels();

今回はカラー画像なので、3が返ってきます。

ピクセルへのアクセス。

特定の位置の色を取得。

atメソッドを使用。

img.at<cv::vec3b>(y, x);

でアクセスするのですが、ここに注目!

(y, x)

x,yと逆なんですね...色々と複雑だなぁ。。

色を取得するサンプル。

 

ofApp.h
#include "ofMain.h"
#include "ofApp.h"

#include "ofxOpenCv.h"
#include "ofxCv.h"

// #include <opencv2/core.hpp>
// #include <iostream>


//========================================================================
int main( ){

    // 幅320px、高さ240px、3チャンネル(カラー画像)のインスタンスを生成する
    cv::Mat img(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 255));

    // (1)座標(0, 100)のピクセルを取得する  at(y, x)の順に渡す。ややこしい。。
    cv::Vec3b pixcel = img.at<cv::Vec3b>(100, 0);
    uchar blue  = pixcel.val[0]; // B
    uchar green = pixcel.val[1]; // G
    uchar red   = pixcel.val[2]; // R

    /* uchar型 */
    // uchar は char と違って正の値のみを含むことが出来ます。 最小値は 0 で最大値は 255 これ使うらしい 。。

    // (2)座標(0, 100)の色を表示する
    cout << "R: " << (int)red   << endl;
    cout << "G: " << (int)green << endl;
    cout << "B: " << (int)blue  << endl;

    return 0;
}

 

 

また、atメソッドを以下のように呼び出すと色の変更もできるそうです。
img.at<cv::vec3b>(y, x)[0] = blueValue;
img.at<cv::vec3b>(y, x)[1] = greenValue;
img.at<cv::vec3b>(y, x)[2] = redValue;
 

 画像、動画の入出力、はこちらに載ってました。

ww.buildinsider.net

 

私は大人しく、できる範囲はoFでやろうと思いました。

 

完。

 

f:id:sudara_bluse:20171108184844p:plain