amp;0xff; //计算该点亮度值 nl=Math.sqrt(nr*nr + ng*ng + nb*nb) //获取前一快照before同一点的RGB值 bc=before.getPixel(x,y);
//红色通道 br=bc>>16&0xff; //绿色通道 bg=bc>>8&0xff; //蓝色通道 bb=bc&0xff; //计算该点亮度值 bl=Math.sqrt(br*br + bg*bg + bb*bb); //计算亮度值的变化 d=Math.round(Math.abs(bl-nl)); if(d>tolerance) { //该点发生了变化 } 但是这种方法存在计算效率问题。按图像大小为180*160像素,每秒30帧计算,每计算一副图片需要的计算次数为180*160*30。图像的像素越大,需要的计算次数就越多。采用隔点检测的方法可以在一定程度上缓解计算压力,即每隔n个像素检测一次,这样电脑的计算次数减少为原来的1/n。 2)改进思路 Flash8提供的图像混合模式可以解决上面遇到的效率问题。Flash8提供了11种图像混合模式。每一种混合模式可以得到不同的混合效果。Different 混合模式是基于两张图片之间的亮度差值进行计算,从而得到图片的负片效果。利用该模式,便可以得到移动像素的检测图像。 //将前一张快照before的图像绘制到当前快照now上,使用different混合模式 now.draw(before, new Matrix(), null, "difference"); 图像中黑色表示没有发生移动,其他颜色表示发生了移动。由于Flash8提供的混合模式是采用C++编码实现的,因此运行效率要比Action Script编码更加高效。 5.动态显示检测图像 1)处理检测图像 通过以上两种方式得到的图像中色彩范围较广,这增加了统计上面的困难。通过使用 threshold() 方法,可以隔离和替换图像中的颜色范围,并对图像像素执行其它逻辑操作。threshold()函数根据指定的阈值测试图像中的像素值,并将通过测试的像素设置为新的颜色值。这样,便得到了清晰醒目的检测图像。 //将大于阀值0xFF111111的像素替换为绿色。 myBitmap.threshold(myBitmap, myBitmap.rectangle, myBitmap.rectangle.topLeft, ">", 0xFF111111, 0xFF00FF00, 0x00FFFFFF, false); 2)检测图像的显示 Bitmap对象无法直接在舞台上显示,必须附着在MovieClip上面才能显示。因此可以使用MovieClip类的attachBitmap()方法,将获取的图像信息显示出来。 //创建一个影片剪辑来显示当前图像 this.createEmptyMovieClip(“当 |