2013-10-24 2 views
0

나는 카메라 입력에서 캡처 한 비트 맵을 벡터로 변환하여 벡터 점을 나중에 사용할 수 있도록 배열로 변환하려고 시도해 왔습니다.비트 맵을 as3으로 벡터로 변환

그러나 Flash 내에서 이러한 기능을 찾을 수 없으므로 Corey O'Neil으로 만든 'Vectorization Package'를 사용하려고했습니다. 이것은 작동하지만 내 비트 맵에서 흰색 배경을 제거하는 데 실패합니다 (나는 그 위에 선이있는 그림을 캡처하고 있습니다). 수동으로이 작업을 수행하고 배경을 투명하게 만드는 경우에도 결과가 나타나지 않습니다.

public class DocumentRich extends MovieClip{ 

    public var initBox2D:Main; 
    var cam:Camera = Camera.getCamera(); 
    var vid:Video = new Video(420, 300); 
    var myVector:Vectorize; 
    public function DocumentRich() 
    { 
     if(stage){ 
      initBox2D = new Main(); 
      addChild(initBox2D); 
      //addChild(new movieMonitor()); 
     } 

     addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true); 
     StartAnim(); 


    } 

    function StartAnim():void 
    { 
     //SET UP WORLD 
     initBox2D.isDebugMode(false); 
     initBox2D.mouseDragEnabled(true); 
     Main.world.SetGravity(new b2Vec2(0,0)); 


     cam.setQuality(0, 100); 
     cam.setMode(420, 300, 30, true); 
     trace(cam.height); 
     vid.attachCamera(cam); 
     addChild(vid); 
     addChild(go); 
    } 

    function clickHandler(m:MouseEvent){ 
     trace(m.target.name); 
     switch(m.target.name){ 
      case 'go': 
       goButtonFun(); 
      break; 

     } 
    } 

    function goButtonFun():void{ 
     var screenShot:BitmapData = new BitmapData(cam.width, cam.height); 
     var screenShot_image:Bitmap=new Bitmap(screenShot); 
     screenShot.draw(vid) ; 
     ReduceColors.reduceColors(screenShot, 0, true, false); 
     screenShot.colorTransform(new Rectangle(0, 0, screenShot.width, screenShot.height), new ColorTransform(2,2,2,1)); 

     ///// --------- MAY NOT NEED THIS ----------- //////////// 
     for(var i:int = 0; i<screenShot.width; i++) 
     { 
      for(var j:int = 0; j<screenShot.height; j++) 
      { 
       if(screenShot.getPixel(i,j) == 0xffffff) 
       { 
        var transparent:uint = 0x00000000; 
        screenShot.setPixel32(i, j, transparent); 
       } 
      } 
     } 

     myVector = new Vectorize(screenShot_image, 23, 2, 1, 3, 0xFFFFFF); 
     myVector.addEventListener(Vectorize.INIT, traceStatus); 
     myVector.addEventListener(Vectorize.DESPECKLE_START, traceStatus); 
     myVector.addEventListener(Vectorize.DESPECKLE_COMPLETE, traceStatus); 
     myVector.addEventListener(Vectorize.GROUPING_START, traceStatus); 
     myVector.addEventListener(Vectorize.GROUPING_COMPLETE, traceStatus); 
     myVector.addEventListener(Vectorize.EDGING_START, traceStatus); 
     myVector.addEventListener(Vectorize.EDGING_COMPLETE, traceStatus); 

     myVector.addEventListener(Vectorize.DESPECKLE_PROGRESS, traceProgress); 
     myVector.addEventListener(Vectorize.GROUPING_PROGRESS, traceProgress); 
     myVector.addEventListener(Vectorize.EDGING_PROGRESS, traceProgress); 

     myVector.addEventListener(Vectorize.COMPLETE, showVector); 
     myVector.vectorize(); 

     //addChild(screenShot_image); 
     addChild(go); 
     removeChild(vid); 
     cam = null; 
     vid.attachCamera(null); 
     vid = null; 
    } 

    function traceStatus(event:Event):void 
    { 
     trace(event.type); 
    } 
    function traceProgress(event:Event):void 
    { 
     var progress:int = event.target.percentDone * 100; 
     trace(event.type + ": " + progress + "%"); 
    } 
    function showVector(event:Event):void 
    { 
     trace(event.type); 
     addChild(myVector); 
    } 

} 

어떤 제안 : 여기

내 코드?

감사합니다.

가 UPDATE : 혼란을 죄송합니다, 기본적으로 내가 투명 비트 맵을 추적 할 수있는 방법을 좋아하고있는 모양의 점의 배열을 얻을 것 비트 맵 말했다. 픽셀 데이터의 배열이 너무 크면 ... 크기에 관계없이 사각형에 대해 4 포인트를 원합니다 ...

+1

당신은 한 줄로 된 종이의 그림을 벡터화하고 있지만, 그 색 값은 #ffffff 일 가능성이 없습니다. 라이브러리에 허용 오차 설정이 있습니까? – prototypical

+0

나는이 라인을 사용하여 이미지를 흑백으로 변환한다 : 'ReduceColors.reduceColors (screenShot, 0, true, false); screenShot.colorTransform (new Rectangle (0, 0, screenShot.width, screenShot.height), new ColorTransform (2,2,2,1)); –

+0

이 두 줄로 인해 이미지가 검정색과 흰색 ? 시각적으로뿐만 아니라 비트 맵 데이터의 색상 값을 확인 했습니까? – prototypical

답변

0

분명히 BitmapData.getVector()을 찾고 있습니다. Flash Player 10에서 사용할 수 있으므로 자유롭게 사용할 수 있습니다.

편집 : 귀하의 질문을 다시 읽은 후 비트 맵을 벡터로 구문 분석하고 벡터가 픽셀 배열이 아니라 특정 선의 시작과 끝을 원하는 것으로 알고 있습니다. 그렇다면 threshold()을 호출하여 라인의 픽셀이 하나의 색상이되고 다른 픽셀의 배경이 될 수 있다면 getColorBoundsRect()을 호출하고 사각형의 네 모서리를 모두 쿼리 할 수 ​​있습니다. 선의 색을 가진 것들은 시작과 끝 좌표이며, 이것들을 저장합니다.

+0

그러나 사각형 영역 매개 변수를 입력해야합니까? 페이지에서 선이 어디에 있는지 알 수 없으므로 사각형의 위치를 ​​지정할 수 없습니다 ... 매개 변수없이 사용할 수 있고 투명 픽셀을 무시하지 않는 한? –

+0

이것으로 실험하는 것은 의미가없는 거대한 배열의 포인트를 제공하는 것 같습니다. 배열에는 300,000 이상의 숫자가 있습니다. –

+0

음, 사각형을 지정하면 이미지의 어떤 부분을 벡터로 내보낼지를 의미합니다. 그리고 당신은 분명히 시작과 끝을위한 올바른 좌표로 이미지의 라인을 파싱하고 싶습니다 - 이것에 대한 함수가 있는지 확실하지 않습니다. 라인이 직선이면'getColorBoundsRect()'를 호출 할 수 있습니다. 그러면 반대 각도 쌍 중 하나가 시작 및 종료 좌표를 가져옵니다. 그렇지 않으면, 어떻게 든 선을 해석해야합니다. – Vesper