java OpenCV实现扫描仪图片倾斜矫正

首先先去opencv官网下载资源

官网地址:Releases - OpenCV

官网下载慢可以选择在百度网盘下载,版本是455

链接:https://pan.baidu.com/s/1LADtih8l8nStKwJRIde91Q 
提取码:wx0h

提示:以下方法只适用于小角度倾斜,90度这种无法矫正!!!

下载之后解压,\opencv\build\java下有个jar包,需要导入到ide中,该目录下还有x64和x86两个文件夹,是opencv的动态库,根据自己电脑来选择使用,opencv的接口都在动态库里,很重要!

导入jar包,引入opencv的动态库

后续会用到PngEncoder,需要导入包

<!-- png图片处理 -->
<dependency>
	<groupId>com.pngencoder</groupId>
	<artifactId>pngencoder</artifactId>
	<version>0.9.0</version>
</dependency>

后面就是具体的代码开发,第一个方法是用opencv的霍夫检测算法计算倾斜角度并旋转,但是因为修改后图片比原图大了十几倍,放弃了,知道的大佬可以指导下怎么在不改变图片的分辨率和清晰度缩小图片。

public static void first () {
    try {
        //输入图片路径
        String srcPath = "D:\\TU\\x7.png";
        //输出图片路径
        String rotatePath = "D:\\TU\\rotate.png";
        //加载opencv动态库,必要
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        //输入图片
        Mat src = Imgcodecs.imread(srcPath);
        //灰度化
        Mat gray = new Mat();
        if (src.channels() == 3) {
            Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
            src = gray;
        } else {
            System.out.println("不是RGB图片!");
        }
        //边缘算法检测
        Mat cannyMat = src.clone();
        //表示迟滞过程的第一个阈值
        double threshold1 = 60;
        //表示迟滞过程的第二个阈值,通常把第一个阈值*2或*3
     
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是Java图片偏斜矫正的示例代码: ```java import java.awt.Graphics2D; import java.awt.Image; import java.awt.Toolkit; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class TiltImage { public static void main(String[] args) throws IOException { // 读取图片 String imagePath = "cow.jpg"; BufferedImage image = ImageIO.read(new File(imagePath)); // 计算旋转角度 double angle = getAngle(image); // 旋转图片 Image rotatedImage = rotateImage(image, angle); // 保存图片 String outputImagePath = "cow_rotated.jpg"; ImageIO.write(toBufferedImage(rotatedImage), "jpg", new File(outputImagePath)); } /** * 获取图片旋转角度 */ private static double getAngle(BufferedImage image) { // TODO: 实现获取图片旋转角度的算法 return 0; } /** * 旋转图片 */ private static Image rotateImage(BufferedImage image, double angle) { AffineTransform transform = new AffineTransform(); transform.rotate(Math.toRadians(angle), image.getWidth() / 2, image.getHeight() / 2); Image rotatedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g = (Graphics2D) rotatedImage.getGraphics(); g.drawImage(image, transform, null); return rotatedImage; } /** * 将Image对象转换为BufferedImage对象 */ private static BufferedImage toBufferedImage(Image image) { if (image instanceof BufferedImage) { return (BufferedImage) image; } BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB); Graphics2D g = bufferedImage.createGraphics(); g.drawImage(image, 0, 0, null); g.dispose(); return bufferedImage; } } ``` 上述代码中,我们首先读取了一张图片,然后计算出图片的旋转角度,接着旋转图片并保存。其中,`getAngle()`方法需要实现获取图片旋转角度的算法,这里需要根据具体的需求进行实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值