バーコード ダウンロード

 

【 目的 】

パソコンにUSB(Web)カメラをつけて、バーコードをよむプログラム

認識がいま一つで悩んでいます。

 

 

【 使い方 と おかしな点 】

 パソコンにUSBカメラを接続します。
 ここからセットアッププログラムをダウンロード
して頂き解凍してインストールします。

 実行ボタンを押します。
 画面が逆さまになっていると思われますので、USBカメラの設定ボタンを押して頂き設定をお願いします。今後なおすつもりです。すみません。

 そんでもって左上のカラー画面の青色の線付近にバーコードがくるようにします。
 うまくいけばバーコードの数字がでできますが
 
 んーなんでだろ

 ちなみにカメラの露出はAutoを解除しています。

 

 

【動作確認 開発環境】

 WindowsVISTA
 Visual Studio 2003、2005がインストールされている。
 CPU 3GHZ
 メモリ 2MB
 DirectShowは・・・。

 で大雑把なコード(Visual Syudio C++2005)は以下のような感じです。ただ共通言語ランタイムサポートは「共通言語ランタイムサポート、古い構文(/clr:oldSyantax)」にしています。


 
//輝度の計算
ycc=*(Work_pBuffer+2)*0.2999
  +*(Work_pBuffer+1)*0.587
  +*Work_pBuffer*0.144;
//二値化
if(ycc>trackBar1->Value){
  ycc=255.0;
}else{
  ycc=0;
}

if(y==120){
  //左隣の画素と同じかを確認して同じなら個数を増やす。
  //例
  //■■□■□□□■
  //bar[]={2,1,1,3,1}
  if(ycc==before_ycc){
    bar[i_bar]++;
  }else{
    heikin=heikin+bar[i_bar];
    //連続した画素の個数別の出現数の配列
    //例
    //■■□■□□□■
    //counter[]={0,3,1,1}
    counter[bar[i_bar]]++;
//                  fprintf(fo,"%d,",bar[i_bar]);
    i_bar++;
    max_counter++;
  }
}
if(y==121 && x==0){
  heikin=heikin/max_counter;
  for(int i=0;i<320;i++){
    if(i<=max_counter){
      hyojyunhensa=hyojyunhensa+pow((heikin-bar[i]),2.0);
    }
    if(counter[i]>counter[max]) max=i;
  }
  hyojyunhensa=sqrt(hyojyunhensa/max_counter);
  int session=0;
  int bar_nagasa=0;
 
  gun_counter=0;       

  for(int max_i=1;max_i<=max_counter;max_i++){
    if(bar[max_i]<=(hyojyunhensa+heikin)){
      if(max==0) max=10;
      double syosudaiiti=(double)bar[max_i]/(double)max-bar[max_i]/max;
      if(syosudaiiti>=0.5)
      {
        bar_nagasa=bar[max_i]/max+1;
      }else{
        bar_nagasa=bar[max_i]/max;
      }
     
      //標準ガードパターン 3 3
      if(gun_counter>=0 && gun_counter<3){
        if((gun_counter%2)==0){
          for(int i=0;i<bar_nagasa;i++){
            code[0] <<=1;
            code[0] |=1;
          }
        }else{
          for(int i=0;i<bar_nagasa;i++){
            code[0] <<=1;
          }
        }
      }

      //数字セットAB 42 24
      if(gun_counter>=3 && gun_counter<27){
        if((gun_counter%2)==0){
          for(int i=0;i<bar_nagasa;i++){
            code[(gun_counter+1)/4] <<=1;
            code[(gun_counter+1)/4] |=1;
          }
        }else{
          for(int i=0;i<bar_nagasa;i++){
            code[(gun_counter+1)/4] <<=1;
          }
        }
      }
     
〜〜〜  省略  〜〜〜
         
for(int i=1;i<7;i++){
  switch(code[i]){
    case 13:
      seto_code <<=1;
      left_barcodeno=left_barcodeno*10+0;
      break;
    case 25:
      seto_code <<=1;
      left_barcodeno=left_barcodeno*10+1;
      break;