質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Ruby

    7650questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

prosessingについて

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 286

YuriFukushi

score 2

下記、processingからダウンロードし、テンプレートを用いました。
カメラを作動させ、標的にマークはついたのですが、更に標的のものが動いた際に後を線で辿りたいのですがどのような関数を使えばよいのでしょうか?
お答えいただけると幸いです。

import processing.video.*;

Capture video;

void setup() {
size(640, 480);
// Uses the default video input, see the reference if this causes an error
video = new Capture(this, width, height);
video.start();  
noStroke();
smooth();
}

void draw() {
if (video.available()) {
video.read();
image(video, 0, 0, width, height); // Draw the webcam video onto the screen
int brightestX = 0; // X-coordinate of the brightest video pixel
int brightestY = 0; // Y-coordinate of the brightest video pixel
float brightestValue = 0; // Brightness of the brightest video pixel
// Search for the brightest pixel: For each row of pixels in the video image and
// for each pixel in the yth row, compute each pixel's index in the video
video.loadPixels();
int index = 0;
for (int y = 0; y < video.height; y++) {
for (int x = 0; x < video.width; x++) {
// Get the color stored in the pixel
int pixelValue = video.pixels[index];
// Determine the brightness of the pixel
float pixelBrightness = brightness(pixelValue);
// If that value is brighter than any previous, then store the
// brightness of that pixel, as well as its (x,y) location
if (pixelBrightness > brightestValue) {
brightestValue = pixelBrightness;
brightestY = y;
brightestX = x;
}
index++;
}
}
// Draw a large, yellow circle at the brightest pixel
fill(255, 204, 0, 128);
ellipse(brightestX, brightestY, 200, 200);
}
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

あ・・・しまったRubyをお使いなのですね・・・
自分の回答はJavaを想定したものでした。失礼しました。
コード例は役立たないかも知れませんが、考え方のみ参考にしてみていただければと思います。


標的のものが動いた際に後を線で辿りたいのですがどのような関数を使えばよいのでしょうか? 

そのようなことを自動的に行ってくれる関数はprocessingの標準機能には用意されていないと思います。よって実現にはちょっとした論理を考える必要があります。

processingではdraw関数はシステムが自動的にある間隔で繰り返し呼び出してくれますが、ご質問のことをやるには最大輝度のピクセル位置をdrawの度に覚えておき、最近覚えたN個の位置を連続して直線で描画するといった方法が考えられます。覚えておく場所はdrawやsetupの中の変数ではなく(なぜならそれはローカル変数なので関数が終了するとともに消えてしまう)、それらメソッドの外側の変数としておかなければならない点に注意してください。

最大輝度ピクセルの位置をN個覚えておくにはいくつかの方法が考えられますが、他のプログラムでも再利用できるように「クラス」としてまとめると以下のような実装方法があります。setup/drawの内容はこのクラスを使って直線で結ぶ箇所以外は省略しています。

import java.awt.Point;
import java.util.ArrayDeque;
import java.util.Iterator;

// 最近覚えたN個の点を結ぶ直線を描画するためのクラス
class DynamicLines {
  ArrayDeque q = new ArrayDeque();

  // コンストラクター(いくつの点を覚えるかを引数に指定)  
  DynamicLines(int n) {
    for (int i = 0; i < n; i++) {
      q.addFirst(new Point(0, 0));
    }
  }

  // 新たな座標を覚えさせ、最も古い点を忘れる 
  void add(int x, int y) {
    q.addFirst(new Point(x, y));
    q.removeLast();
  }

  // 現在覚えている座標を結んだ折れ線を描画する
  void drawLines() {
    Point pre = null;
    Iterator<Point> itr = q.iterator();
    while (itr.hasNext()) {
      Point cur = itr.next();
      if (pre != null) {
        line(pre.x, pre.y, cur.x, cur.y);
      }
      pre = cur;
    }
  }
}

// 5点までの座標を覚えるための変数を宣言
DynamicLines dl = new DynamicLines(5);

void setup() {
  ...省略
}

void draw() {
  ...省略
  stroke(0); // 黒で直線を描画すると仮定
  dl.add(brightestX, brightestY); // 新たな座標を覚える
  dl.drawLines(); // これまでに覚えた5点を直線で結ぶ
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/02 16:08

    ご回答ありがとうございます!
    Processingでは難しいのですね...
    関数の使い方はなんとなくですが、把握したと思うので早速試してみようかと思います。
    Wed上では関数だけ載っていて説明がなかったりするので、とても助かります><!

    ちなみに、上記で古い点は消えてしまうと書かれてありましたが、パソコン上にはデータは残るものなのでしょうか?
    というのも、movieを撮り終えた後に、excelにデータを移して解析したいと思っております。
    又、撮影では8分間連続で撮り続けたいと思っておりますが、可能でしょうか?
    度々の質問になってしまいますが、ご回答頂けると助かります。

    キャンセル

  • 2017/04/02 17:00 編集

    > パソコン上にはデータは残るものなのでしょうか?

    これは自分のサンプルコードにあるコメント「新たな座標を覚えさせ、最も古い点を忘れる」のことですね?上のコードでは古い点をわざと忘れさせていますのでデータはどこにも残りません。残したい場合は残すようなコードを書く必要があります。Processingのリファレンスには非常に少数の機能しか書かれていませんが、実際にはRubyあるいはJavaなどの言語の全ての機能を使えると考えていいです。よってそれらの言語について勉強すればRuby/Javaでできることならなんでもできると考えていいです。PCのファイルとしてデータを残すこと・・・こうしたことは例えばJavaであればjava.io.Fileやjava.io.OutputStreamなどのクラスの使い方がわかれば可能です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    processing 描画について

    processingでこれを描こうと思い size(600,600); background(0); strokeWeight(10); int p ; int a 

  • 受付中

    processingで特定の点の軌跡を残したい

    processing で、 円Aの周上を動径の回転に沿って移動する点を中心とする円Bを描き、 円Bの周上を動径の回転に沿って移動する点を中心とする円Cを描き、

  • 受付中

    unexpected token : voidとエラーする解決法

    processingでこのようなコードを打ち込んだのですが、 エラーが出ます。 どこが悪いのか教えてください。 ちなみにエラーはunexpected token : voidとでま

  • 解決済

    円柱の曲面に文字や図形を表示したい。

    いつもお世話になっています。  前提・実現したいこと 表題通りです。 円柱の曲面に文字や図形を表示したいです。 テクスチャマッピングなるもので要件を満足する方法があるのです

  • 解決済

    表示に穴を開けるには。

     前提・実現したいこと 以下の図の赤丸のようにスケールバーの指定の場所をくり抜いて奥の表示を出現させるテクニック、あるいは目的の描写を周囲に被らせないように行うトリミングのテクニッ

  • 解決済

    Processing実行中のCPU使用率が異常に高い

    Processing実行中にタスクマネージャーを見てみると、Java(TM) Platform SE binaryが常に30%以上ものCPUを使っています。数行程度の簡単なコードで

  • 解決済

    弾幕ゲームの作成に関して

     processingでのゲーム作成 初めて投稿します。 最近processingを勉強し始め、ゲームを作るという課題が出て、私は弾幕シューティングゲームを作ろうと思い、作成してい

  • 受付中

    processingについて

     前提・実現したいこと サイコロの目が現れた回数を表示するプログラムをサイコロの目が出るとその棒グラフが増えるという形で作成したいのですが(イメージ説明に参考画像があります)、この

同じタグがついた質問を見る

  • Ruby

    7650questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。