上一节我们说了 opencv 的安装教程,这次我们来实战一波~

有时候我们项目上需要身份证识别,但是有的人拍的身份证不是倒的,就是歪的。让后台去识别很麻烦,经常识别不准。但有了 opencv 的透视变换,你再怎么歪,我也能帮你矫正过来。

透视变换原理

透视变换(Perspective Transformation)是将成像投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。如图所示

JAVA 实现

首先获取身份证四个点的坐标,https://uutool.cn/img-coord/ 这个网站可以在线获取图片坐标,实际在项目的时候,这四个点的坐标可以让前端传递给你。

通过工具我们获取到了四个点的坐标,分别是 [376,133],[205,422],[29,316], [194,26]

import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.utils.Converters;import java.util.List;public class PerspectiveTransform {public static void main(String[] args) {String srcImgPath = "/home/IdeaProjects/opencv-java/src/main/resources/2020-09-13_11-55.png";String x1 = "104,278";String x2 = "523,49";String x3 = "652,235";String x4 = "223,491";String destImgPath = "/home/IdeaProjects/opencv-java/src/main/resources/test5.png";perspectiveTransform(srcImgPath,x1,x2,x3,x4,destImgPath);}private static void perspectiveTransform(String srcImgPath,String x1, String x2,String x3,String x4, String destImgPath){System.loadLibrary(Core.NATIVE_LIBRARY_NAME);Mat src = Imgcodecs.imread(srcImgPath);// 读取图像到矩阵中,取灰度图像if (src.empty()) {return;}try {Mat dst = new Mat();List<Point> listSrcs = java.util.Arrays.asList(getPoint(x1), getPoint(x2),getPoint(x3), getPoint(x4));Mat srcPoints = Converters.vector_Point_to_Mat(listSrcs, CvType.CV_32F);List<Point> listDsts = java.util.Arrays.asList(new Point(0, 0), new Point(1011, 0),new Point(1011, 638), new Point(0, 638));Mat dstPoints = Converters.vector_Point_to_Mat(listDsts, CvType.CV_32F);Mat perspectiveMmat = Imgproc.getPerspectiveTransform(srcPoints, dstPoints);Size size = new Size(new Point(1011, 638));Imgproc.warpPerspective(src, dst, perspectiveMmat, size, Imgproc.INTER_LINEAR);Mat gray = gray(dst);Imgcodecs.imwrite(destImgPath, gray);} catch (Exception e) {e.printStackTrace();}}private static Point getPoint(String points) {if (points == null || "".equals(points)) {throw new NullPointerException("坐标参数为空");}String[] split = points.split(",");if (split.length == 0) {throw new NullPointerException("坐标参数为空");}return new Point(Double.valueOf(split[0]), Double.valueOf(split[1]));}/*** 作用:灰度化** @param src Mat矩阵图像* @return*/public static Mat gray(Mat src) {Mat gray = new Mat();if (src.channels() == 3) {Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);src = gray;} else {System.out.println("The Image File Is Not The RGB File!");}return src;}
}

透视变化+灰度化 后的:

本项目所有代码地址:https://gitee.com/feiling0825/opencv-java

觉得写的不错话,还是希望能给个Star的

参考

详解 OpenCV 透视变换原理 及 实例

Java基于opencv—透视变换矫正图像

用Opencv给韦小宝的身份证透视变换相关推荐

  1. python怎么让x轴45°展示_python opencv实现任意角度的透视变换实例代码

    本文主要分享的是一则python+opencv实现任意角度的透视变换的实例,具体如下: # -*- coding:utf-8 -*- import cv2 import numpy as np def ...

  2. Opencv 原图像素坐标点透视变换后对应坐标点

    已知原图img一像素点坐标p(x,y),变换前矩阵坐标pts1,变换后矩阵坐标pts2,求变换后p点对应坐标 #求变换矩阵M M = cv2.getPerspectiveTransform(pts1, ...

  3. python写透视挂_python opencv实现任意角度的透视变换实例代码

    本文主要分享的是一则python+opencv实现任意角度的透视变换的实例,具体如下: # -*- coding:utf-8 -*- import cv2 import numpy as np def ...

  4. opencv:畸变矫正:透视变换算法的思想与实现

    畸变矫正 注意:虽然能够成功矫正但是也会损失了部分图像! 透视变换(Perspective Transformation) 概念: 透视变换是将图片投影到一个新的视平面(Viewing Plane), ...

  5. C++ OpenCV手动截取图像做透视变换

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为2683字,预计阅读6分钟 前言 以前文章<C++ OpenCV检测并提取数字华容道棋盘>中有部分是用到了透视变换, ...

  6. 【opencv+mfc】实现身份证上的身份证号识别

    参考了很多网上的博客资源,有些只讲了如何提取身份证区域,有些只讲了如何做训练集.我将各个方法做了一些筛选和整合.身份证素材均来自网络. 实验目标 完成身份证识别程序,通过输入一张身份证图片,可以自动识 ...

  7. python opencv 实现任意角度的透视变换

    任意角度 数据增强: https://blog.csdn.net/jacke121/article/details/106363307 # -*- coding:utf-8 -*- import cv ...

  8. 【OpenCV】透视变换 Perspective Transformation(续)

    透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: [cp ...

  9. 【OpenCV】透视变换 Perspective Transformation

    透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: Mat ...

  10. 【opencv】关于透视变换

    学习opencv透视变换的时候联想到之前红外匹配的项目,关于变换矩阵的求解,简单记录一下学习到的相关博客. 4_2_图像几何变换 - OpenCV中文官方文档 opencv 透视变换_zhangjun ...

最新文章

  1. p187让元素垂直居中
  2. linux 2.6.36代码构架,Linux 内核笔记(2.6.36)(二)
  3. tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册
  4. 《Python数据挖掘:概念、方法与实践》一2.4 小结
  5. mac下charles使用教程
  6. c语言数独合法验证,JavaScript数独验证
  7. 学以致提高学生操作计算机能力,学用结合,学以致用
  8. 弘辽科技:淘宝旧链接如何打新品标?有什么规则?
  9. matlab相对强度噪声,噪声强度(噪声功率)、SNR、dBW
  10. linux系统实训总结报告,《linux操作系统实训》总结报告 - 图文
  11. Linux 压缩(打包)文件夹 tar/zip
  12. centos7 开机自动启动程序
  13. airdrop搜不到对方_如何在Mac的Finder中将AirDrop添加到收藏夹侧边栏
  14. MySQL 的 Buffer Pool,终于被我搞懂了
  15. c语言编程设计实验课件,c语言程序设计实验课件.ppt
  16. 使用HM NIS Edit制作软件安装包
  17. PUCCH format2中的RM码(reed muller code)和Polar码
  18. AI vs ML:有什么区别?
  19. java读入一个不确定长度的一维数组
  20. UI设计师就业发展前景如何?

热门文章

  1. Linux文件误删的恢复
  2. linux下的.swp文件
  3. Python实用模块(二十四)tenacity
  4. Putty 设置前景色和背景色
  5. Stm32中英文手册官网免费
  6. python三维雷达图_Matplotlib绘制雷达图和三维图的示例代码
  7. GrayRhino轻松解锁卡贴机的越狱插件,不需要任何卡贴
  8. 汤姆猫代码python_IOS 汤姆猫核心代码
  9. Frequent values RMQ
  10. 对绝对地址0x100000赋值 让程序跳转到绝对地址是0x100000去执行