import gohai.glvideo.*; //カメラを使うのに必要 //<>// import gab.opencv.*; //画像処理に必要 import java.awt.Rectangle; GLCapture video; //カメラ変数 OpenCV opencv; //画像処理に必要な変数 Rectangle[] faces; //認識された顔を格納する変数 //顔認識をするかどうか //boolean useFaceDetect = true; boolean useFaceDetect = false; //顔認識した画像をモザイク処理するかどうか boolean isMosaic = true; //boolean isMosaic = false; void setup() { //1920x1080 //int imWidth = 1920; int imHeight = 1080; //1280x720 //int imWidth = 1280; int imHeight = 720; //640x480 int imWidth = 640; int imHeight = 480; //窓のサイズを指定 size(640, 480, P2D); //カメラを使用する準備 ここから String devices[] = GLCapture.list(); printArray(devices); video = new GLCapture(this, devices[0], imWidth, imHeight); video.play(); //カメラを使用する準備 ここまで //画像処理用変数を初期化 opencv = new OpenCV(this, 640, 480); //画像処理する画像をカラーにする指定 //この命令を実行しないとグレーになる opencv.useColor(); //顔認識のデータベースを読み込み opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); } void draw() { //カメラが有効かどうか if (video.available()) { //cameraの画像を読み込み video.read(); //取得した画像を画像処理用にセット PImage img = video.copy(); img.resize(640, 480); opencv.loadImage(img); //===================================== //image processing functions //===================================== //opencv.brightness(100);//0~255 //opencv.contrast(2);//0.0~5? //opencv.threshold(100);//0-255 //opencv.blur(5); //opencv.flip(1);//-1(H),0(V),1(H&V); //opencv.erode(); //opencv.erode();opencv.erode();opencv.erode();opencv.erode();opencv.erode();opencv.erode();opencv.erode(); //opencv.dilate(); //opencv.dilate();opencv.dilate();opencv.dilate();opencv.dilate();opencv.dilate();opencv.dilate();opencv.dilate();opencv.dilate(); //for only gray images //opencv.findSobelEdges(1,0); //opencv.findCannyEdges(30,50);//lowandhigh0~255 //opencv.equalizeHistogram(); //画像処理した結果を出力 image(opencv.getOutput(), 0, 0); //ネガポジ反転 //filter(INVERT); //ポスタリゼーション //filter(POSTERIZE, 4); //顔認識 if (useFaceDetect) { //顔認識する faces = opencv.detect(); if (isMosaic) { noStroke(); //顔が認識された範囲をモザイクする処理 for (int i = 0; i < faces.length; i++) { mosaicRect(faces[i]); } } else { //顔を囲う線の設定 noFill(); stroke(0, 255, 0); strokeWeight(3); //顔が認識された範囲を矩形で囲う処理 for (int i = 0; i < faces.length; i++) { rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height); } } } } } void mosaicRect(Rectangle rect) { int mosaicWidth = 15; int mosaicHeight = 15; loadPixels(); for (int j = rect.y; j < rect.y + rect.height; j+=mosaicHeight) { for (int i = rect.x; i < rect.x + rect.width; i+=mosaicWidth) { color c = pixels[j * width + i]; fill(c); rect(i, j, mosaicWidth, mosaicHeight); } } }