作者langrisser19 (lenny)
看板Flash
标题Re: [问题] Flash中webcam问题
时间Fri Mar 7 01:57:37 2008
http://langrisser1981.blogspot.com/2008/02/blog-post_9062.html
这我之前做的
你应该是想做像这样的东西没错吧
我当初是用flash写的
老实说如果用director会比较快,因为有现成的外挂可以用,而且速度比较快
flash也行,国外有很多范例可以看
当时我是自己写了一个小小的公式来计算,也有写成元件方便使用
不过原理很重要
我来说说我是怎麽思考的
继续往下之前确认两件事
1.你会用photoshop,或是影像处理,知道什麽叫做混色模式(blending mode)
2.你知道什麽叫做位元运算子(bitwise operator)
不知道的话,你应该永远也做不出来侦测影像的程式...囧rz
首先,你用getPixel() 只能知道颜色
除非你带了一个黑手套,然後在一个白画面前面晃,这样的反差抓颜色才有意义
不然你的程式会误差到一个很可怕的程度
所以我的想法很简单,我要知道“画面的那个地方是有动作的”
也就是前面一个画面,跟目前这个画面,它的差别在哪里
如果有用过photoshop,思考一下,假设现在你有两张图
画面上的背景是黑色,上面都有一个红色的圆
但是一张图的圆在中间偏左,另一张在中间偏右
你要怎麽找出她们重叠的那一块,跟不同的地方
很简单,先把其中一张颜色反转,再跟另一张图作联集运算就可以
我想有用过的人应该都会这招,这招就是我们要做的
换成数学表示,原理就是
首先我先把该点像素的颜色拆开,rgb值都分别拆开
假设该点像素是红色,所以他的rgb值是0xff0000,我们用变数color代表
r=(0xff0000&color)>>16;
g=(0x00ff00&color)>>8;
b=(0x0000ff&color);
这样你就得到了 r,g,b三个channel的值
这时候你可以把结果先转成灰阶化,但是因为这边我知道我只要抓红色
所以我只取r channel的结果
转灰阶化也不难啦,我都直接这样转 (0.3*r)+(0.6*r)+(0.1*b)
总之最後你会得到一个值,它的范围是0~255...这就是重点
把这个值转成二进位表示
以这个例子为例,画面不是红就是灰
所以这个值如果不是0xff(red channel)不然就是0x00(黑)
我把该值转二进位表示,红色就等於11111111,黑色就等於00000000
你把两个画面的“同一个取样点”都做同样的计算
好了以後
先把其中一个做not运算
假设在上一个画面的时候,这一个取样点是红色
所以取到的值等於11111111,做not(!)运算,结果等於00000000(在此以a代表)
! 11111111
__________
a:00000000
接下来假设这个画面红圈移动开了,所以同样的取样点取到黑色
值等於00000000(在此以b代表)
把a跟b做or(|)运算
a:00000000
b:00000000
|_________
c:00000000
答案会是全黑
同样的情况,我假设这个取样点取到一样是红色
值等於11111111(在此以d代表)
a:00000000
d:11111111
|_________
e:11111111
答案会是全白
所以我就是用这个法来判断
白色就代表这个点的像素没有改变过,越黑就代表改变越大
没错,用这个方式还可以知道改变的幅度
既然知道哪个像素被更动了,就知道哪个点发生作用
这样就可以作後续侦测了
当然怎样设取样点,怎样最佳化,这要自己去调整
不过概念是这样没错
说到这边,完...
※ 引述《gargouille (lol)》之铭言:
: ※ 引述《yakeilee (嘟嘟啊~台南处处有好人)》之铭言:
: : 如果要用Flash中的webcam侦测画面中的颜色区块
: : 是否是要从Bitmap中撷取??
: : 真的不知道要从哪个指令下手编写
: : 之前有大大推荐我要先去看help
: : 我看了...只找到侦测activity 事件
: : 拜托大大们指导迷津一下Orz
: : 或者是有没有相关教学的书籍或网站可以推荐的??
: : 我看help看到眼睛快脱窗了~还是写不出来>"<
: 正好我最近也想做这个相关的题目
: 我还没有什麽成果出来
: 不过我想用的是
: BitmapData.getColorBoundsRect()
: 或
: BitmapData.getPixel()
: 这两个去做吧
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.169.51.117
1F:推 gargouille:感谢~ 这真实用 03/07 02:38
2F:推 yakeilee:挖~~其实之前我找的资料中就有说过用direct做比较好 03/07 14:20
3F:→ yakeilee:但是後来接触到一位外国学者建议我用FLASH做.... 03/07 14:21
4F:→ yakeilee:因此我才会在这边提出疑问...谢谢你提供这些资讯^^ 好人 03/07 14:21