二维码图像识别问题

正在做一个二维码识别项目,如果是导入图片可以正常识别,但是用摄像头识别,就会产生图像变形,颜色变化。请教高手,对于二维码识别,这些问题该如何解决?

回答: 二维码图像识别问题

  1. 旋转之后进行投影分割,再识别

opencv二维码检测定位不用识别

  1. Q
    opencv二维码检测定位不用识别

    原始图片类似上图
    要求:
    1、用hough变化定位出二维码的位置
    2、对二维码进行几何校正
    3、开发工具VS2010控制台程序+OpenCV2.4.3或以上
    最后的结果类似下图:
    opencv二维码检测定位不用识别

    求各位大神给个思路或者有偿编写也行,很简单的一个程序,实在不行做到要求1就行,急~
  2. A
    现在让我们开始写点代码,新建一个文件,命名为detect_barcode.py,打开并编码:
    1# import the necessary packages
    2importnumpy as np
    3importargparse
    4importcv2
    5
    6# construct the argument parse and parse the arguments
    7ap =argparse.ArgumentParser()
    8ap.add_argument("-i", "--image", required =True, help="path to the image file")
    9args =vars(ap.parse_args())
    我们首先做的是导入所需的软件包,我们将使用NumPy做数值计算,argparse用来解析命令行参数,cv2是OpenCV的绑定。
    然后我们设置命令行参数,我们这里需要一个简单的选择,–image是指包含条形码的待检测图像文件的路径。
    现在开始真正的图像处理:
    11# load the image and convert it to grayscale
    12image =cv2.imread(args["image"])
    13gray =cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    14
    15# compute the Scharr gradient magnitude representation of the images
    16# in both the x and y direction
    17gradX =cv2.Sobel(gray, ddepth =cv2.cv.CV_32F, dx =1, dy =0, ksize =-1)
    18gradY =cv2.Sobel(gray, ddepth =cv2.cv.CV_32F, dx =0, dy =1, ksize =-1)
    19
    20# subtract the y-gradient from the x-gradient
    21gradient =cv2.subtract(gradX, gradY)
    22gradient =cv2.convertScaleAbs(gradient)
    12~13行:从磁盘载入图像并转换为灰度图。
    17~18行:使用Scharr操作(指定使用ksize = -1)构造灰度图在水平和竖直方向上的梯度幅值表示。
    21~22行:Scharr操作之后,我们从x-gradient中减去y-gradient,通过这一步减法操作,最终得到包含高水平梯度和低竖直梯度的图像区域。
    上面的gradient表示的原始图像看起来是这样的:
    注意条形码区域是怎样通过梯度操作检测出来的。下一步将通过去噪仅关注条形码区域。
    24# blur and threshold the image
    25blurred =cv2.blur(gradient, (9, 9))
    26(_, thresh) =cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)
    25行:我们要做的第一件事是使用9*9的内核对梯度图进行平均模糊,这将有助于平滑梯度表征的图形中的高频噪声。
    26行:然后我们将模糊化后的图形进行二值化,梯度图中任何小于等于255的像素设为0(黑色),其余设为255(白色)。
    模糊并二值化后的输出看起来是这个样子:
    然而,如你所见,在上面的二值化图像中,条形码的竖杠之间存在缝隙,为了消除这些缝隙,并使我们的算法更容易检测到条形码中的“斑点”状区域,我们需要进行一些基本的形态学操作:
    28# construct a closing kernel and apply it to the thresholded image
    29kernel =cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
    30closed =cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
    29行:我们首先使用cv2.getStructuringElement构造一个长方形内核。这个内核的宽度大于长度,因此我们可以消除条形码中垂直条之间的缝隙。
    30行:这里进行形态学操作,将上一步得到的内核应用到我们的二值图中,以此来消除竖杠间的缝隙。
    现在,你可以看到这些缝隙相比上面的二值化图像基本已经消除:
    当然,现在图像中还有一些小斑点,不属于真正条形码的一部分,但是可能影响我们的轮廓检测。
    让我们来消除这些小斑点:
    32# perform a series of erosions and dilations
    33closed =cv2.erode(closed, None, iterations =4)
    34closed =cv2.dilate(closed, None, iterations =4)
    我们这里所做的是首先进行4次腐蚀(erosion),然后进行4次膨胀(dilation)。腐蚀操作将会腐蚀图像中白色像素,以此来消除小斑点,而膨胀操作将使剩余的白色像素扩张并重新增长回去。
    如果小斑点在腐蚀操作中被移除,那么在膨胀操作中就不会再出现。
    经过我们这一系列的腐蚀和膨胀操作,可以看到我们已经成功地移除小斑点并得到条形码区域。
    最后,让我们找到图像中条形码的轮廓:
    36# find the contours in the thresholded image, then sort the contours
    37# by their area, keeping only the largest one
    38(cnts, _) =cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,
    39  cv2.CHAIN_APPROX_SIMPLE)
    40c =sorted(cnts, key =cv2.contourArea, reverse =True)[0]
    41
    42# compute the rotated bounding box of the largest contour
    43rect =cv2.minAreaRect(c)
    44box =np.int0(cv2.cv.BoxPoints(rect))
    45
    46# draw a bounding box arounded the detected barcode and display the
    47# image
    48cv2.drawContours(image, [box], -1, (0, 255, 0), 3)
    49cv2.imshow("Image", image)
    50cv2.waitKey(0)
    38~40行:幸运的是这一部分比较容易,我们简单地找到图像中的最大轮廓,如果我们正确完成了图像处理步骤,这里应该对应于条形码区域。
    43~44行:然后我们为最大轮廓确定最小边框
    48~50行:最后显示检测到的条形码
    正如你在下面的图片中所见,我们已经成功检测到了条形码:

WPF调用摄像头扫描二维码

  1. Q
        在WPF平台
       用WPFMediaKit控件调用摄像头扫描二维码,用ZXing的类库去解析,但是一直解析不出来,请高手帮忙!

        private RenderTargetBitmap bmp;
            private BitmapEncoder encoder;
            private MultiFormatReader reader;
           if (bmp == null)
                {
                    bmp = new RenderTargetBitmap( (int)m_VideoCaptureElement.ActualWidth,
                    (int)m_VideoCaptureElement.ActualHeight, 96, 96, PixelFormats.Pbgra32);
                    bmp.Render(m_VideoCaptureElement);
                }
                if (encoder == null)
                {
                    encoder = new JpegBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(bmp));
                }
                MemoryStream stream = new MemoryStream();
                stream.Seek(0, SeekOrigin.Begin);
                encoder.Save(stream);      
                if (source == null)
                {
                    source = new RGBLuminanceSource(stream.ToArray(), 15, 15, RGBLuminanceSource.BitmapFormat.BGR24);
                }
                BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
                reader = new MultiFormatReader();
                if (bitmap.BlackMatrix != null)
                {
                    Result result = reader.decode(bitmap);
                     MessageBox.Show(result.Text);
                }
  2. A
      MemoryStream stream = new MemoryStream();
                 stream.Seek(0, SeekOrigin.Begin);
                 encoder.Save(stream);      
    这句后边加上
    stream.Position=0;
    试试看

二维码扫描

  1. Q
    制作一个二维码,
    当用户在扫描这个二维码 的时候会显示关注公众号;
    然后:服务器会接收到一些二维码里面的数据,
    根据数据给关注者发送不同的消息

    这个功能可以实现吗?
  2. A
    文档

wp7 二维码(用的zxing )提供的C#接口 问题:无法解析中文 ?

  1. Q


    var result = _reader.decode(binBitmap);  这段代码, 相信看过wp7利用zxing接口的朋友都很熟悉,但是他有个问题就是无法识别中文 ,  
    我看java里实现是这样的 


                Hashtable<Object, Object> hints = new Hashtable<Object, Object>(); 
                        hints.put(DecodeHintType.CHARACTER_SET, "GBK"); 

                        result = new MultiFormatReader().decode(bitmap, hints);


    但是c#的zxing接口里的DecodeHintType却没有.CHARACTER_SET属性 不知道有没有实现 wp7 二维码扫描能扫描中文的?  求教 很急 谢谢!

    利用Zxing提供的C#接口创建wp7二维码地址:
    http://www.hugwp.com/forum.php?mod=viewthread&tid=1318&reltid=1442&pre_pos=6&ext= 
  2. A
    怎么木有人回答呀?


    给你两个连接吧,一个是关于利用Google API生成二维码的文章,另一个是WindowsPhone中扫描QR二维码的文章。
    http://www.danbaise.com/137.html
    http://www.hugwp.com/forum.php?mod=viewthread&tid=1318&reltid=1442&pre_pos=6&ext=

    希望对你有帮助。

谁能给一份二维码带logo的源码?我想学习参考一下

  1. Q
    注意哦,是那种带LOGO的二维码的源码,ASP.NET

    谢谢大家了,网上的好像基本都是不带logo的,发现新的带logo的二维码很个性,想在自己的网站上使用。

    谢谢大家了,或者给一些相关资料也行
  2. A
    只要不是大面积修改,能够正确识别出来

php生成背景图的微信二维码

  1. Q
    微信生成三维码,我自己会。

    但是如何生成在一个带背景图的二维码呢?
  2. A
    使用 gd的 imagecopy($dest_img, $water_img, $posX, $posY, 0, 0, $w, $h);  方法,把logo叠在上面就可以了。

    参考水印那里:http://blog.csdn.net/fdipzone/article/details/9316385

asp 如何生成二维码,!

  1. Q
    asp 如何生成二维码,
    小弟在线等  把分全给了  急~!
  2. A
    先做一个二维码,再把你要连接的地址接进去就好了。

HTML5手机网页上实现二维码扫描的功能(不是安卓APP程序开发,是网站web程序)

  1. Q
    HTML5手机网页上实现二维码扫描的功能(不是安卓APP程序开发,是网站web程序)?
  2. A
    可以使用phonegap开发框架,我们已经实现了

    barcodescanner.scan(
                function(result) {
                 //第一个|之前为id
                 var t = result.text;
                 console.log(t);
                },
                function(error) {}
    );

VB中生成如下彩色二维码有什么好的方法?

  1. Q
    vb纯代码生成二维码的方法我已经找到了,下载地址:


    想将生成的二维码二次处理变成彩色的,比如传入参数"红绿蓝紫色"的色值,就上下左右修改为:
    VB中生成如下彩色二维码有什么好的方法?


    我想的方法是分成4块,然后以位图方式,一个个点设置颜色值,不过这样貌似会很慢很慢。请教下有什么好的办法。
  2. A
    你的二维码 300x300,我剪了 308*308 的黑白图作为 Mono.jpg。
    VB中生成如下彩色二维码有什么好的方法?

    VERSION 5.00
    Begin VB.Form frmQRCode 
       Caption         =   "QRCode"
       ClientHeight    =   5520
       ClientLeft      =   60
       ClientTop       =   510
       ClientWidth     =   9675
       BeginProperty Font 
          Name            =   "Fixedsys"
          Size            =   12
          Charset         =   134
          Weight          =   400
          Underline       =   0   'False
          Italic          =   0   'False
          Strikethrough   =   0   'False
       EndProperty
       LinkTopic       =   "Form1"
       ScaleHeight     =   368
       ScaleMode       =   3  'Pixel
       ScaleWidth      =   645
       StartUpPosition =   3  'Windows Default
       Begin VB.CommandButton cmdColor 
          Caption         =   "Color"
          Height          =   495
          Left            =   4200
          TabIndex        =   2
          Top             =   4920
          Width           =   1215
       End
       Begin VB.PictureBox picColor 
          Appearance      =   0  'Flat
          BackColor       =   &H80000005&
          BorderStyle     =   0  'None
          ForeColor       =   &H80000008&
          Height          =   4620
          Left            =   4920
          ScaleHeight     =   4620
          ScaleWidth      =   4620
          TabIndex        =   1
          Top             =   120
          Width           =   4620
       End
       Begin VB.PictureBox picMono 
          Appearance      =   0  'Flat
          BackColor       =   &H80000005&
          BorderStyle     =   0  'None
          ForeColor       =   &H80000008&
          Height          =   4620
          Left            =   120
          ScaleHeight     =   4620
          ScaleWidth      =   4620
          TabIndex        =   0
          Top             =   120
          Width           =   4620
       End
    End
    Attribute VB_Name = "frmQRCode"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = True
    Attribute VB_Exposed = False
    Option Explicit

    Private Sub cmdColor_Click()
        picColor.Cls
        picColor.Line (4, 4)-(154, 154), vbRed, BF
        picColor.Line (154, 4)-(304, 154), vbGreen, BF
        picColor.Line (4, 154)-(154, 304), vbBlue, BF
        picColor.Line (154, 154)-(304, 304), vbMagenta, BF
        picColor.PaintPicture picMono.Image, 0, 0, , , , , , , vbSrcPaint
    End Sub

    Private Sub Form_Load()
        Dim pic As StdPicture
        Set pic = LoadPicture(App.Path & "\Mono.jpg")
        
        picMono.AutoRedraw = True
        picMono.PaintPicture pic, 0, 0
        
        picColor.AutoRedraw = True
        picColor.ScaleMode = vbPixels
    End Sub