キー | 画像 | 意味 | 特徴 |
---|---|---|---|
1 | 1カメラ.gif | カメラに写った動画 | |
2 | 2エッジ.gif | カメラ画像にエッジ抽出を行った動画 | ものの輪郭が白い線で表示される |
3 | 3色相変化.gif | フレームに応じて変化する値をもとの色相に加えた動画 | 動画1ループで赤→緑→青→…の変化を3回繰り返す |
String[] cams = Capture.list()
Capture cam = new Capture(this, 横解像度, 縦解像度, 使用するデバイス名); cam.start();
cam.read();
image(cam, 0, 0, width, height);
gifMaker = new GifMaker(this, 保存先のパス);
gifMaker.setRepeat(0); gifMaker.setDelay(フレーム間の時間);
gifMaker.addFrame(画像変数);
gifMaker.finish();
gif = new Gif(this, ファイルのパス); gif.loop();
image(gif, 0, 0, width, height);
import processing.video.*; import gifAnimation.*; String[] fName = {"1カメラ", "2エッジ", "3色相変化"}; GifMaker gifMaker; Gif gif; Capture cam; int count = 0; int selected = -1; int gLength = 60; // 1つの動画のフレーム数 // X方向、Y方向のソーベルフィルタのマスクをまとめた2重配列 int[][] mask = {{-1, 0, 1, -2, 0, 2, -1, 0, 1}, {-1, -2, -1, 0, 0, 0, 1, 2, 1}}; void setup() { size(800, 600); textFont(createFont("MS Pゴシック", 48)); String[] cams = Capture.list(); // 使えるWebカメラのリストを表示 for (int i=0; i<cams.length; i++) { println(i+":" + cams[i]); } cam = new Capture(this, width, height, cams[0]); cam.start(); } void draw() { if (cam.available() && count < gLength*3) { cam.read(); // カメラの画像の読み込み int k = count/gLength; // 対応する出力画像の番号 // それぞれの動画の最初のフレームのときの例外処理(保存開始) if (count % gLength == 0) { } background(0); // 各フレームでエッジ抽出を行う(課題2) if (k==1) { } // 各フレームで色相を変える(課題3) if (k==2) { } image(cam, 0, 0, width, height); // camの画像を画面に表示する // 作成中のgif画像にcamをフレームとして追加する // それぞれの動画の最後のフレームでの例外処理(保存終了) if (count % gLength == gLength-1) { println(k+"完了"); } count++; fill(255, 0, 0); text(fName[k] + ":" + count%gLength, 30, height-30); fill(255); } if (selected >= 0) { background(0); image(gif, 0, 0, width, height); fill(255, 0, 0); text(fName[selected], 30, height-30); fill(255); } } void keyPressed() { int k = key-'0'; if (k>=1 && k<=3) { selected = k-1; gif = new Gif(this, "data/" + fName[k-1] + ".gif"); gif.loop(); } }
// それぞれの動画の最初のフレームのときの例外処理(保存開始) if (count % gLength == 0) {
gifMaker = new GifMaker(this, "data/" + fName[k] + ".gif"); gifMaker.setRepeat(0); gifMaker.setDelay(60);
gifMaker.addFrame(cam);
// それぞれの動画の最後のフレームでの例外処理(保存終了) if (count % gLength == 0) {
gifMaker.finish();
PImage img = createImage(width, height, ARGB); // 画面と同じサイズの黒画像 // 端以外のピクセルについての繰り返し for (int j=1; j<height-1; j++) { for (int i=1; i<width-1; i++) { float[] e = new float[2]; // 「マスク」×「ピクセル明度」の足し上げ用変数 for (int m=0; m<2; m++) { // マスクのタイプについての繰り返し for (int l=0; l<9; l++) { // マスク内の位置についての繰り返し int x = l%3-1; // マスク内横位置 int y = l/3-1; // マスク内縦位置 // カメラ画像の(i+x, j+y)のピクセルの明度を float br に入れる // brとm番目のマスクのl番目の位置の値をかけたものをe[m]に加える } } // imgの(i, j)のピクセルにe[0]とe[1]を2乗して加え、平方根をとった値の明度をもつ色を設定する } } cam.pixels = img.pixels;
// 色設定モードをHSBにする for (int j=0; j<height; j++) { for (int i=0; i<width; i++) { color c = cam.pixels[i+j*width]; float H = hue(c); float S = saturation(c); float B = brightness(c); // float a に色相の変化値を入れる (動画1周で色立体を3周するように) // Hをaだけ増やし、0~360の範囲に収まるように調整する cam.pixels[i+j*width] = color(H, S, B); } } // 色設定モードをRGBに戻す