2016年6月22日水曜日

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

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

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

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


●SRC

  1. int laserCom = searchLaser();  
  2. printf(":%d\n",laserCom);  
  3. if(laserCom == 0){  
  4.     //    見つからない  
  5.     return    0;  
  6. }  
  7. laserOpen(laserCom); // 初期化はこの2行  
  8. laserInit();         // 初期化はこの2行  
  9.   
  10. setLineSpeed(500);    //      
  11. setForce(6);        //      
  12.   
  13. aLaserPic    AL;  
  14. AL.setStep(0.10);        //最少STEP(mm)  
  15. AL.setSize(30,0);        //実際の大きさ(mm)  
  16. AL.setOffset(10,10);    //左上座標  
  17. bool b = AL.loadPng("C:/temp/LS01.png");  
  18. int yline = AL.getPicHeight();  
  19. for(int y=0;y<yline;y++){  
  20.     double* dp = 0;  
  21.     int n = AL.getValue(y,&dp);  
  22.     if(!n) continue;  
  23.     double xx = dp[0] - 2.0;  
  24.     double yy = dp[1];  
  25.     moveTo(xx,yy);  
  26.     for(int w=0;w<n;w++){  
  27.         double x1 = dp[w*3+0];  
  28.         double y1 = dp[w*3+1];  
  29.         double x2 = dp[w*3+2];  
  30.         double y2 = dp[w*3+1];  
  31.         moveTo(x1,y1);  
  32.         lineTo(x2,y2);  
  33.     }  
  34. }  
  35. laserClose();  

●元データ



●元データ反転



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




●竹材へ出力




●MDFへ出力

0 件のコメント:

コメントを投稿