基本信息
源码名称:电脑摄像头实时动态扫描读取二维码
源码大小:14.42M
文件格式:.rar
开发语言:C#
更新时间:2018-05-05
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 3 元×
微信扫码支付:3 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
利用电脑摄像头快速实时扫描读取二维码,简单,速度快,效率高,准确率高。可以快速的用在自已的软件中。
Imports Emgu.CV Imports Emgu.CV.CvEnum Imports Emgu.CV.Util Imports Emgu.CV.Structure Imports ZXing Public Class Form1 Dim _capture As VideoCapture Dim _frame As Mat Dim _proc As Mat Dim _oproc As New Mat Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing RemoveHandler _capture.ImageGrabbed, AddressOf ProcessFrame End End Sub Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load _capture = New VideoCapture() _capture.Start() AddHandler _capture.ImageGrabbed, AddressOf ProcessFrame End Sub Private Sub ProcessFrame(ByVal sender As Object, ByVal e As System.EventArgs) _frame = New Mat _proc = New Mat _oproc = New Mat If _capture IsNot Nothing And _capture.Ptr <> IntPtr.Zero Then _capture.Retrieve(_frame, 0) REM 图形处理 _proc = FilterGraphicsB(_frame) REM 发现二维码并截取 _oproc = FindCodeMat(_frame, _proc) ImageBox1.Image = _frame If _oproc IsNot Nothing AndAlso IsDBNull(_oproc) = False Then REM 触发二维码识别程序 Dim reader As IBarcodeReader = New BarcodeReader() Dim result = reader.Decode(_oproc.Bitmap) If result IsNot Nothing Then If TextBox1.InvokeRequired Then TextBox1.BeginInvoke(New MethodInvoker(Sub() ProcessFrame(sender, e))) Else TextBox1.Text = String.Format("{0} {1}", result.BarcodeFormat.ToString(), " " & result.Text) End If End If End If End If End Sub Private Function FilterGraphicsB(ByVal um As Mat) As Mat Dim nm As New Mat CvInvoke.CvtColor(um, nm, ColorConversion.Bgr2Gray) CvInvoke.EqualizeHist(nm, nm) CvInvoke.GaussianBlur(nm, nm, New System.Drawing.Size(5, 5), 0, 0, BorderType.Default) ' CvInvoke.Sobel(nm, nm, nm.Depth, 1, 0, 3, 1, 0, BorderType.Default) ' CvInvoke.Threshold(nm, nm, 0, 255, ThresholdType.Binary ThresholdType.Otsu) '膨胀 Dim StructingElement As Emgu.CV.Mat = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, New Size(12, 12), New Point(2, 2)) CvInvoke.Dilate(nm, nm, StructingElement, New Point(2, 2), 1, Emgu.CV.CvEnum.BorderType.Default, New Emgu.CV.Structure.MCvScalar(0)) Return nm End Function Private Function FindCodeMat(ByVal srcMat As Mat, ByVal grayMat As Mat) As Mat Dim tmp As Mat = grayMat.Clone Dim sMat As Mat = srcMat '.Clone Dim mrcMat As Mat mrcMat = srcMat.Clone Dim plate As New Mat Dim bkGrayWhite As New Gray(255) Dim contours As Emgu.CV.Util.VectorOfVectorOfPoint = New Emgu.CV.Util.VectorOfVectorOfPoint() Dim hierarchy As Emgu.CV.IOutputArray = New Image(Of Gray, Byte)(tmp.Width, tmp.Height, bkGrayWhite) CvInvoke.FindContours(tmp, contours, hierarchy, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple ) For idx As Integer = 0 To contours.Size - 1 Using contour As VectorOfPoint = contours(idx) Dim c As Double = CvInvoke.ContourArea(contour) If c < 18000 Or c > 25000 Then Continue For End If Dim box As RotatedRect = CvInvoke.MinAreaRect(contour) If box.Angle < -45.0 Then Dim ws As Single = box.Size.Width box.Size.Width = box.Size.Height box.Size.Height = ws 'box.Offset(-5, -5) box.Angle = 90.0F ElseIf box.Angle > 45.0 Then Dim ws As Single = box.Size.Width box.Size.Width = box.Size.Height box.Size.Height = ws 'box.Offset(-5, -5) box.Angle -= 90.0F End If Dim ratio As Single = box.Size.Width / box.Size.Height If ratio > 0.9 And ratio < 1.2 Then Dim rect As Rectangle rect = CvInvoke.BoundingRectangle(contour) CvInvoke.Rectangle(sMat, rect, New Bgr(Color.Red).MCvScalar, 2) Dim srcCorners As PointF() = box.GetVertices() Dim destCorners As PointF() = New PointF() {New PointF(0, box.Size.Height - 1), New PointF(0, 0), New PointF(box.Size.Width - 1, 0), New PointF(box.Size.Width - 1, box.Size.Height - 1)} Using tmp1 As New Mat() Using rot As Mat = CvInvoke.GetAffineTransform(srcCorners, destCorners) CvInvoke.WarpAffine(mrcMat, tmp1, rot, Size.Round(box.Size)) Return tmp1.Clone End Using End Using End If End Using Next 'CvInvoke.Imshow(Now, sMat) End Function Private Sub Label1_Click(sender As System.Object, e As System.EventArgs) Handles Label1.Click System.Diagnostics.Process.Start("http://www.btw360.com:88") End Sub End Class