|
【 目的 】
パソコンに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;
|