精华内容
下载资源
问答
  • Zxing提高二维码图片识别成功率

    千次阅读 2020-01-07 16:12:54
    因为要用到二维码解析,所以就使用了zxing的图片进行识别,开始时图片大小随意传输,有手机拍照图片,有手机截图图片,还有电脑截图图片,各种大小不一致,就导致zxing的识别率特别低。 后续想到了图片处理,测试了...

    因为要用到二维码解析,所以就使用了zxing的图片进行识别,开始时图片大小随意传输,有手机拍照图片,有手机截图图片,还有电脑截图图片,各种大小不一致,就导致zxing的识别率特别低。

    后续想到了图片处理,测试了一些,目前使用512px的识别成功率比较高,目前程序识别成功率大概在95%以上。

    下面上干货吧!

    //图片像素按比例缩放
    Image imagePic = Image.FromStream(stream);
    Bitmap bmp = imagePic as Bitmap;
    if (imagePic.Width > 512)
    {
    int zoomMultiple = imagePic.Width / 512;
    int toWidth = 512;
    int toHeight = imagePic.Height / zoomMultiple;
    bmp = new Bitmap(toWidth, toHeight);
    using (Graphics g = Graphics.FromImage(bmp))
    {
    	g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
    	g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    	g.Clear(Color.Transparent);
    	g.DrawImage(imagePic,
    				new Rectangle(0, 0, toWidth, toHeight),
    				new Rectangle(0, 0, imagePic.Width, imagePic.Height),
    				GraphicsUnit.Pixel);
    	imagePic.Dispose();
    }

    图片设置好之后进行识别就可以了

    //第一种识别方式Zxing
    var codes = new BarcodeReader
    {
    	AutoRotate = true,
    	TryInverted = true,
    	Options = new DecodingOptions
    	{
    		TryHarder = true
    	}
    }.DecodeMultiple(bmp);
    if (codes != null)
    {
    	result.DataView = codes[0].Text;
    	result.Code = Enum.ResultCode.DealSuccess;
    	result.Message = "识别成功";
    	return ReturnResp(result);
    }
    //第二种识别方式ZBar
    using (ZBar.ImageScanner scanner = new ZBar.ImageScanner())
    {
    	var symbols = scanner.Scan(bmp);
    	if (symbols.Count > 0 && symbols[0].Data.Length > 8)
    	{
    		result.DataView = symbols[0].Data;
    		result.Code = Enum.ResultCode.DealSuccess;
    		result.Message = "识别成功";
    		return ReturnResp(result);
    	}
    }
    //第三种识别方式Zxing
    MultiFormatReader reader = new MultiFormatReader();
    Dictionary<DecodeHintType, object> dictionary = new Dictionary<DecodeHintType, object> { { DecodeHintType.CHARACTER_SET, "UTF-8" } };
    RGBLuminanceSource source = new RGBLuminanceSource(QrCode.Bitmap2Rgb(bmp), bmp.Width, bmp.Height);
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
    Result resultVerify = reader.decode(bitmap, dictionary);
    if (resultVerify != null)
    {
    	result.DataView = resultVerify.Text;
    	result.Code = Enum.ResultCode.DealSuccess;
    	result.Message = "识别成功";
    	return ReturnResp(result);
    }
    string thoughtWorksResult = "";
    //第四种识别方式thoughtWorks
    try
    {
    	QRCodeDecoder decoder = new QRCodeDecoder();
    	thoughtWorksResult = decoder.decode(new ThoughtWorks.QRCode.Codec.Data.QRCodeBitmapImage(bmp));
    }
    catch (Exception)
    {
    }
    if (!string.IsNullOrEmpty(thoughtWorksResult))
    {
    	result.DataView = thoughtWorksResult;
    	result.Code = Enum.ResultCode.DealSuccess;
    	result.Message = "识别成功";
    	return ReturnResp(result);
    }
    else
    {
    	result.Code = Enum.ResultCode.DealFail;
    	result.Message = "识别失败";
    }

    好了识别目前还没想到更好的提高成功率的方法,找到再进行更新吧。

    展开全文
  • 一、权限 调取 H5+ 扫描和识别本地图片信息需要权限。 "permissions": { "Camera": {}, ...二维码扫描识别 三、实现demo <!doctype html> <html> <head> <me...

    一、权限

    调取 H5+ 扫描和识别本地图片信息需要权限。

    "permissions": {
    	"Camera": {},
    	"Gallery": {
    		"description": "系统相册"
    	},
    }
    

    在这里插入图片描述

    二、参考资料和api

    识别本地图片
    二维码扫描识别以及闪关灯操作

    三、实现demo

    <!doctype html>
    <html>
    
    	<head>
    		<meta charset="UTF-8">
    		<title></title>
    		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    		<link href="../css/mui.min.css" rel="stylesheet" />
    		<style type="text/css">
    			.mask {
    				width: 100%;
    				height: 100%;
    				background: #000000;
    			}
    			
    			.tools {
    				/*相对浏览器定位*/
    				position: fixed;
    				left: 0;
    				right: 0;
    				bottom: 0;
    				height: 44px;
    			}
    			
    			.fbt {
    				color: #0E76E1;
    				width: 100%;
    				background-color: #ffffff;
    				line-height: 44px;
    				text-align: center;
    			}
    		</style>
    	</head>
    
    	<body>
    		<header class="mui-bar mui-bar-nav">
    			<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
    			<h1 class="mui-title">开放设备扫码</h1>
    			<span class="mui-pull-right" style="margin-top: 10px;" id="scan2"><img src="../images/qr/scanoff.png" /></span>
    		</header>
    		<div class="mui-content">
    			<div class="mask" id="mask"></div>
    			<div class="mui-bar mui-bar-footer tools" style="padding: 0px;">
    				<div class="fbt" id="scanFromPicture">从相册选择二维码</div>
    			</div>
    		</div>
    		<script src="../js/mui.min.js"></script>
    		<script src="../js/apps.js" type="text/javascript" charset="utf-8"></script>
    		<script src="../js/jquery-1.11.0.js" type="text/javascript" charset="utf-8"></script>
    		<script type="text/javascript">
    
    			mui.init();
    			var scan;
    			if(window.plus) {
    				console.log("window.plus");
    				plusready();
    			} else {
    				document.addEventListener('plusready', plusready, false);
    				console.log("addEventListener")
    			}
    
    			function plusready() {
    
    				//必须添加下列计算代码   不然  本地相册选择会被覆盖
    				var height = window.innerHeight; //获取页面实际高度  
    				var width = window.innerWidth + 'px';
    				//减去一个顶部  一个底部的高度
    				var realHeight = height - 44 - 44;
    				realHeight = realHeight + "px";
    				document.getElementById("mask").style.height = realHeight;
    				document.getElementById("mask").style.width = width;
    
    				//console.log(plus.webview.currentWebview().parent())
    
    				//添加延迟的原因在于  页面加载完全后  创建扫描框和   扫描框等布局   不加延迟   布局会乱
    				setTimeout(function() {
    					//扫描线和扫描框颜色的修改
    					var styles = {
    						"frameColor": "#cccccc",
    						"scanbarColor": "#cccccc"
    					};
    					scan = new plus.barcode.Barcode('mask', [], styles);
    
    					scan.onmarked = onmarked;
    					scan.onerror = onerror;
    					scan.start();
    				}, 500);
    
    				//从图片中识别二维码  点击监听
    				document.getElementById("scanFromPicture").addEventListener("tap", function() {
    					console.log("点击监听");
    					//调取相册  h5+ 代码  获取单个图片的本地图片地址
    					plus.gallery.pick(function(path) {
    						console.log("success -- path = " + path);
    						plus.barcode.scan(path, onmarked, onerror);
    					}, function(err) {
    						mui.alert("Failed: " + err.message, "温馨提示", "确定", function() {}, "div");
    					});
    				})
    
    				//处理返回事件
    				plus.key.addEventListener('backbutton', function() {
    					plus.nativeUI.closeWaiting();
    					plus.webview.currentWebview().close();
    				})
    
    				//闪光灯  图片点击事件
    				document.querySelector('#scan2 img').addEventListener('tap', function() {
    					if(/scanoff.png/.test(this.src)) {
    						this.src = "../images/qr/scanon.png";
    						//开启闪光灯
    						scan.setFlash(true);
    					} else {
    						this.src = "../images/qr/scanoff.png";
    						//关闭闪光灯
    						scan.setFlash(false);
    					}
    				})
    			}
    
    			/**
    			 * 扫描成功回调
    			 * @param {Object} type  识别到的条码类型
    			 * @param {Object} result  识别到的条码中的数据
    			 * @param {Object} file  识别到条码图片文件路径
    			 */
    			function onmarked(type, result, file) { //回调
    				if(result) {
    					//alert(result);
    					//退出扫描操作
    					scan.close();
    					//将扫描到的md5值发送服务器进行解析   
    					plus.nativeUI.showWaiting('请求服务器校验结果中...');
    					console.log("[" + result + "]");
    					//请求服务器什么的.....
    				}
    			}
    
    			//扫描失败回调
    			function onerror(error) {
    				var code = error.code; // 错误编码
    				var message = error.message; // 错误描述信息
    
    				console.log("错误码:" + code + "  错误信息:" + message);
    			}
    
    			
    		</script>
    	</body>
    
    </html>
    
    
    展开全文
  • 最近在做二维码扫描的时候用的是zxing但是在进行本地相册二维码识别的时候返回的结果一直是null 开始直接放的是图片地址后面网上搜了一下说的是图片太小要放大 public static Bitmap getSmallerBitmap(Bitmap ...

       最近 在做二维码扫描的时候 用的是zxing 但是在进行本地相册二维码识别的时候 返回的结果一直是null  开始直接放的是图片地址 后面 网上搜了一下 说的是图片太小要放大  

    public static Bitmap getSmallerBitmap(Bitmap bitmap) {
        int size = bitmap.getWidth() * bitmap.getHeight() / 190000;
        if (size <= 1) return bitmap; // 如果小于
        else {
            Matrix matrix = new Matrix();
            matrix.postScale((float) (1 / Math.sqrt(size)), (float) (1 / Math.sqrt(size)));
            Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            return resizeBitmap;
        }
    }

    但是不管怎么调整图片的大小都不行  最后直接用 URL转化的bitmap就行了

    Uri sourceUri = data.getData();
    bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), sourceUri);

     

    展开全文
  • 二维码图片识别

    2020-04-24 18:25:00
    通过zxing对二维码图片识别 github上有很多这样的项目,但是别人一般都会封装很多层,有时我们项目中,就仅仅使用对图片中二维码的识别,并不想调用别人封装中调用摄像头的代码,而且代码经过各种封装后,自己去...

    通过zxing对二维码图片的识别

    github上有很多这样的项目,但是别人一般都会封装很多层,有时我们项目中,就仅仅只用到对图片中的二维码进行识别,并不想调用别人封装中的摄像头的代码,而且代码被各种封装后,去使用时就要花些时间去理解别人的封装,然后再集成到自己的项目,有时这会是一个繁琐的过程。

     

    这里简单记录下,直接调用方法去识别图片中的二维码,算是自己做个笔记;

     

    首先需要在项目的libs中添加zxing.jar包,这个jar包,可以在文章末的demo中获取,在ScanDemo\app\libs目录中;

     

    RGBLuminanceSource类:

     

    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    
    import com.google.zxing.LuminanceSource;
    
    import java.io.FileNotFoundException;
    
    /**
     * This class is used to help decode images from files which arrive as RGB data
     * from Android bitmaps. It does not support cropping or rotation.
     *
     * @author dswitkin@google.com (Daniel Switkin)
     */
    public final class RGBLuminanceSource extends LuminanceSource {
        final byte[] luminances;
    
        public RGBLuminanceSource(String path) throws FileNotFoundException {
            this(loadBitmap(path));
        }
    
        public RGBLuminanceSource(Bitmap bitmap) {
            super(bitmap.getWidth(), bitmap.getHeight());
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            int[] pixels = new int[width * height];
            bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
            // In order to measure pure decoding speed, we convert the entire image
            // to a greyscale array
            // up front, which is the same as the Y channel of the
            // YUVLuminanceSource in the real app.
            luminances = new byte[width * height];
            for (int y = 0; y < height; y++) {
                int offset = y * width;
                for (int x = 0; x < width; x++) {
                    int pixel = pixels[offset + x];
                    int r = (pixel >> 16) & 0xff;
                    int g = (pixel >> 8) & 0xff;
                    int b = pixel & 0xff;
                    if (r == g && g == b) {
                        // Image is already greyscale, so pick any channel.
                        luminances[offset + x] = (byte) r;
                    } else {
                        // Calculate luminance cheaply, favoring green.
                        luminances[offset + x] = (byte) ((r + g + g + b) >> 2);
                    }
                }
            }
        }
    
        @Override
        public byte[] getRow(int y, byte[] row) {
            if (y < 0 || y >= getHeight()) {
                throw new IllegalArgumentException(
                        "Requested row is outside the image: " + y);
            }
            int width = getWidth();
            if (row == null || row.length < width) {
                row = new byte[width];
            }
            System.arraycopy(luminances, y * width, row, 0, width);
            return row;
        }
    
        // Since this class does not support cropping, the underlying byte array
        // already contains
        // exactly what the caller is asking for, so give it to them without a copy.
        @Override
        public byte[] getMatrix() {
            return luminances;
        }
    
        static Bitmap loadBitmap(String path) throws FileNotFoundException {
            Bitmap bitmap = BitmapFactory.decodeFile(path);
            if (bitmap == null) {
                throw new FileNotFoundException("Couldn't open " + path);
            }
            return bitmap;
        }
    
    }
    

     

    IdentifyBitmap 类:

     

    import android.app.Activity;
    import android.graphics.Bitmap;
    
    import com.bhyf.bhyfsdk.utils.L;
    import com.google.zxing.BinaryBitmap;
    import com.google.zxing.DecodeHintType;
    import com.google.zxing.MultiFormatReader;
    import com.google.zxing.Result;
    import com.google.zxing.common.HybridBinarizer;
    
    import java.util.EnumMap;
    import java.util.Map;
    
    public class IdentifyBitmap {
    
        public interface CallbackResult {
            void callback(String result);
        }
    
        /**
         * 识别二维码或者一维码图片
         *
         * @param bitmap 图片
         * @return
         */
        public static void scanningImage(final Activity activity, final Bitmap bitmap, final CallbackResult callback) {
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    //获取初始化的设置器
                    Map<DecodeHintType, Object> hints = new EnumMap<DecodeHintType, Object>(DecodeHintType.class);
                    hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
                    RGBLuminanceSource source = new RGBLuminanceSource(bitmap);
                    BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
                    MultiFormatReader multiFormatReader = new MultiFormatReader();
    
                    try {
    
                        final Result rawResult = multiFormatReader.decode(bitmap1, hints);
    
                        if (rawResult != null)
                            L.d("扫描结果" + rawResult.getText());
    
                        if (activity != null) {
                            activity.runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    if (callback != null) {
                                        if (rawResult != null) {
                                            callback.callback(rawResult.getText());
                                        }else {
                                            callback.callback("识别失败,图片有误,或者图片模糊!");
                                        }
    
                                    }
                                }
                            });
                        }
    
    
                    } catch (Exception e) {
    
                        if (activity != null) {
                            activity.runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    if (callback != null) {
                                        callback.callback("识别失败,图片有误,或者图片模糊!");
                                    }
                                }
                            });
                        }
    
                    }
                }
            }).start();
        }
    
    
        /**
         * 识别二维码或者一维码图片
         *
         * @param bitmap 图片
         * @return
         */
        public static void scanningImage(final Bitmap bitmap, final CallbackResult callback) {
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    //获取初始化的设置器
                    Map<DecodeHintType, Object> hints = new EnumMap<DecodeHintType, Object>(DecodeHintType.class);
                    ;
                    hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
                    RGBLuminanceSource source = new RGBLuminanceSource(bitmap);
                    BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
                    MultiFormatReader multiFormatReader = new MultiFormatReader();
                    try {
    
                        final Result rawResult = multiFormatReader.decode(bitmap1, hints);
    
                        System.out.println("扫描结果" + rawResult.getText());
    
                        if (callback != null) {
                            callback.callback(rawResult.getText());
                        }
    
                    } catch (Exception e) {
    
                        if (callback != null) {
                            callback.callback("识别失败,图片有误,或者图片模糊!");
                        }
    
                    }
                }
            }).start();
        }
    
    }
    

     

    Activity中使用方法对图片进行识别,QrScanTestActivity类:

     

    import android.Manifest;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Build;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.TextView;
    
    
    
    public class QrScanTestActivity extends AppCompatActivity {
    
        private TextView tv_code;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_qr_scan_test);
    
            tv_code = findViewById(R.id.tv_code);
    
            findViewById(R.id.bt_pic).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    resourcePic();
                }
            });
        }
    
    
        public void resourcePic() {
    
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_scan_code);
    
            IdentifyBitmap.scanningImage(this,bitmap, new IdentifyBitmap.CallbackResult() {
                @Override
                public void callback(final String result) {
                    tv_code.append(result+"\n");
                }
            });
        }
    
    
      
    }
    

     

    Activity的布局文件:

     

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal">
    
        <Button
            android:id="@+id/bt_pic"
            android:text="识别本地图片"
            android:layout_marginTop="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    
        <TextView
            android:id="@+id/tv_code"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="20dp"
            android:textSize="20sp"
            android:layout_marginTop="20dp"
            android:textColor="#f00"/>
    
    </LinearLayout>

     

    ic_scan_code图片:

     

    带有camera功能的二维码识别demo,可参考(也是使用zxing实现):

    https://github.com/KrisQin/ScanCodeDemo

    展开全文
  • zxing扫描二维码识别图片二维码及其优化策略 Posted on 2016-01-08 | In Android | | Visitors | 20213二维码介绍Android中用于二维码相关的库比较少,并且大多数已经不再维护(具体可见...
  • 识别二维码图片

    2015-12-29 17:22:02
    ios使用CIQRCodeFeature(ios 8以后)识别图片二维码
  • 用CIDetector类读取相册中的二维码遇到的问题是手机截屏的图片可以读取成功,手机拍照的图片取出成功率低。并且不支持读取条形码。解决办法:读取相册中的二维码/条形码,使用ZBarSDK,下面介绍一下怎么在工程中引入...
  • IOS长按不识别二维码,出现放大图片的问题解决。 CSS加入样式: touch-callout: none; -webkit-touch-callout: none; -ms-touch-callout: none; -moz-touch-callout: none; 代码: <!DOCTYPE html> &...
  • 继上一次使用做二维码识别,公司需要高识别率的二维码识别,但ZXING实在是太弱了,对于那种二维码占比很小、图片对比度不高的,识别率低的令人咋舌,后来引入了opencv,加上恶补了一些图像处理的基础知识,总算有一...
  • 在网上搜了搜,很快就搜到了一个demo,也很快就加到我的项目中了,截取了一张二维码图片识别出来了,OK,功能加好了,真开心。后来测试一测,说二维码功能没有添加,我就和他们理论,让他们过来复现,结果真的是...
  • Android Zxing相册二维码/条码图片识别在网上搜了好多例子放到项目中都会有些问题,有的是只能识别二维码图片无法识别条码图片,有的是可以识别条码但是识别率特别低。下面就介绍我整理过后在项目中使用的相册图片...
  • 目录前言扫一扫识别二维码图片长按图片识别二维码图片生成二维码图片代码完善识别二维码图片优化小结 前言 最近在做一个关于二维码的组件,已发布,现总结下。 开发的APP所需支持的最低版本为7.0,最初的方案为扫描...
  • 二维码识别

    2018-05-02 17:11:53
     2) 如果识别失败,检测二维码的三个定位图形[3]。 3) 二值化,腐蚀图片,获得所有轮廓[1],记录包含定位图形最多的且与定位图形距离最近的一个轮廓。 4) 获得最小的包含该轮廓的矩形。从原图中抠下来。 5) 把...
  • java开发,公司最近需要在对凭证识别的过程中加入二维码识别,在网上搜索后,选定了两款开源工具,分别是谷歌的ZXING,以及QRcode,但本地测试后发现,QRcode相对于ZXING效果还是要差一点。但ZXING主要还是针对移动端...
  • Opencv+Zbar二维码识别(标准条形码/二维码识别

    万次阅读 多人点赞 2016-08-05 23:11:20
    使用Opencv+Zbar组合可以很容易的识别图片中的二维码,特别是标准的二维码,这里标准值的是二维码成像清晰,图片二维码的空间占比在40%~100%之间,这样标准的图片,Zbar识别起来很容易,不需要Opencv额外的处理。...
  • ![图片说明](https://img-ask.csdn.net/upload/201903/04/1551670955_616029.png) 问题地址https://segmentfault.com/q/1010000017493419
  • PHP识别二维码图片内容,不用其它扩展,识别率还可以! require_once("lib/QrReader.php"); $qrcode = new QrReader('QR_201802281628057192.png'); //图片路径 $text = $qrcode->text(); //返回识别后的文本
  • 仿照微信识别相册中二维码,写了一个Demo,供参考使用 1、添加依赖,基于zxing,使用了Glide选择的图片进行了显示 compile 'com.google.zxing:core:3.2.1' compile 'cn.bingoogolapple:bga-qrcodecore:1.1.3@aar' ...
  • 提高二维码识别

    万次阅读 2013-12-09 12:00:52
    一般情况下的二维码都是很容易识别的,这里指的是直接在电脑上或手机上生成的二维码图片,这类图片由于直接生成的,所以都很清晰,很容易识别出来。 我这里所说的二维码的识别率指的下类的二维码: 1.二维码打印...
  • JAVA 二维码生成识别

    千次阅读 2016-10-21 16:30:16
    System.out.println("读取二维码图片失败: " + e.getMessage()); return null; } // 解二维码  QRCodeDecoder decoder = new QRCodeDecoder(); String decodedData = new String(decoder.decode...
  • 二维码图片,放到一张比二维码大的透明图片上,再将图片导出来 转载于:https://www.cnblogs.com/Cloudloong/p/9563020.html
  • QImage img; qDebug()("./1.png"); QZXing zxing; QString res; res = zxing.decodeImage(img);... 如果专门搞个按钮,把这段代码写在按钮槽函数中就解码失败,抛出异常no code detected 求解啊···

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,406
精华内容 1,762
关键字:

二维码图片识别失败