ライブラリとは、Processingに機能を追加するもので、開発環境によっては機能拡張(Extension)、アドオン(add-on)などと呼ばれることもあります。
Processing公式サイトにライブラリのリストがあるので、興味があるライブラリがあったら、インストールして使ってみましょう。
https://processing.org/reference/libraries/
「4.4 画像処理」からの続きになりますが、この節では画像処理やコンピュータビジョンのライブラリである、OpenCV for Processingを利用してみます。
まずは、Processingのインタフェースからライブラリをインストールします。
Sketchメニュー > Import Library… > Add Library…を選択すると次の画面が表示されます。
OpenCVで検索し、「OpenCV for Processing」ライブラリを選択してインストールしましょう。
問題なくライブラリがインストールされたら、サンプルも同時にインストールされています。Fileメニュー > Examples…を選んでExampleのリストを表示しす。
Contributed Libraries > OpenCV for Processingの中に色々なサンプルがあります。
PCにカメラが付いていない場合にはwebカメラなどを使ってください。
まずは、カメラ映像を表示します【リスト4.5-a】。
次のサンプルを実行しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import gab.opencv.*; //ライブラリをインポート import processing.video.*; import java.awt.*; Capture video; OpenCV opencv; void setup() { size(640, 480); video = new Capture(this, 640, 480); opencv = new OpenCV(this, 640, 480); video.start(); //キャプチャを開始 } void draw() { opencv.loadImage(video); //ビデオ画像をメモリに展開 image(video, 0, 0 ); //表示 } void captureEvent(Capture c) { c.read(); } |
明るさとコントラストのコントロールは次のサンプルになります。
明るさは、-225〜225の間で変化します。
また、コントラストは0.0から始まりますが、100.0以上はほとんど変化がありません。
次のサンプルではコントラストの調節部分がコメントアウトされているので、コントラスを確認したい場合はそちらを有効にしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import gab.opencv.*; //ライブラリをインポート import processing.video.*; import java.awt.*; Capture video; OpenCV opencv; void setup() { size(640, 480); video = new Capture(this, 640, 480); opencv = new OpenCV(this, 640, 480); video.start(); //キャプチャを開始 } void draw() { opencv.loadImage(video); //ビデオ画像をメモリに展開 //明るさの調節。-255〜255。 opencv.brightness(int(map(mouseX, 0, width, -255, 255))); //コントラストの調節。0.0から始まるが //100以上になるとほとんど変わらない。 //opencv.contrast(map(mouseX, 0, width, 0.0, 20.0)); image(opencv.getOutput(), 0, 0 ); //表示 } void captureEvent(Capture c) { c.read(); } |
コンピュータビジョンではよく見るタイプのエフェクトです。モノクロでのみ再生可能です。サンプルではCannyフィルタ、Scharrフィルタ、Sobelフィルタを再生できるようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import gab.opencv.*; //ライブラリをインポート import processing.video.*; import java.awt.*; Capture video; OpenCV opencv; PImage canny, scharr, sobel; void setup() { size(640, 480); video = new Capture(this, 640, 480); opencv = new OpenCV(this, 640, 480); video.start(); //キャプチャを開始 } void draw() { opencv.loadImage(video); //ビデオ画像をメモリに展開 //cannyエッジフィルターを使用 //findCannyEdges(int low, int hgih) //high以上のエッジ強度はエッジにする。low以下はエッジにしない opencv.findCannyEdges(50, 200); canny = opencv.getSnapshot(); image(canny, 0, 0 ); //表示 //Scharrフィルターを使用 /* opencv.findScharrEdges(OpenCV.HORIZONTAL); scharr = opencv.getSnapshot(); image(scharr, 0, 0 ); //表示 */ //sobelフィルターを使用 //findSobelEdges(int dx, int dy)は、x, y方向へのずれ。 //それぞれ0~2の値をとるが、(0, 0)だとエラーになる。 /* opencv.findSobelEdges(1, 0); sobel = opencv.getSnapshot(); image(sobel, 0, 0 ); //表示 */ } void captureEvent(Capture c) { c.read(); } |
白黒2色にする場合と、ぼかす場合です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import gab.opencv.*; //ライブラリをインポート import processing.video.*; import java.awt.*; Capture video; OpenCV opencv; PImage img, thresh, blur, adaptive; void setup() { size(640, 480); video = new Capture(this, 640, 480); opencv = new OpenCV(this, 640, 480); video.start(); //キャプチャを開始 } void draw() { opencv.loadImage(video); //ビデオ画像をメモリに展開 //二値化。0〜255の間で、白黒に分割。 opencv.threshold(50); thresh = opencv.getSnapshot(); image(thresh, 0, 0 ); //表示 //ぼかし。値を増やすとボケ具合が強くなる。 /* opencv.blur(12); blur = opencv.getSnapshot(); image(blur, 0, 0 ); //表示 */ } void captureEvent(Capture c) { c.read(); } |
顔を検出するプログラムです。このほか、顔の検出以外にも目、耳、鼻、口なども検出できます。
使用できる関数が以下のサイトに記載されています。
http://atduskgreg.github.io/opencv-processing/reference/gab/opencv/OpenCV.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import gab.opencv.*; import processing.video.*; import java.awt.*; Capture video; OpenCV opencv; void setup() { size(640, 480); //キャプチャは320x240にする video = new Capture(this, width/2, height/2); opencv = new OpenCV(this, width/2, height/2); //顔用のデータをロード opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); //目のデータをロード //opencv.loadCascade(OpenCV.CASCADE_EYE); //口のデータをロード //opencv.loadCascade(OpenCV.CASCADE_MOUTH); video.start(); //キャプチャを開始 } void draw() { scale(2); //画像を2倍に拡大 opencv.loadImage(video); //ビデオ画像をメモリに展開 image(video, 0, 0 ); //表示 //顔の領域を検出 noFill(); stroke(0, 255, 0); strokeWeight(3); Rectangle[] faces = opencv.detect(); println(faces.length); //顔が複数あった場合には、全て検出 for (int i = 0; i < faces.length; i++) { println(faces[i].x + "," + faces[i].y); rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height); } } void captureEvent(Capture c) { c.read(); } |
Sorry, comments are closed.