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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

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

Q&A

1回答

1219閲覧

prosessingについて

YuriFukushi

総合スコア6

Ruby

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

0グッド

0クリップ

投稿2017/04/01 07:50

下記、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);
}
}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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


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

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

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

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

processing

1import java.awt.Point; 2import java.util.ArrayDeque; 3import java.util.Iterator; 4 5// 最近覚えたN個の点を結ぶ直線を描画するためのクラス 6class DynamicLines { 7 ArrayDeque q = new ArrayDeque(); 8 9 // コンストラクター(いくつの点を覚えるかを引数に指定) 10 DynamicLines(int n) { 11 for (int i = 0; i < n; i++) { 12 q.addFirst(new Point(0, 0)); 13 } 14 } 15 16 // 新たな座標を覚えさせ、最も古い点を忘れる 17 void add(int x, int y) { 18 q.addFirst(new Point(x, y)); 19 q.removeLast(); 20 } 21 22 // 現在覚えている座標を結んだ折れ線を描画する 23 void drawLines() { 24 Point pre = null; 25 Iterator<Point> itr = q.iterator(); 26 while (itr.hasNext()) { 27 Point cur = itr.next(); 28 if (pre != null) { 29 line(pre.x, pre.y, cur.x, cur.y); 30 } 31 pre = cur; 32 } 33 } 34} 35 36// 5点までの座標を覚えるための変数を宣言 37DynamicLines dl = new DynamicLines(5); 38 39void setup() { 40 ...省略 41} 42 43void draw() { 44 ...省略 45 stroke(0); // 黒で直線を描画すると仮定 46 dl.add(brightestX, brightestY); // 新たな座標を覚える 47 dl.drawLines(); // これまでに覚えた5点を直線で結ぶ 48}

投稿2017/04/01 12:21

編集2017/04/01 12:24
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YuriFukushi

2017/04/02 07:08

ご回答ありがとうございます! Processingでは難しいのですね... 関数の使い方はなんとなくですが、把握したと思うので早速試してみようかと思います。 Wed上では関数だけ載っていて説明がなかったりするので、とても助かります><! ちなみに、上記で古い点は消えてしまうと書かれてありましたが、パソコン上にはデータは残るものなのでしょうか? というのも、movieを撮り終えた後に、excelにデータを移して解析したいと思っております。 又、撮影では8分間連続で撮り続けたいと思っておりますが、可能でしょうか? 度々の質問になってしまいますが、ご回答頂けると助かります。
KSwordOfHaste

2017/04/02 08:02 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問