flash as3 对摄像头颜色的检测

本文介绍了一种使用AS3进行摄像头前物体颜色检测的方法。该方法包括应用模糊滤镜、颜色混合滤镜以及通过循环遍历像素来检测绿色物体。这种方法虽然运行速度较慢,但在多种场景中能提供较高的检测精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

as3对摄像头前物体颜色的检测已经成为一个相当热门的问题了,网上对这一问题的解决办法数不胜数,然而在我不断的尝试下发现,其中很多方法的精度总是差强人意,不能满足在大多数场景下对摄像头前物体的颜色检测,所以我根据自己的一些总结和尝试利用一种比较慢,但精度稍高的方法去做了这一检测。

具体方法如下:

1.捕获摄像头前的画面,并应用模糊滤镜

video_map.applyFilter(video_map,video_map.rect,new Point(),new BlurFilter(10,10,1););

这一步网上许多方法都将其列为第一步,我认为这一步相当重要,缺少了它,后面做再多的工作只是徒劳。

2.在刚刚那层滤镜的基础上再加一层颜色混合滤镜,滤镜定义如下:

matrix = matrix.concat([1,0,0,0,-50]);// red
matrix = matrix.concat([0,1,0,0,-50]);// green
matrix = matrix.concat([0,0,1,0,-50]);// blue
matrix = matrix.concat([0,0,0,1,0]);// alpha

这层滤镜的目的主要在于降低各个通道颜色的数值,缩小两个通道颜色的比例,便于后面处理。

比如原来的红色通道是0x90、绿色通道是0xaa,其比值为0x90/0xaa=84%,加了滤镜后红色的值为0x40,绿色的值为0x5a,比值为0x40/0x5a=71%

3.直接用二层循环取出点(i,j)的颜色并且分解成三个通道,green、red、blue,下面是判断为绿色的条件,范围是通过不断调整得到的:

if (green * 0.85 < red || green * 0.85 < blue || green < 0x60)

最后将符合条件的点用一种颜色标记,不符合条件的用另外一种颜色标记。

完整代码:

package {
 import flash.display.Sprite;
 import flash.media.Camera;
 import flash.media.Video;
 import flash.events.Event;
 import flash.display.BitmapData;
 import flash.display.Bitmap;
 import flash.geom.Point;
 import flash.filters.BitmapFilter;
 import flash.filters.BlurFilter;
 import flash.events.MouseEvent;
 import flash.filters.ColorMatrixFilter;

 public class Main2 extends Sprite {
  private var Cam:Camera=new Camera();
  private var video:Video = new Video(135,100);
  private var video_map:BitmapData = new BitmapData(135,100);
  private var aaa:BitmapData = new BitmapData(135,100);
  private var print_map:Bitmap=new Bitmap();
  private var filter:BitmapFilter = new BlurFilter(10,10,1);
  private var filter2:ColorMatrixFilter=new ColorMatrixFilter();
  private var _red:Array;
  private var _green:Array;
  private var _blue:Array;
  private var matrix:Array = new Array();
  public function Main2() {
   this.addEventListener(Event.ADDED,addfinish);
   matrix = matrix.concat([1,0,0,0,-50]);// red
   matrix = matrix.concat([0,1,0,0,-50]);// green
   matrix = matrix.concat([0,0,1,0,-50]);// blue
   matrix = matrix.concat([0,0,0,1,0]);// alpha
   filter2.matrix = matrix;
  }
  private function addfinish(e:Event) {
   Cam.setMode(135,100,15);
   Cam = Camera.getCamera();
   video.x = 110;
   video.y = 300;
   video.filters = [filter2];
   video.attachCamera(Cam);
   this.addChild(video);
   this.addEventListener(Event.ENTER_FRAME,onenterframe);
  }
  private function onenterframe(e:Event) {
   findgreen();
  }
  private function findgreen() {
   video_map.draw(video);
   video_map.applyFilter(video_map,video_map.rect,new Point(),filter);
   //模糊;
   now_x = 0;
   now_y = 0;
   colorsum = 0;
   for (var i:uint=0; i<135; i++) {
    for (var j:uint=0; j<100; j++) {
     var pointcolor:uint = video_map.getPixel(i,j);
     var green:Number = (pointcolor>>8) % 256;
     var red:Number = (pointcolor>>16) % 256;
     var blue:Number = pointcolor % 256;
     if (green * 0.85 < red || green * 0.85 < blue || green < 0x60) {
      video_map.setPixel(i,j,0xff000000);
     }
     else {
      video_map.setPixel(i,j,0xff00ff00);
     }
    }
   }//检测绿色
   print_map.bitmapData = video_map;
   print_map.x = 340;
   print_map.y = 300;
   this.addChild(print_map);
  }
  }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值