java 图片中的二维码定位
使用技术:opencv 3.4.14 执行下载安装
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import org.opencv.core.*;
import org.opencv.core.Point;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.QRCodeDetector;
import org.opencv.utils.Converters;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.*;
import java.util.List;
/**
* 参考:https://www.cnblogs.com/huacanfly/p/9908408.html
* 参考:https://blog.csdn.net/StrangeSir/article/details/93143177
* 参考:https://opencv.org/releases/
*/
public class OpenCVQrCodePosition {
private boolean isDebug = true;
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
// 获取二维码图片位置信息
public Point[] getPosition(String imgUrl){
Mat src = Imgcodecs.imread(imgUrl ,1);
Mat src_gray = new Mat();
List contours = new ArrayList();
//彩色图转灰度图
Imgproc.cvtColor(src ,src_gray ,Imgproc.COLOR_RGB2GRAY);
//对图像进行平滑处理
Imgproc.GaussianBlur(src_gray, src_gray, new Size(3,3), 0);
this.printImg("1-1.jpg", src_gray);
Imgproc.Canny(src_gray,src_gray,112,255);
this.printImg("1-2.jpg", src_gray);
Mat hierarchy = new Mat();
// 寻找轮廓
Imgproc.findContours(src_gray ,contours ,hierarchy ,Imgproc.RETR_TREE ,Imgproc.CHAIN_APPROX_NONE);
List markContours = this.markContour(src_gray, contours, hierarchy);
markContours = this.filterByAngle(markContours);
Point[] points = this.centerCals(markContours);
if(points != null){
this.cutRect(src, points, 12);
}
return points;
}
// 裁剪指定区域
public BufferedImage cutRect(Mat src,Point[] points, int offset){
if(points == null || points.length |