2016年6月22日水曜日

SmartLaser用のアプリを0から開発する。その6【画像をダイレクトにベクタ出力する件】

では、画像をスキャンしてレーザーへ出力してみます。
レーザーはラスタ出力モードとベクタ出力モードがあるようですが、
今回は、画像をわざわざというか、ベクタのラインの集合で出力してみます。
なんかこっちの方がキレイにできそうな気がしたからです。
あと、閉領域の出力のテストを兼ねてってことにもなります。

とりあえず画像はモノクロ2値とし、テストで出力するまでがこんな感じです。
(1)まず最初STEP値を決める。解像度の逆数みたいなもの。
(2)次に解像度に合わせてイメージのビットマップを拡縮をかける
(3)1行ずつ、ビットフィールドを始点-終点に変換した座標のarrayを作成
(4)そのarrayで線の数だけLOOP。
※全て左から右へ移動してレーザー出力するようにしている。

結果としてはまぁまぁです。
始点や終点の【キレ】は、相変わらず甘いです。
キカイで調整できうるところは、別フェーズでやってみますが、
どこかに限界は有りそうな気はしてしまいます^^;


●SRC

    int laserCom = searchLaser();
    printf(":%d\n",laserCom);
    if(laserCom == 0){
        //    見つからない
        return    0;
    }
    laserOpen(laserCom); // 初期化はこの2行
    laserInit();         // 初期化はこの2行

    setLineSpeed(500);    //    
    setForce(6);        //    

    aLaserPic    AL;
    AL.setStep(0.10);        //最少STEP(mm)
    AL.setSize(30,0);        //実際の大きさ(mm)
    AL.setOffset(10,10);    //左上座標
    bool b = AL.loadPng("C:/temp/LS01.png");
    int yline = AL.getPicHeight();
    for(int y=0;y<yline;y++){
        double* dp = 0;
        int n = AL.getValue(y,&dp);
        if(!n) continue;
        double xx = dp[0] - 2.0;
        double yy = dp[1];
        moveTo(xx,yy);
        for(int w=0;w<n;w++){
            double x1 = dp[w*3+0];
            double y1 = dp[w*3+1];
            double x2 = dp[w*3+2];
            double y2 = dp[w*3+1];
            moveTo(x1,y1);
            lineTo(x2,y2);
        }
    }
    laserClose();

●元データ



●元データ反転



●元データをスキャン(数値をファイル化してexcelで表示)




●竹材へ出力




●MDFへ出力

0 件のコメント:

コメントを投稿