工具版本:Android Studio版本3.4.2,OpenCV版本4.1.1
效果图:
下载和配置opencv
下载:https://opencv.org/releases/
1.opencv-4.1.1-android-sdk.zip下载完成之后,解压。解压之后有文件夹simples,sdk等。可以直接用AS打开simples,在任一一个simple编写识别程序。也可以新建project,fiile-new-import module导入sdk。
2.添加依赖,打开project structure
3.minSdkVersion ,targetSdkVersion 不一致,修改即可。
接下来,opencv识别,识别过程网上有很多,都可用。可以参考:
https://blog.csdn.net/SherlockHolmess/article/details/89706000
查找一维码通过面积和宽高比来定位:
//计算轮廓的面积, for (int i = 0; i < contours.size(); i++) { MatOfPoint jfjs = contours.get(i); Double area = Imgproc.contourArea(contours.get(i)); if (area > 5000) { System.out.println(area); barContours.add(contours.get(i)); Rect r = Imgproc.boundingRect(contours.get(i)); float w = (float) r.width; float h = (float) r.height; float rate = h / w; if (rate > 0.12 && rate < 0.34) { //指定图像格式大小 Mat dst = new Mat(mRgba, r); // 一维码识别 String barcode=parse(matToBitmap(dst)); if(!TextUtils.isEmpty(barcode)){ Imgproc.putText(mRgba,barcode,new Point(r.x - 10, r.y - 14),FONT_HERSHEY_SIMPLEX,1,new Scalar(0, 255, 0),6); } // Imgcodecs.imwrite("/sdcard/360/barcode/" + i + "-条形码.jpg", dst); Imgproc.rectangle(mRgba, new Point(r.x - 10, r.y - 10), new Point(r.x + r.width + 10, r.y + r.height + 10), new Scalar(255, 0, 0), 4); } } }
一维码识别:
int width = bitmap.getWidth(); int height = bitmap.getHeight(); int[] pixels = new int[width * height]; bitmap.getPixels(pixels, 0, width, 0, 0, width, height); RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels); BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source)); Reader reader = new Code128Reader(); try { result = reader.decode(binaryBitmap); barcode=result.getText(); Log.i(TAG,barcode); } catch (NotFoundException | ChecksumException | FormatException e) { Log.i(TAG,e.toString()); e.printStackTrace(); }
implementation project(path: ':sdk') compile 'com.google.zxing:core:3.3.0' compile 'com.google.zxing:android-core:3.3.0'