--- tags: 程式設計,第十三章,學生版,互動藝術程式創作入門,Creative Coding --- # 章節 13_2 - 學生版_即時影像擷取與像素操作 ## 使用影像 * P5.createCapture() * 使用方式 ```javascript= capture = createCapture(VIDEO) capture.size(320,240);//設定顯示畫面大小 image(capture,mouseX, mouseY) ``` --- ### 實際的程式碼 ```javascript= function setup() { createCanvas(windowWidth, windowHeight); background(100); capture = createCapture(VIDEO) capture.size(320,240); } function draw() { image(capture,mouseX,mouseY) } ``` --- ### 先儲存 capture 抓到的影像,再去處理儲存起來的影像 #### 產生一個方塊的點 ```javascript= ``` --- ### 修正攝影機左右相反的問題 ```javascript= ``` --- ### span依照滑鼠x軸移動變化其方塊大小 ```javascript= ``` * 可以把rect(x,y,span)改為圓圈ellipse(x,y,span) --- ### 取得亮度:(pixel[0] + pixel[1] + pixel[2])/3 //RGB 的平均值 ```javascript= ``` --- ### 不一樣的畫面(方塊的大小跟顏色有相關) ![](https://i.imgur.com/35jTfmE.gif) ```javascript= var cacheGraphics; var bk; function setup() { //createCanvas(windowWidth, windowHeight); createCanvas(640,480); background(0); capture = createCapture(VIDEO) capture.size(640,480); cacheGraphics =createGraphics(640,480); cacheGraphics.translate(640,0) cacheGraphics.scale(-1,1) capture.hide() } function draw() { background(0); cacheGraphics.image(capture,0,0); noStroke(); var span=10+max(mouseX,0)/20 for(var x=0;x<cacheGraphics.width;x=x+span){ for(var y=0;y<cacheGraphics.height;y+=span){ var pixel=cacheGraphics.get(x,y); bk=(pixel[0]+ pixel[1]+pixel[2])/3 //fill(pixel) fill(bk); //rect(x,y,span) ellipse(x,y,span*map(bk,0,255,0,1)) } } } ``` --- ### 按下不同按鈕產生不一樣的畫面 ```javascript= ``` --- ### 按下1或是2,3都會產生不同的效果 ```javascript= ``` --- 可以把 rect(0,0,span); 更改為 rect(0,0,span*0.9); //讓方塊與方塊間有更大黑色縫隙 --- ### 顏色與pixel[0]有相關 ```javascript= ``` --- ### 顏色會變化方塊大小 ![](https://i.imgur.com/6VvOhiH.gif) ```javascript= ``` --- ### 文字雲的創作 #### 取的當前像素的亮度 bk = (pixel[0] + pixel[1] + pixel[2])/3 --- ![](https://i.imgur.com/I3DqiNK.gif) ```javascript= if(mode=="3") { fill(pixel) textSize(span) text("天",x,y) } ``` --- ### 取得當前亮度對應到的文字(假設共有 10 個字可選擇): var txt = "一二三四五田雷電龕龘" --- ```javascript= const density = 'Ñ@#W$9876543210?!abc;:+=-,._ '; let txt = "一二三四五田雷電龕龘" let bkId = int(map(bk, 0, 255, 9, 0)) text(txt[bkId]) ``` --- ### 最後完整程式碼 ```javascript= var cacheGraphics; var bk; var mode=2; var bkId; const destiny = 'Ñ@#W$9876543210?!abc;:+=-,._ '; const txt = "一二三四五田雷電龕龘" function setup() { //createCanvas(windowWidth, windowHeight); createCanvas(640,480); background(0); capture = createCapture(VIDEO) capture.size(640,480); cacheGraphics =createGraphics(640,480); cacheGraphics.translate(640,0) cacheGraphics.scale(-1,1) capture.hide() } function draw() { background(0); cacheGraphics.image(capture,0,0); noStroke(); var span=10+max(mouseX,0)/20 for(var x=0;x<cacheGraphics.width;x=x+span){ for(var y=0;y<cacheGraphics.height;y+=span){ var pixel=cacheGraphics.get(x,y); if(mode=="1"){ bk=(pixel[0]+ pixel[1]+pixel[2])/3 fill(bk); ellipse(x,y,span*map(bk,0,255,0,1)); } if(mode=="2"){ fill(pixel) push() colorMode(HSB) fill(pixel[0],100,90) translate(x,y) rectMode(CENTER) rotate(pixel[0]/100) rect(0,0,span*0.3+pixel[0]/10); fill(0) ellipse(0,0,5) pop() } if(mode=="3"){ //fill(pixel) textSize(span) bk=(pixel[0]+pixel[1]+pixel[2])/3 bkId = int(map(bk,0,255,28,0)) //text("天",x,y) //bkId = int(map(bk,0,255,0,9)) //text(txt[bkId],x,y) text(destiny[bkId],x,y) } } } } function keyPressed(){ if(key=="1"){ mode=1 } if(key=="2"){ mode=2 } if(key=="3"){ mode=3 } print(mode) } ``` --- #### 加入材質,產生noise效果 ```javascript= push() blendMode(MULTIPLY) image(noiseTexture,0,0,width,height) pop() ``` --- --- ## 影片操作進階-追蹤顏色 引用 Tracking.js 的方式,以下則一即可: 在新的 tab 中使用 trackingjs 的程式碼 ,刪掉註解的部分以避免執行錯誤。 參考這個 sketch,在一個新個 tab 裡面新增下列程式碼即可: --- #### 產生一個新的tab2 ![](https://i.imgur.com/0EGnCRS.png) --- ```javascript= var s = document.createElement("script"); s.type = "text/javascript"; s.src = "https://cdnjs.cloudflare.com/ajax/libs/tracking.js/1.1.3/tracking-min.js"; document.head.appendChild(s); ``` --- ### 綁定 capture 的影片 ```javascript= capture = createCapture(VIDEO) capture.position(0,0) capture.id("myVideo") colors = new tracking.ColorTracker(['yellow','magenta','cyan']) //追蹤特定顏色 tracking.track("#myVideo",colors) // 綁定影片 ``` --- ### tracking 的 colorTracker 可以抓取特定的顏色,並回傳一個有這些色塊位置與大小的陣列。 ```json= [ { color: "yellow" height: 473 width: 543 x: 96 y: 0 }, { color: "yellow" height: 472 width: 541 x: 98 y: 0 }... ] ``` ### 綁定資料更新的事件 ```javascript= colors.on('track',updateData) // 綁定事件,畫面更新的時候執行 updateData function updateData(event){ data = event.data } ``` ### 把資料繪製到螢幕上 ```javascript= fill('yellow') if (data){ for(var i=0;i<data.length;i++){ fill(data[i].color) rect( data[i].x,data[i].y, data[i].width,data[i].height ) } } ``` --- 章節 13_2 - 學生版_即時影像擷取與像素操作.md 目前顯示的是「章節 13_2 - 學生版_即時影像擷取與像素操作.md」。