Making of "camscape" - Pt.1 - Webcam Capture 摄像头捕捉 - [Works]

之前那节 的准备工作里俺已提到了PC 机用户可以使用Myron WebCamXtra 库来替代P5 内置的Video Capture 类,也就是Myron 官网上对应的"Processing Library",解压后可以把文件夹复制到你P5 安装目录内的libraries 文件夹中,重启你的P5。你就可以在你的File > Sketchbook 选项中找到JMyron 的实例了。你导入这些实例时会自动导入JMyron 的库,但如果你自己从头开始编写涉及到JMyron 的实例的话,你需要事先导入JMyron 的库,选择Sketch > Import Library > JMyron。面板中就会有如下命令。

import JMyron.*;

开始吧,先来导入JMyron 的一个实例simpleCamera。俺翻译了代码的注解,之后还会对几个重要的地方进行解释。

import JMyron.*;   //导入JMyron 库
JMyron m;   // 声明一个摄像头捕捉类的对象
void setup(){
  size(320,240);   //场景大小为320*240
  m = new JMyron();   //为之前声明的摄像头捕捉类对象建立新的引用
  m.start(width,height);   //设置摄像头捕捉画面的大小为场景的宽和高,也就是320*240
  m.findGlobs(0);   //关闭JMyron 的团识别功能(因为这里用不着),以此来加快运算速度
  println("Myron " + m.version());   //当然,这行命令可以删去,仅是输出Myron 的版本号
}

void draw(){
  m.update();   //更新摄像头捕捉画面
  int[] img = m.image();   //获取摄像头捕捉画面的像素点(俺在代码之后会进行解释)
  loadPixels();   //加载场景像素点
  for(int i=0;i       pixels[i] = img[i];   //将摄像头捕捉画面的像素点赋值给场景像素点(以此来使场景中呈现摄像头捕捉画面)
  }
  updatePixels();   //更新场景像素点
}

void mousePressed(){
  m.settings();//   按下鼠标后会出现摄像头的一些参数设置,亮度,对比度,伽马值之类的
}

public void stop(){
  m.stop();   //在程序停止后停止WebCamXtra 运作
  super.stop();   //super 相对于对象m 而言,这里可以理解为P5 内置整个程序的stop() 函数,而不是JMyron 库内部定义的stop() 函数(不理解的童鞋可以跳过,这里无关紧要)
}

__________________________________________________

好了,以上这些是代码部分,然后俺要对其中的一个片断做一下详细的解释。

int[] img = m.image();
loadPixels();
for(int i=0;i    pixels[i] = img[i];
}
updatePixels();

需要注意的是这里的image() 函数是JMyron 库内部定义的,而非P5 内置的image() 函数。所以别上P5 官网查阅image() 函数的用法,此image() 非彼image()。之前的注解里说了int[] img = m.image(); 这行命令的目的在于获取摄像头捕捉画面的像素点。int[] img 声明了一个整数数组(不明白的童鞋可参考上一节的基础知识部分 )。而摄像头捕捉画面的像素点序列以一个整数数组的形式被储存在img 中。

有些童鞋会问,像素点序列是如何排布的,这里俺简单说一下。譬如以下这个放大的3像素*3像素的实例。

各位童鞋对于像素点的序列貌似首先会联想到笛卡尔坐标系 ,也就是这泛绿的字代表的像素序列。而实际上像素点的序列是以紫色字这种排序为标准的。"camscape" 的程式中会涉及到像素点序列的换算,俺在上一节的程式功能拆分中的B 块提到。现在可以提上来先讲。

其实也很简单,设像素的笛卡尔坐标值为(x,y),像素索引号为pixelIndex,整体像素群宽为width。那么这个换算也就是:

pixelIndex = x + y*width;

当然这一节中我们不需要这么一个流程,但"camscape" 中涉及到绘制,所以必须对这个概念有一些了解。

然后说的是loadPixels() 和updatePixels() 函数。它俩是你在P5 场景中呈现像素点必不可少的。loadPixels() 加载场景像素点,然后你对场景像素点进行编辑,最后updatePixels(),更新编辑后的场景像素点并呈现。

最后要说的也就是loadPixels() 与updatePixels() 之间的编辑像素点的内容了。

for(int i=0;i    pixels[i] = img[i];
}

for 是什么?依然请参见上一节中的基础知识部分 。i 这里也就是像素点的索引了,极值为宽与高的乘积,拿上面内个3*3 的实例来说话,极值也就是9,当然i 取到9 就会退出循环,所以循环内的内容只执行到i 取8 的时候。然后把摄像头捕捉到的像素点赋值给场景像素点。当然给像素点赋值,可以直接拿像素点去赋值像素点,也可以拿色值来赋值,譬如。

pixels[0] = color(random(0,255),random(0,255),random(0,255));

好了,讲到这里,各位童鞋应该清楚了JMyron 进行简单摄像头捕捉的运作过程,来测试一下simpleCamera 这个实例吧。

正常的话,在光线充足的情况下,大家可以看到运行窗口中摄像头捕捉到的画面。

这一节到这里也就结束了。有任何不解的童鞋可以直接在楼下提问,觉得俺哪里说的有误或者过于繁琐的童鞋也务必留言告知阿。

下一节内容是"camscape"程式上的第二块,分析捕捉到画面的像素点色值 。当然今天似乎已经带掉其中的一些了。

敬请期待。。。



Posted by at 08:48:00 | Trackback (0) | Edit |

Comments



Add Comment