借点代码 二维码 2

import java.awt.Graphics2D; 
import java.awt.geom.AffineTransform; 
import java.awt.image.BufferedImage; 
   
import com.google.zxing.LuminanceSource; 
   
public class BufferedImageLuminanceSource  extends LuminanceSource { 
     private final BufferedImage image; 
     private final int left; 
     private final int top; 
   
     public BufferedImageLuminanceSource(BufferedImage image) { 
         this (image,  0 0 , image.getWidth(), image.getHeight()); 
    
   
     public BufferedImageLuminanceSource(BufferedImage image,  int left, 
             int top,  int width,  int height) { 
         super (width, height); 
   
         int sourceWidth = image.getWidth(); 
         int sourceHeight = image.getHeight(); 
         if (left + width > sourceWidth || top + height > sourceHeight) { 
             throw new IllegalArgumentException( 
                     "Crop rectangle does not fit within image data." ); 
        
   
         for ( int y = top; y < top + height; y++) { 
             for ( int x = left; x < left + width; x++) { 
                 if ((image.getRGB(x, y) &  0xFF000000 ) ==  0 ) { 
                     image.setRGB(x, y,  0xFFFFFFFF );  // = white 
                
            
        
   
         this .image =  new BufferedImage(sourceWidth, sourceHeight, 
                 BufferedImage.TYPE_BYTE_GRAY); 
         this .image.getGraphics().drawImage(image,  0 0 null ); 
         this .left = left; 
         this .top = top; 
    
   
       
     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]; 
        
         image.getRaster().getDataElements(left, top + y, width,  1 , row); 
         return row; 
    
   
       
     public byte [] getMatrix() { 
         int width = getWidth(); 
         int height = getHeight(); 
         int area = width * height; 
         byte [] matrix =  new byte [area]; 
         image.getRaster().getDataElements(left, top, width, height, matrix); 
         return matrix; 
    
   
       
     public boolean isCropSupported() { 
         return true
    
   
       
     public LuminanceSource crop( int left,  int top,  int width,  int height) { 
         return new BufferedImageLuminanceSource(image,  this .left + left, 
                 this .top + top, width, height); 
    
   
       
     public boolean isRotateSupported() { 
         return true
    
   
       
     public LuminanceSource rotateCounterClockwise() { 
         int sourceWidth = image.getWidth(); 
         int sourceHeight = image.getHeight(); 
         AffineTransform transform =  new AffineTransform( 0.0 , - 1.0 1.0
                 0.0 0.0 , sourceWidth); 
         BufferedImage rotatedImage =  new BufferedImage(sourceHeight, 
                 sourceWidth, BufferedImage.TYPE_BYTE_GRAY); 
         Graphics2D g = rotatedImage.createGraphics(); 
         g.drawImage(image, transform,  null ); 
         g.dispose(); 
         int width = getWidth(); 
         return new BufferedImageLuminanceSource(rotatedImage, top, 
                 sourceWidth - (left + width), getHeight(), width); 
    
}

转载于:https://my.oschina.net/u/2504076/blog/550672

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 Java 代码示例,演示了如何使用 OpenCV 库实现二维码几何变形恢复: ```java import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint2f; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import java.util.ArrayList; import java.util.List; public class QRCodeGeometryCorrection { public static void main(String[] args) { // 加载 OpenCV 库 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // 读取二维码图片 Mat img = Imgcodecs.imread("qrcode.jpg"); // 转换为灰度图 Mat gray = new Mat(); Imgproc.cvtColor(img, gray, Imgproc.COLOR_BGR2GRAY); // 二值化处理 Mat threshold = new Mat(); Imgproc.threshold(gray, threshold, 0, 255, Imgproc.THRESH_BINARY_INV | Imgproc.THRESH_OTSU); // 查找轮廓 List<MatOfPoint> contours = new ArrayList<>(); Mat hierarchy = new Mat(); Imgproc.findContours(threshold, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); // 查找最大轮廓 int maxContourIndex = 0; double maxContourArea = -1; for (int i = 0; i < contours.size(); i++) { double area = Imgproc.contourArea(contours.get(i)); if (area > maxContourArea) { maxContourArea = area; maxContourIndex = i; } } // 查找轮廓的四个角点 MatOfPoint2f maxContour2f = new MatOfPoint2f(contours.get(maxContourIndex).toArray()); MatOfPoint2f approx = new MatOfPoint2f(); double epsilon = 0.01 * Imgproc.arcLength(maxContour2f, true); Imgproc.approxPolyDP(maxContour2f, approx, epsilon, true); Point[] points = approx.toArray(); // 透视变换 Point topLeft = points[0]; Point topRight = points[1]; Point bottomRight = points[2]; Point bottomLeft = points[3]; MatOfPoint2f src = new MatOfPoint2f(topLeft, topRight, bottomRight, bottomLeft); MatOfPoint2f dst = new MatOfPoint2f(new Point(0, 0), new Point(200, 0), new Point(200, 200), new Point(0, 200)); Mat perspectiveTransform = Imgproc.getPerspectiveTransform(src, dst); Mat corrected = new Mat(); Imgproc.warpPerspective(img, corrected, perspectiveTransform, new org.opencv.core.Size(200, 200)); // 显示结果 Imgproc.putText(img, "Original", new Point(10, 30), Core.FONT_HERSHEY_SIMPLEX, 1, new Scalar(0, 0, 255), 2); Imgproc.putText(corrected, "Corrected", new Point(10, 30), Core.FONT_HERSHEY_SIMPLEX, 1, new Scalar(0, 0, 255), 2); Imgcodecs.imwrite("original.jpg", img); Imgcodecs.imwrite("corrected.jpg", corrected); } } ``` 这段代码使用了 OpenCV 库中的图像处理函数,实现了对二维码图像的几何变形恢复。其中,`Imgcodecs.imread` 函数用于读取图像,`Imgproc.cvtColor` 函数用于将彩色图像转换为灰度图,`Imgproc.threshold` 函数用于二值化处理,`Imgproc.findContours` 函数用于查找轮廓,`Imgproc.approxPolyDP` 函数用于对轮廓进行多边形逼近,`Imgproc.getPerspectiveTransform` 函数用于计算透视变换矩阵,`Imgproc.warpPerspective` 函数用于进行透视变换。最后,使用 `Imgcodecs.imwrite` 函数将结果保存到文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值