Python プログラミング例 | バーコード画像認識

 ※この一連のツイートでは、Python はバージョン 3.10 以降、NumPy はバージョン 1.22.3 以降、Matplotlib はバージョン 3.5.1 以降、Pandas はバージョン 1.4.2 以降を使用することを推奨します。Python バージョン 3.10 以降、標準リリース バージョンに付属する IDLE インタラクティブ環境の入力プロンプト >>> は左側に単独で配置され、入力ステートメントと一緒にコピーすることはできません。インタラクティブ環境におけるインスタンスの入力と出力を明確に区別するために、この一連のツイートでは、各入力ステートメントの先頭に入力プロンプト >>> がまだ残されています。

01.応用例の背景

友人はタオバオストアをオープンし、毎日たくさんの速達を発送し、それを記録するために写真を撮ったので、速達注文の写真がたくさんありました。図に示すように、画像を 1 つずつ開き、バーコード番号を抽出して Excel に保存し、画像の名前を「バーコード番号.jpg」に変更して保存するという、毎晩の繰り返し作業があります。 1.

■ 図 1 速達注文のバーコード識別

この友人のビジネスはますます良くなっているため、仕事量はますます大きくなっています (毎日、何百枚もの写真を識別する必要があるかもしれません)。彼は、バーコードを自動的に認識してファイル名を変更できるアプリケーションを開発したいと考えています。

写真はすべてjpg形式ですが、特急の注文はさまざまな運送会社から来ているため、いろいろと奇妙に見えます。写真を撮る人も違うので、きれいに撮れないこともあります。唯一確かなことは、すべての写真にバーコードがあり、鮮明度が高いということです。

02.バーコード認識プログラム

このアプリケーションの難点はバーコード認識にあり、これをゼロから開発すると工数が膨大になってしまいます。バーコードと QR コードを認識できるオープンソース ソフトウェア zbar (http://zbar.sourceforge.net/、もちろん他のソフトウェアを選択することもできます) を見つけました。ダウンロードしてインストールした後、コマンド ラインを開いてソフトウェア インストール ディレクトリの bin に zbarimg -h と入力すると、次の結果が得られます。

C: work Python barcodes ZBar bin>zbarimg -h
usage: zbarimgoptions] <image >...
scan and decode bar codes from one or more image files
options:
h--help  display this help text
--version  display version information and exit
-q,-- quiet   minimal output,only print decoded symbol data
-V,--verbose   increase debug output level
-- verbose=N    set specific debug output level
-d,-- display  enable display of following images to the screen
-D,--nodisplay disable display of following images (default)
--xml,--nodisplay enable/disable XML output format-- noxm]
-- raw  output decoded symbol data without symbology prefix
--S  < CONFIG>=< VALUE >], 
-set < CONFIG>=< VALUE >],
set  decoder/scanner < CONFIG> to < VALUE> (or 1)

 これは、インストールが成功したことを意味します。図 2 に示すように、携帯電話を使用して本の ISBN バーコードの写真を撮り、isbn.jpg として保存します。

■ 図2 ISBNバーコードの画像

オペレーティング システムのコマンド ライン ウィンドウで次のコードを実行して、図 2 に示すバーコードに対応する ISBN 番号を正常に識別します。

EAN-13:9780521865715
C: work Python barcodes ZBar bin>zbarimg isbn.jpg
scanned 1 barcode symbols from 1 images

特定された主要な問題が解決された後、GUI インターフェイスを作成し、zbar を呼び出すことで問題を解決できます。

03.インターフェースデザイン

予備的な作業の準備が完了したら、ソフトウェアの設計とコーディングを形式化します。GUI を構想するには、次の要件があります。

(1) 識別する画像を選択するための「開く」ボタンと、「データのエクスポート」ボタンがあります。

(2) データ表示画面を表形式で表示することができます。

(3) エラー フィードバック、認識できない情報などのデバッグ データを出力するために使用される複数行のテキスト ボックス。

wxFormBuilderを使用してGUIを設計します。図 3 に示す GUI 設計インターフェイスで、まずフレーム ウィンドウを作成します。垂直の BoxSizer を追加し、ToolBar ツールバーと 1 行 2 列の GridSizer を追加します。ToolBar ツールバーで、2 つのツール ボタンを追加し、適切なアイコンを選択します (ソースはアート プロバイダーからロードを選択し、ID は wxART_FILE_OPEN と wxART_FILE_SAVE を選択します)。データを表示するにはインターフェイスの左下部分に DataViewListCtrl を追加し、デバッグ情報を出力するには右下部分に TextCtrl を追加します。ソフトウェアの実行結果を図 4 に示します。

 ■ 図 3 設計ソフトウェアのインターフェース

 ■ 図4 ソフトウェア実行結果

04.完全なコード

プログラムは barcodes.py ファイルに保存され、コード全体は次のとおりです。

#-*- coding:utf-8 -*
import wx
import wx.xrc
import wx.dataview
import os
import csv
from datetime import datetime
class MyFramel (wx.Frame):
definit (self,parent) :
wx.Frame.__init__(self,parent,id= wx.ID_ANY,title= u"条形码识别程序"pos = wx.DefaultPosition,size = wx.Size866,302)style = WX.DEFAULT FRAME STYLEWX.TAB TRAVERSAL)self.SetSizeHints(wx.DefaultSize,wx.DefaultSize)bSizer5 = wx.BoxSizer(wx.VERTICAL)self.m toolBar2 = wx,ToolBar(self,WX.ID ANY,wx,DefaultPosition,wx.DefaultSize,wX.TB HORIZONTAL)self.m_open = self.m toolBar2.AddTool(wx.ID ANY,u"打开”
wx.ArtProvider.GetBitmap(wx.ART FILE OPEN
WX.ART TOOLBAR),wx.NullBitmap,wX.ITEM NORMAL,
wx.EmptyString,wx.EmptyString,None)
self.m_export = self.m toolBar2.AddTool(wx.ID ANY,u"导出”wX.ArtProvider.GetBitmap(wx.ART FILE SAVEWX.ART TOOLBAR),wX.NullBitmap,wX.ITEM NORMALwx.EmptyString,wx.EmptyString,None)self.m toolBar2.Realize()bSizer5.Add(self.m toolBar2,0,WX.EXPAND,5)gSizer1 = wx.GridSizer(1,2,0,0)self.m dvc = wx.dataview.DataViewListCtrl(self,wx.ID ANY
wx.DefaultPosition,wx.DefaultSize,
wx.dataview.DV MULTIPLE wx.dataview.DV ROW LINES)
qSizer1.Add(self.m dvc,0,wx.EXPAND,5)self.m out = wx.TextCtrl(self,wX.ID ANY,wx.EmptyString,
wx.DefaultPosition,wx.DefaultSize,
WX.TE MULTILINE)
0,WX.EXPAND,5)gSizer1.Add(self.m out,bSizer5.Add(gSizer1,1,WX.EXPAND,5)
self.SetSizer(bSizer5)
self.Layout(
self.Centre(wx.BOTH)
# Connect Events
self.Bind(wx.EVT_TOOL,self.openimgs,id = self.m open.GetId())self.Bind(wx.EVT TOOL,self.export2csv,id= self.m export.GetId())#Mycode
self.m dvc.AppendTextColumn(u'日期
self.m dvc.AppendTextColumn(u'条形码',width = 120)self.m_dvc.AppendTextColumn(u'文件地址 width = 400)
del (self):def
pass
#Virtual event handlersdef openimgs(self,event)dlg = wx.FileDialog(
self,message =“Choose some images"
defaultDir = os.getcwd()
defaultFile =n
wildcard=wildcard
style = Wx.FD OPENWX.FD MULTIPLE WX.FD CHANGE DIR
if dlq.ShowModal() == wx.ID OK:
self.m out.WriteText( Recognizing!n')paths = dlg.GetPaths()
for path in paths:
tmp = os.popen%s -- raw %s'%(cmd,path)).readlines()barN
while barNum == and i< len(tmp)barNum = tmp[i].strip()
i +=1
if barNum == .
self.m out.WriteText('% s recognize fails! n'% path)continuenewname ='%sss' (os.path.dirname(path),barNum,os.path.splitext(path)[ -1:][0])
try:
os.rename(path,newname)item = [datetime.now().strftime('%Y-%m-%d'),s” barNum,newname]self.m dvc.AppendItem( item)
csvdata.append( item)
self.m out.WriteText( %s Recognize Done! n'% barNumexcept Exception as e:self.m out.WriteText(  %s rename fails! n' path)self.m out.WriteText(str(e))
dlg.Destroy()
def export2csv(self,event):
dlg = wx.FileDialog(self,message ="Save file as ...",defaultDir = os.getcwd()defaultFile=wildcard = wildcard2,style = wx.FD SAVE
dlg.SetFilterIndex(2)
if dlg.ShowModal() == wX.ID OK:
self.m out.WriteText(Exporting! n')path = dlg.GetPath()
try:with open(path,w',newline =) as csvfile:writer = csv.writer(csvfile,dialect =excel',quoting = csV.OUOTE ALL)for row in csvdata:writer.writerow(row)
self.m out.WriteText( s Export Done! n' path)except Exception as e:
self.m out.WriteText(str(e))
dlg.Destroy()
wildcard = "Pictures ( *.jpg,*.png)*.jpg;*.png All files (*.*)*.*"
wildcard2 ="CSV files (*.csv) *.csv"
cmd = os.path.realpath('Zbar/bin/zbarimq.exe')
csvdata = []
app= wX.App()
win = MyFramel(None)
win.Show()
app.MainLoop()

注: 上記のコードの一部の行は長すぎるため、行番号を示すためにコードの先頭に数字が追加されています。

予防:

(1) zbar ソフトウェアは上記プログラムの現在のディレクトリにインストールされ、Zbar\bin\zbarimg.exe を通じて実行できます。

(2) ディレクトリ内に漢字が含まれる場合、エラーが発生する場合があります。

(3) FileDialogでファイルを開くとカレントディレクトリが変更されるため、最初にzbarコマンドの絶対パスを保存しておく必要があります。

(4) バーコードには0から始まる数字があり、Excelで開くと自動的に省略されるため、数字の前に「'」記号が付加されます。

Acho que você gosta

Origin blog.csdn.net/qq_41640218/article/details/132754477
Recomendado
Clasificación