次回12/09は最後の授業となります。
いままで使ったサンプルや利用したいセンサ、あるいは出力デバイスなど持参し、ひとつの入出力デバイスの仕組みを、各自の設定において構築し、デモンストレーションしてもらいます。次回までに各自の入出力デバイスのサンプルを考えて来て下さい。
次回授業までに準備が間にあわない場合は、授業内の作業で解決したいと思います(各自の設定にあわせて、アドバイスいたします)。
必要なもの:
・各自の入出力デバイスの案
・各自の入出力デバイスに必要なセンサや出力装置
・Arduino(マイコンボード、ブレッドボード、その他部品など)
・Processing (Webカメラなど含む)
2013年12月3日火曜日
2013年11月19日火曜日
11/25の授業:Processing(Webカメラをつかった動体検知)
次回11/25の授業は引き続きWebカメラを用いて、動体検知の実験をします。
時間があれば、カメラをセンサーにして、接続されたArduinoと連動させたいと思います。
必要なもの:
・ノートパソコン
・Webカメラ(ノートパソコン内蔵型も可)
・Arduinoボード類
サンプル1(Processing):カメラがとらえた画面中で動くもの(画面に変化がある部分)を察知して、その動いている部分の平均座標値を求めて、その位置に円を描くサンプル。変数toleranceは、色の許容値なので、上げればより鈍く、下げればより敏感に反応します。
import processing.video.*;
Capture video;
int w=320;
int h=240;
color[] exColor=new color[w*h];
float x,y;
int sumX,sumY;
int pixelNum;
boolean movement=false;
int tolerance=40;
void setup(){
size(320, 240);
video = new Capture(this, w, h);
video.start();
noStroke();
}
void draw() {
if(video.available()){
background(0);
video.read();
set(0,0,video);
loadPixels();
movement=false;
for(int i=0;i<w*h;i++){
float difRed=abs(red(exColor[i])-red(video.pixels[i]));
float difGreen=abs(green(exColor[i])-green(video.pixels[i]));
float difBlue=abs(blue(exColor[i])-blue(video.pixels[i]));
if(difRed>tolerance && difGreen>tolerance && difBlue>tolerance){
movement=true;
pixels[i]=color(0,255,0);
sumX+=i%w;
sumY+=i/w;
pixelNum++;
}
exColor[i]=video.pixels[i];
}
updatePixels();
if(movement==true){
x=sumX/pixelNum;
y=sumY/pixelNum;
sumX=0;
sumY=0;
pixelNum=0;
}
}
fill(255,0,0);
ellipse(x,y,20,20);
fill(0,40,255);
}
サンプル2(Arduino):
動きを検知したProcessingのプログラムに対して、シリアル通信でArduinoと連結し、サーボモータを動かすサンプル。Processing上の動くオブジェクトのX座標(横の動き)に対して、サーボモータの首振りの角度が対応しています。
#include <Servo.h>
Servo myServo;
void setup(){
Serial.begin(9600);
myServo.attach(9);
}
void loop(){
if(Serial.available()>0){
int val=Serial.read();
int x=map(val,0,255,0, 179);
myServo.write(x);
}
delay(15);
}
サンプル2(Processing):上記サーボモータをつないだArduinoに対するProcessing側のサンプルです。Processindgサンプル1の内容に変数float x2,y2を加えてlerp()をつかうことで、円の動きをやや滑らかにする計算をさせています。
import processing.video.*;
Capture video;
import processing.serial.*;
Serial myPort;
int w=320;
int h=240;
color[] exColor=new color[w*h];
float x,y;
float x2,y2;
int sumX,sumY;
int pixelNum;
boolean movement=false;
int tolerance=40;
void setup(){
size(w, h);
video = new Capture(this, w, h);
video.start();
noStroke();
myPort=new Serial(this,"/dev/tty.usbserial-A9005baQ",9600);
//上記"/dev/tty.usbserial-A9005baQ"の部分には各自のシリアルポートをいれてください
}
void draw() {
if(video.available()){
background(0);
video.read();
set(0,0,video);
loadPixels();
movement=false;
for(int i=0;i<w*h;i++){
float difRed=abs(red(exColor[i])-red(video.pixels[i]));
float difGreen=abs(green(exColor[i])-green(video.pixels[i]));
float difBlue=abs(blue(exColor[i])-blue(video.pixels[i]));
if(difRed>tolerance && difGreen>tolerance && difBlue>tolerance){
movement=true;
pixels[i]=color(0,255,0);
sumX+=i%w;
sumY+=i/w;
pixelNum++;
}
exColor[i]=video.pixels[i];
}
updatePixels();
if(movement==true){
x=sumX/pixelNum;
y=sumY/pixelNum;
sumX=0;
sumY=0;
pixelNum=0;
}
}
fill(255,0,0);
//ellipse(x,y,20,20);
//myPort.write(int(map(x,0,width,0,255)));
x2=lerp(x,x2,0.9);
y2=lerp(y,y2,0.9);
ellipse(x2,y2,20,20);
myPort.write(int(map(x2,0,width,0,255)));
fill(0,40,255);
}
サンプル1(Processing):カメラがとらえた画面中で動くもの(画面に変化がある部分)を察知して、その動いている部分の平均座標値を求めて、その位置に円を描くサンプル。変数toleranceは、色の許容値なので、上げればより鈍く、下げればより敏感に反応します。
import processing.video.*;
Capture video;
int w=320;
int h=240;
color[] exColor=new color[w*h];
float x,y;
int sumX,sumY;
int pixelNum;
boolean movement=false;
int tolerance=40;
void setup(){
size(320, 240);
video = new Capture(this, w, h);
video.start();
noStroke();
}
void draw() {
if(video.available()){
background(0);
video.read();
set(0,0,video);
loadPixels();
movement=false;
for(int i=0;i<w*h;i++){
float difRed=abs(red(exColor[i])-red(video.pixels[i]));
float difGreen=abs(green(exColor[i])-green(video.pixels[i]));
float difBlue=abs(blue(exColor[i])-blue(video.pixels[i]));
if(difRed>tolerance && difGreen>tolerance && difBlue>tolerance){
movement=true;
pixels[i]=color(0,255,0);
sumX+=i%w;
sumY+=i/w;
pixelNum++;
}
exColor[i]=video.pixels[i];
}
updatePixels();
if(movement==true){
x=sumX/pixelNum;
y=sumY/pixelNum;
sumX=0;
sumY=0;
pixelNum=0;
}
}
fill(255,0,0);
ellipse(x,y,20,20);
fill(0,40,255);
}
サンプル2(Arduino):
動きを検知したProcessingのプログラムに対して、シリアル通信でArduinoと連結し、サーボモータを動かすサンプル。Processing上の動くオブジェクトのX座標(横の動き)に対して、サーボモータの首振りの角度が対応しています。
#include <Servo.h>
Servo myServo;
void setup(){
Serial.begin(9600);
myServo.attach(9);
}
void loop(){
if(Serial.available()>0){
int val=Serial.read();
int x=map(val,0,255,0, 179);
myServo.write(x);
}
delay(15);
}
サンプル2(Processing):上記サーボモータをつないだArduinoに対するProcessing側のサンプルです。Processindgサンプル1の内容に変数float x2,y2を加えてlerp()をつかうことで、円の動きをやや滑らかにする計算をさせています。
import processing.video.*;
Capture video;
import processing.serial.*;
Serial myPort;
int w=320;
int h=240;
color[] exColor=new color[w*h];
float x,y;
float x2,y2;
int sumX,sumY;
int pixelNum;
boolean movement=false;
int tolerance=40;
void setup(){
size(w, h);
video = new Capture(this, w, h);
video.start();
noStroke();
myPort=new Serial(this,"/dev/tty.usbserial-A9005baQ",9600);
//上記"/dev/tty.usbserial-A9005baQ"の部分には各自のシリアルポートをいれてください
}
void draw() {
if(video.available()){
background(0);
video.read();
set(0,0,video);
loadPixels();
movement=false;
for(int i=0;i<w*h;i++){
float difRed=abs(red(exColor[i])-red(video.pixels[i]));
float difGreen=abs(green(exColor[i])-green(video.pixels[i]));
float difBlue=abs(blue(exColor[i])-blue(video.pixels[i]));
if(difRed>tolerance && difGreen>tolerance && difBlue>tolerance){
movement=true;
pixels[i]=color(0,255,0);
sumX+=i%w;
sumY+=i/w;
pixelNum++;
}
exColor[i]=video.pixels[i];
}
updatePixels();
if(movement==true){
x=sumX/pixelNum;
y=sumY/pixelNum;
sumX=0;
sumY=0;
pixelNum=0;
}
}
fill(255,0,0);
//ellipse(x,y,20,20);
//myPort.write(int(map(x,0,width,0,255)));
x2=lerp(x,x2,0.9);
y2=lerp(y,y2,0.9);
ellipse(x2,y2,20,20);
myPort.write(int(map(x2,0,width,0,255)));
fill(0,40,255);
}
2013年11月1日金曜日
11/11の授業:Processing(Webカメラをつかった色認識)
次回は、Webカメラ(Processing)を用いて、色認識のプログラムの実験をします。
必要なもの:
・ノートパソコン (Processingをインストール済み)
・Webカメラ(ノートパソコン内蔵型も可)
なお、前回のマトリクスLED演習で未消化の部分があれば随時補習します。
サンプル1:
部屋を暗くして、懐中電灯の点光源を動かした軌跡を画面に描きます。画面クリックで背景を黒にリセットします。
import processing.video.*;
Capture video;
int w=640;
int h=480;
void setup() {
size(w, h);
video = new Capture(this, w, h);
video.start();
background(0);
}
void draw() {
if(video.available()){
video.read();
}
loadPixels();
for(int i=0;i<w*h;i++){
if(brightness(video.pixels[i])>=250){
pixels[i]=color(255,0,0);
}
}
updatePixels();
}
void mousePressed(){
background(0);
}
サンプル2:
目立つ色のボールなどを用意して、画面上でそのボールをクリックして、いったん対象となる色を覚えさせます(画面左上に色表示)。そのボールを動かせば、画面上の円が追跡します。矢印キーの左右をつかって、色の許容範囲を設定できます(画面左上の数値:初期値20)。数値を大きくすれば、近似色の範囲が大きくなります。
import processing.video.*;
Capture video;
int w=320;
int h=240;
int tolerance=20;
PFont font;
color targetColor=color(255,0,0);
boolean videoImage=true;
void setup(){
size(w, h);
smooth();
video = new Capture(this, w, h);
video.start();
font=createFont("Monaco",10);
textFont(font);
noStroke();
}
float x;
float y;
int sumX,sumY;
int pixelNum;
boolean detection=false;
void draw() {
if(video.available()){
video.read();
if(videoImage){
image(video, 0, 0);
}else{
background(0);
}
detection=false;
for(int i=0;i<w*h;i++){
float difRed=abs(red(targetColor)-red(video.pixels[i]));
float difGreen=abs(green(targetColor)-green(video.pixels[i]));
float difBlue=abs(blue(targetColor)-blue(video.pixels[i]));
if(difRed<tolerance && difGreen<tolerance && difBlue<tolerance){
sumX+=(i%w);
sumY+=(i/w);
pixelNum++;
detection=true;
}
}
if(detection){
x=sumX/pixelNum;
y=sumY/pixelNum;
sumX=0;
sumY=0;
pixelNum=0;
}
}
fill(255,0,0);
ellipse(x,y,20,20);
fill(targetColor);
rect(0,0,10,10);
text(tolerance,20,10);
String s;
if(detection){
s="detect";
}else{
s="none";
}
text(s,40,10);
}
void keyPressed(){
if(key=='v'){
if(videoImage){
videoImage=false;
}else{
videoImage=true;
}
}
if(key==CODED){
if(keyCode==LEFT){
tolerance-=1;
}
if(keyCode==RIGHT){
tolerance+=1;
}
}
}
必要なもの:
・ノートパソコン (Processingをインストール済み)
・Webカメラ(ノートパソコン内蔵型も可)
なお、前回のマトリクスLED演習で未消化の部分があれば随時補習します。
サンプル1:
部屋を暗くして、懐中電灯の点光源を動かした軌跡を画面に描きます。画面クリックで背景を黒にリセットします。
import processing.video.*;
Capture video;
int w=640;
int h=480;
void setup() {
size(w, h);
video = new Capture(this, w, h);
video.start();
background(0);
}
void draw() {
if(video.available()){
video.read();
}
loadPixels();
for(int i=0;i<w*h;i++){
if(brightness(video.pixels[i])>=250){
pixels[i]=color(255,0,0);
}
}
updatePixels();
}
void mousePressed(){
background(0);
}
サンプル2:
目立つ色のボールなどを用意して、画面上でそのボールをクリックして、いったん対象となる色を覚えさせます(画面左上に色表示)。そのボールを動かせば、画面上の円が追跡します。矢印キーの左右をつかって、色の許容範囲を設定できます(画面左上の数値:初期値20)。数値を大きくすれば、近似色の範囲が大きくなります。
import processing.video.*;
Capture video;
int w=320;
int h=240;
int tolerance=20;
PFont font;
color targetColor=color(255,0,0);
boolean videoImage=true;
void setup(){
size(w, h);
smooth();
video = new Capture(this, w, h);
video.start();
font=createFont("Monaco",10);
textFont(font);
noStroke();
}
float x;
float y;
int sumX,sumY;
int pixelNum;
boolean detection=false;
void draw() {
if(video.available()){
video.read();
if(videoImage){
image(video, 0, 0);
}else{
background(0);
}
detection=false;
for(int i=0;i<w*h;i++){
float difRed=abs(red(targetColor)-red(video.pixels[i]));
float difGreen=abs(green(targetColor)-green(video.pixels[i]));
float difBlue=abs(blue(targetColor)-blue(video.pixels[i]));
if(difRed<tolerance && difGreen<tolerance && difBlue<tolerance){
sumX+=(i%w);
sumY+=(i/w);
pixelNum++;
detection=true;
}
}
if(detection){
x=sumX/pixelNum;
y=sumY/pixelNum;
sumX=0;
sumY=0;
pixelNum=0;
}
}
fill(255,0,0);
ellipse(x,y,20,20);
fill(targetColor);
rect(0,0,10,10);
text(tolerance,20,10);
String s;
if(detection){
s="detect";
}else{
s="none";
}
text(s,40,10);
}
void keyPressed(){
if(key=='v'){
if(videoImage){
videoImage=false;
}else{
videoImage=true;
}
}
if(key==CODED){
if(keyCode==LEFT){
tolerance-=1;
}
if(keyCode==RIGHT){
tolerance+=1;
}
}
}
2013年10月3日木曜日
10/21の授業:マトリクスLED+Webカメラ
次回の授業は10/21です。
ひきつづき前回利用したマトリクスLEDを使用しつつ、ProcessingによるWebカメラと連動させる演習を行う予定です。
前回のマトリクスLEDについては、このページ(2008建築発明工作ゼミ)を参考に配線ならびに点灯実験を行ってきてください。使用しているマトリクスLEDによっては、配線番号や極性が異なることがあるので、各自確認してきてください(分からなければ、次回の授業で)。
必要なもの:
・ノートパソコン (ArduinoとProcessingをインストール済み)
・Arduinoボード+USBケーブル
・ブレッドボード(できれば小型なもの2個)
・ジャンパワイヤー(オスーオスタイプ:できれば20本以上)
・マトリクスLED(アノードコモンタイプ)
・Webカメラ(ノートパソコン内蔵型も可)
Arduino側のプログラム(アノード/カソードコモンで極性が逆の場合は、digitalWrite()内のHIGH/LOWを逆にしてください):
Processing変更版:
import processing.video.*;
import processing.serial.*;
Capture cam;
Serial port;
int w=640; //画面幅
int h=480; //画面高さ
int s=60; //モザイク一辺のサイズ
boolean start=false; //シリアル通信開始用フラグ
int[] pixelValue=new int[64];
void setup() {
size(w,h);
cam = new Capture(this, w,h);
cam.start();
stroke(1); //モザイクの外形線の色
//noStroke(); //外形線なしの場合
}
int cnt=0;
void draw() {
if (cam.available() == true) {
cam.read();
for(int i=0; i<w*h;i++){ //カメラ画像を8x8のモザイク画像に変換
int x=i%w;
int y=i/w;
if(x%s==0 && x/s<8 && y%s==0){
fill(cam.pixels[i]);
rect(x, y, s, s);
pixelValue[cnt]=int(brightness(cam.pixels[i]));
cnt++;
if(start){
int pixColor=int(brightness(cam.pixels[i]));
port.write(pixColor); //色データ値送信
}
}
}
}
println(cnt);
cnt=0;
}
void mousePressed(){ //クリックでシリアル通信開始または停止
start=!start;
if(start){
port=new Serial(this,"/dev/tty.usbserial-A40014iU",9600);
}else{
port.stop();
}
}
ひきつづき前回利用したマトリクスLEDを使用しつつ、ProcessingによるWebカメラと連動させる演習を行う予定です。
前回のマトリクスLEDについては、このページ(2008建築発明工作ゼミ)を参考に配線ならびに点灯実験を行ってきてください。使用しているマトリクスLEDによっては、配線番号や極性が異なることがあるので、各自確認してきてください(分からなければ、次回の授業で)。
必要なもの:
・ノートパソコン (ArduinoとProcessingをインストール済み)
・Arduinoボード+USBケーブル
・ブレッドボード(できれば小型なもの2個)
・ジャンパワイヤー(オスーオスタイプ:できれば20本以上)
・マトリクスLED(アノードコモンタイプ)
・Webカメラ(ノートパソコン内蔵型も可)
Arduino側のプログラム(アノード/カソードコモンで極性が逆の場合は、digitalWrite()内のHIGH/LOWを逆にしてください):
//8x8の二次元配列を用意
byte matrix[8][8];
void setup(){
//出力ピンの設定、すべてオフにする
for(int i=2;i<=17;i++){
pinMode(i,OUTPUT);
digitalWrite(i,LOW);
}
//シリアル通信開始
Serial.begin(9600);
}
void loop(){
//シリアル通信(64個分のデータ)
if(Serial.available()>63){
for(int k=0;k<8;k++){
for(int l=0;l<8;l++){
//読み込んだ値を配列に代入
matrix[k][l]=Serial.read();
}
}
}
//各LEDの点灯制御
for(int i=2;i<=9;i++){
//列の点灯
digitalWrite(i,HIGH); //極性が逆の場合HIGHをLOW
for(int j=10;j<=17;j++){
//行の点灯
digitalWrite(j,LOW); //極性が逆の場合LOWをHIGH
//行の点灯継続時間
delayMicroseconds(1+matrix[i-2][j-10]);
//行の消灯
digitalWrite(j,HIGH); //極性が逆の場合HIGHをLOW
//行の消灯継続時間
delayMicroseconds(256-matrix[i-2][j-10]);
}
//列の消灯
digitalWrite(i,LOW); //極性が逆の場合LOWをHIGH
} }
Processing変更版:
import processing.video.*;
import processing.serial.*;
Capture cam;
Serial port;
int w=640; //画面幅
int h=480; //画面高さ
int s=60; //モザイク一辺のサイズ
boolean start=false; //シリアル通信開始用フラグ
int[] pixelValue=new int[64];
void setup() {
size(w,h);
cam = new Capture(this, w,h);
cam.start();
stroke(1); //モザイクの外形線の色
//noStroke(); //外形線なしの場合
}
int cnt=0;
void draw() {
if (cam.available() == true) {
cam.read();
for(int i=0; i<w*h;i++){ //カメラ画像を8x8のモザイク画像に変換
int x=i%w;
int y=i/w;
if(x%s==0 && x/s<8 && y%s==0){
fill(cam.pixels[i]);
rect(x, y, s, s);
pixelValue[cnt]=int(brightness(cam.pixels[i]));
cnt++;
if(start){
int pixColor=int(brightness(cam.pixels[i]));
port.write(pixColor); //色データ値送信
}
}
}
}
println(cnt);
cnt=0;
}
void mousePressed(){ //クリックでシリアル通信開始または停止
start=!start;
if(start){
port=new Serial(this,"/dev/tty.usbserial-A40014iU",9600);
}else{
port.stop();
}
}
2013年9月10日火曜日
9/30の授業:マトリクスLED
次回は3週間後の9/30になります。
次回は主にArduinoをつかって、マトリクスLED制御の演習を行う予定です。
前回のWebカメラ演習とも関連した内容となります。ひきつづき複数の画素制御について演習していきます。
尚、マトリクスLEDについては以下のものを用意してきてください。
必要なもの:
・ノートパソコン
・Arduinoボード+USBケーブル
・ブレッドボード(できれば小型なもの2個)
・ジャンパワイヤー(オスーオスタイプ:できれば20本以上)
・マトリクスLED(アノードコモンタイプ)
*マトリクスLEDには、アノードコモンタイプとカソードコモンタイプがあります。複数のLEDの陽極(+)を共有接合してあるものか、陰極(ー)を共有接合してあるものかになりますが、今回はアノードコモンタイプを使う予定です(入手困難であればカソードコモンタイプでも構いません)。
また、マトリクスLEDがブレッドボードに対してサイズが大きいので、できれば小型なブレッドボードを2枚用意して、その2枚にまたがるように配置するとつかいやすくなります。
上記8x8のマトリクスLEDには、合計64個のLEDが内蔵されており、端子数も16個あるので、最低でも20本はジャンパワイヤーが必要となりますので、足りない場合は追加しておいてください。
授業内のサンプル: (左上から順番にひとつずつLEDを点灯させる)
*カソードコモンタイプの場合:
次回は主にArduinoをつかって、マトリクスLED制御の演習を行う予定です。
前回のWebカメラ演習とも関連した内容となります。ひきつづき複数の画素制御について演習していきます。
尚、マトリクスLEDについては以下のものを用意してきてください。
必要なもの:
・ノートパソコン
・Arduinoボード+USBケーブル
・ブレッドボード(できれば小型なもの2個)
・ジャンパワイヤー(オスーオスタイプ:できれば20本以上)
・マトリクスLED(アノードコモンタイプ)
*マトリクスLEDには、アノードコモンタイプとカソードコモンタイプがあります。複数のLEDの陽極(+)を共有接合してあるものか、陰極(ー)を共有接合してあるものかになりますが、今回はアノードコモンタイプを使う予定です(入手困難であればカソードコモンタイプでも構いません)。
また、マトリクスLEDがブレッドボードに対してサイズが大きいので、できれば小型なブレッドボードを2枚用意して、その2枚にまたがるように配置するとつかいやすくなります。
上記8x8のマトリクスLEDには、合計64個のLEDが内蔵されており、端子数も16個あるので、最低でも20本はジャンパワイヤーが必要となりますので、足りない場合は追加しておいてください。
授業内のサンプル: (左上から順番にひとつずつLEDを点灯させる)
マトリクスLEDにはアノードコモンタイプとカソードコモンタイプがあり極性が逆になります。
以下プログラム内のdigitalWrite()のHIGH/LOWが逆になります。
*アノードコモンタイプの場合:
void setup(){
//16本のピン(2~17)をデジタル出力に設定
for(int i=2;i<=17;i++){
pinMode(i,OUTPUT);
}
}
void loop(){
//行(横)の繰り返し処理
for(int i=2;i<=9;i++){ //行(2~9番ピン)
digitalWrite(i,LOW); //LOWで点灯
//列(縦)の繰り返し処理
for(int j=10;j<=17;j++){ //列(10~17番ピン)
digitalWrite(j,HIGH); //HIGHで点灯
delay(100); //点灯時間
digitalWrite(j,LOW); //列をオフにする
}
digitalWrite(i,HIGH); //行をオフにする
}
}
*カソードコモンタイプの場合:
void setup(){
//16本のピン(2~17)をデジタル出力に設定
for(int i=2;i<=17;i++){
pinMode(i,OUTPUT);
}
}
void loop(){
//行(横)の繰り返し処理
for(int i=2;i<=9;i++){ //行(2~9番ピン)
digitalWrite(i,HIGH); //HIGHで点灯
//列(縦)の繰り返し処理
for(int j=10;j<=17;j++){ //列(10~17番ピン)
digitalWrite(j,LOW); //LOWで点灯
delay(100); //点灯時間
digitalWrite(j,HIGH); //列をオフにする
}
digitalWrite(i,LOW); //行をオフにする
}
}
2013年9月6日金曜日
9/09の授業:Webカメラの演習
後期初回(9/09)は、Webカメラを用いた実験を行いたいと思います。
Processingのvideoライブラリをつかって、Webカメラをセンサとして利用する内容に発展していく予定です。
また必要に応じてArduinoとの連携を行います。
必要なもの:
・ノートパソコン
・Webカメラまたはパソコン内蔵カメラ
・Arduinoボード類一式
モザイク画像の表示:
import processing.video.*;
Capture cam;
int w=640; //画面幅
int h=480; //画面高さ
int s=10; //モザイク1辺のサイズ
void setup() {
size(w,h);
cam = new Capture(this, w,h);
cam.start();
stroke(0); //モザイクの外形線の色
//noStroke(); //外形線なしの場合
}
void draw() {
if (cam.available() == true) {
cam.read();
for(int i=0; i<w*h;i++){
if((i%w)%s==0 && (i/w)%s==0){
fill(cam.pixels[i]);
rect(i%w, i/w, s, s);
}
}
}
}
変数sを変えれば、モザイクの細かさが変化します。
また、wとhを変えることで、表示サイズとカメラから取り込む画像サイズを変えることができます。
このプログラムでは、640×480画素数で読み込んでいる画像データを
if((i%w)%s==0 && (i/w)%s==0){...}
の条件文をつかって、iについては横を10個(変数sの値分)とばし、縦も10個とばしのピクセルの位置の色データだけをfill()に適用させてrect()で矩形(モザイクの1粒)を描かせています。
Processingのvideoライブラリをつかって、Webカメラをセンサとして利用する内容に発展していく予定です。
また必要に応じてArduinoとの連携を行います。
必要なもの:
・ノートパソコン
・Webカメラまたはパソコン内蔵カメラ
・Arduinoボード類一式
モザイク画像の表示:
import processing.video.*;
Capture cam;
int w=640; //画面幅
int h=480; //画面高さ
int s=10; //モザイク1辺のサイズ
void setup() {
size(w,h);
cam = new Capture(this, w,h);
cam.start();
stroke(0); //モザイクの外形線の色
//noStroke(); //外形線なしの場合
}
void draw() {
if (cam.available() == true) {
cam.read();
for(int i=0; i<w*h;i++){
if((i%w)%s==0 && (i/w)%s==0){
fill(cam.pixels[i]);
rect(i%w, i/w, s, s);
}
}
}
}
変数sを変えれば、モザイクの細かさが変化します。
また、wとhを変えることで、表示サイズとカメラから取り込む画像サイズを変えることができます。
このプログラムでは、640×480画素数で読み込んでいる画像データを
if((i%w)%s==0 && (i/w)%s==0){...}
の条件文をつかって、iについては横を10個(変数sの値分)とばし、縦も10個とばしのピクセルの位置の色データだけをfill()に適用させてrect()で矩形(モザイクの1粒)を描かせています。
2013年8月22日木曜日
後期授業
後期授業は、9/9から開始します。
後期は、前期の内容を復習しながら、やや応用的な内容の演習を行う予定です。
ノートパソコン(Processing+Arduinoインストール済み)、
Arduinoボード+ブレッドボード+ジャンパワイヤ+その他部品等、
は、毎回持参してください。
後期授業日程:
09/09
09/30
10/21
11/11
11/25
12/09
後期は、前期の内容を復習しながら、やや応用的な内容の演習を行う予定です。
ノートパソコン(Processing+Arduinoインストール済み)、
Arduinoボード+ブレッドボード+ジャンパワイヤ+その他部品等、
は、毎回持参してください。
後期授業日程:
09/09
09/30
10/21
11/11
11/25
12/09
登録:
コメント (Atom)