太神奇了!使用C#实现自动核验健康码:(1)二维码识别
前言
因?yàn)橐咔榈脑?#xff0c;無(wú)論是進(jìn)入商場(chǎng)還是醫(yī)院、車站,都需要出示健康碼。
現(xiàn)在基本都是采取人工方式核驗(yàn)健康碼,看到綠碼就通過(guò),否則就禁止進(jìn)入。
但是,單靠人工核驗(yàn)健康碼容易造成人員擁堵,增加病毒交叉感染的風(fēng)險(xiǎn),其實(shí)完全可以使用計(jì)算機(jī)來(lái)實(shí)現(xiàn)自動(dòng)核驗(yàn)。
原理
如圖所示,健康碼其實(shí)就是個(gè)二維碼,里面存儲(chǔ)了健康碼相關(guān)信息。
因此,只需通過(guò)攝像頭掃描手機(jī)界面,識(shí)別出手機(jī)上的二維碼即可。
實(shí)現(xiàn)
創(chuàng)建一個(gè)WinForm程序,添加下列控件:
button 開(kāi)啟攝像頭
pictureBox 顯示攝像頭圖像
time 定時(shí)識(shí)別攝像頭圖像,頻率設(shè)為100
label 顯示健康碼狀態(tài)
1. 開(kāi)啟攝像頭
添加nuget包AForge.Video.DirectShow,設(shè)置button的Click事件:
VideoCaptureDevice?_camera; private?void?button1_Click(object?sender,?EventArgs?e) {_camera?=?new?VideoCaptureDevice(new?FilterInfoCollection(FilterCategory.VideoInputDevice)[0].MonikerString);_camera.NewFrame?+=?camera_NewFrame;_camera.Start();timer1.Enabled?=?true; }private?void?camera_NewFrame(object?sender,?AForge.Video.NewFrameEventArgs?eventArgs) {//將攝像頭每幀圖像顯示到pictureBoxpictureBox1.Image?=?(Bitmap)eventArgs.Frame.Clone();??????? }2. 識(shí)別二維碼
引用nuget包ZXing.Net,在timer的Tick事件中識(shí)別二維碼:
private?void?timer1_Tick(object?sender,?EventArgs?e) {if?(pictureBox1.Image?!=?null){var?img?=?(Bitmap)pictureBox1.Image.Clone();var?barcodeReader?=?new?BarcodeReader();var?result?=?barcodeReader.Decode(img);if?(result?!=?null){var?healthCode?=?JsonConvert.DeserializeAnonymousType(result.Text,new?{?Color?=?""?});if?(healthCode?!=?null){var?color?=?healthCode.Color;if?(color?==?"green"){label1.Text?=?"綠碼";label1.ForeColor?=?Color.Green;}else?if?(color?==?"red"){label1.Text?=?"紅碼";label1.ForeColor?=?Color.Red;}else?if?(color?==?"yellow"){label1.Text?=?"黃碼";label1.ForeColor?=?Color.Yellow;}else{label1.Text?=?"異常";}}}} }健康碼的內(nèi)容是一個(gè)json字符串,其中Color屬性代表健康碼狀態(tài)。
3. 運(yùn)行效果
運(yùn)行程序,點(diǎn)擊“開(kāi)啟攝像頭”,可以正常識(shí)別:
結(jié)論
健康碼的內(nèi)容不包含時(shí)間,因此下一步還需要把更新時(shí)間從圖片中識(shí)別出來(lái),保證是最新的健康碼。
如果你覺(jué)得這篇文章對(duì)你有所啟發(fā),請(qǐng)關(guān)注我的個(gè)人公眾號(hào)”My IO“,記住我!
總結(jié)
以上是生活随笔為你收集整理的太神奇了!使用C#实现自动核验健康码:(1)二维码识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Miniprofiler在普通net项目
- 下一篇: c# char unsigned_dll