有的时候表非常的歪,再加上镜头畸变,你们来感受下这个画风:

就要想办法把它从这个样子给正过来,拿起你的右手,食指向前中指向左大拇指向上其他收起来

跟我一起做这个动作:

好了,放下吧,我们用不到~

首先思路就是做个变换,做个啥变换呢?是不是要揪住表的左边往屏幕外拽

然后我发现变换分为两种,一种是仿射变换,一种是透视变换(投影变换),我偷了一张非常好懂的图

显然仿射变换不满足我们的要求,这种方法没办法把它拉出屏幕外。

这个时候我发现了另外一种思路:http://cprs.patentstar.com.cn/Search/Detail?ANE=9GDC9EHC4BCA9CGE9IGG6FBA8EBA9AHC9CEC9CFD9AHH9HAG

(找专利就去这里,收费网站太不要脸了)

专利里面的方法其实就是OpenCV里面的透视变换,只不过做了结果处理

找找资料很容易就copy一份能跑得起来的

import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
img = cv2.imread('1.jpg')
H_rows, W_cols= img.shape[:2]
print(H_rows, W_cols)
N = 30
X = 40
pts1 = np.float32([[77, 0], [171, 128], [77, 268], [0, 128]])
pts2 = np.float32([[126+N+X, 0],[252+N,128],[126+N+X, 268],[0,128]])
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (268+N,252+N))
cv2.imwrite("res.jpg",dst)
image_show_11 = Image.fromarray(img)
display(image_show_11)
image_show_12 = Image.fromarray(dst)
display(image_show_12)

其实就是猜猜变化坐标,就可以变得勉强能看:(这个图当做标准图,后面要用到它)

现在的问题是我们手动选了四个坐标,手动计算了四个映射后的坐标才学到了单应性矩阵(变换矩阵啦)

这么行呢?太麻烦了

是时候祭出SURF大法了,用SURF找出两张图特征点(一张待变换的,一张原图-模板图-标准图随你怎么称呼),然后去匹配他们的特征点,有了对应点不就可用上一个办法计算单应性矩阵了吗(结果证明SURF不如SIFT效果好一点,用SURF的话就把代码里面的SIFT四个字母换成SURF就可以其他不要动,在第27行哟)

import cv2
import numpy as np
from PIL import ImageR = 0.45def drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,Match):h1, w1 = img1_gray.shape[:2]h2, w2 = img2_gray.shape[:2]vis = np.zeros((max(h1, h2), w1 + w2, 3), np.uint8)vis[:h1, :w1] = img1_grayvis[:h2, w1:w1 + w2] = img2_grayp1 = [kpp.queryIdx for kpp in Match]p2 = [kpp.trainIdx for kpp in Match]post1 = np.int32([kp1[pp].pt for pp in p1])post2 = np.int32([kp2[pp].pt for pp in p2]) + (w1, 0)for (x1, y1), (x2, y2) in zip(post1, post2):cv2.line(vis, (x1, y1), (x2, y2), (0,255,0),1)image_show_4 = Image.fromarray(vis)display(image_show_4)def perspectiveTransformation(img1_gray, img2_gray):
#     image_show_1 = Image.fromarray(img1_gray)
#     display(image_show_1)
#     image_show_2 = Image.fromarray(img2_gray)
#     display(image_show_2)surf = cv2.xfeatures2d.SIFT_create()kp1, des1 = surf.detectAndCompute(img1_gray, None)kp2, des2 = surf.detectAndCompute(img2_gray, None)bf = cv2.BFMatcher(cv2.NORM_L2)matches = bf.knnMatch(des1, des2, k = 2)Match = []for m,n in matches:if m.distance < R * n.distance:Match.append(m)if len(Match) > 4:src_pts = np.float32([ kp1[m.queryIdx].pt for m in Match ]).reshape(-1,1,2)dst_pts = np.float32([ kp2[m.trainIdx].pt for m in Match ]).reshape(-1,1,2)M,status  = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)        dst = cv2.warpPerspective(img1_gray, M, (img2_gray.shape[0]*2,img2_gray.shape[1]*2))drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,Match[:15])image_show_3 = Image.fromarray(dst)display(image_show_3)return dstimg1_gray = cv2.imread("待变换.jpg")
img2_gray = cv2.imread("模板图.jpg")
pt = perspectiveTransformation(img1_gray, img2_gray)
raw = cv2.cvtColor(pt,cv2.COLOR_BGR2RGB)
raw_gray = cv2.cvtColor(raw,cv2.COLOR_RGB2GRAY)
edges = cv2.Canny(raw_gray,125,350)
image1 = Image.fromarray(edges.astype('uint8')).convert('RGB')
display(image1)

最后做了个canny边缘检测,效果就很不错了~

然后再研究个深度学习的做法吧,这玩意太不靠谱了~

有机会再写剩下的!

OpenCV 表计识别中倾斜的仪表转正透视变换投影变换相关推荐

  1. 基于OpenCV修复表格缺失的轮廓--如何识别和修复表格识别中的虚线

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...

  2. opencv 表识别 工业表智能识别 数字式表盘识别,指针式表盘刻度识别,分为表检测,表盘纠正,刻度分割,刻度拉直识别

    opencv 表识别 工业表智能识别 数字式表盘识别,指针式表盘刻度识别,分为表检测,表盘纠正,刻度分割,刻度拉直识别 _:34400640060136589IT干将

  3. opencv 表识别 工业表智能识别 数字式表盘识别,指针式表盘刻度识别,分为表检测

    opencv 表识别 工业表智能识别 数字式表盘识别,指针式表盘刻度识别,分为表检测,表盘纠正,刻度分割,刻度拉直识别 YYID:37400640060136589

  4. AI图形算法之一:液位计识别

    AI人工智能的主要应用之一就是图形化处理和识别,之前写了两篇,分别是: AI图形算法的应用之一:通过图片模板对比发现油田漏油 AI图形算法的应用之一:仪表识别 经过几个晚上的辛苦,液位计识别也测试成功 ...

  5. python.freelycode.com-通过OpenCV和Python进行文本倾斜校正

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 本文所展示的是一个由Pyhton实现的文本倾斜校正的脚本,在实现中使用到了OpenCV和Python的图像 ...

  6. latex 表格中虚线_如何识别和修复表格识别中的虚线

    latex 表格中虚线 When documents are digitalized via scanning or via photo, the image quality can suffer f ...

  7. 【计算机视觉】基于OpenCV的人脸识别

    一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

  8. OpenCV+OCR文字识别

    需配置好OpenCV和OCR环境下运行 1.opencv简介 OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库. OpenCV用C ...

  9. 一文读懂交叉熵和最大似然的关系及在人脸识别中的应用

    目录 一.信息论 1.信息量 2.信息熵 3. 相对熵(KL散度) 4.交叉熵 二.最大似然 1.概念 2.最大似然的求解 三.交叉熵和最大似然在人脸识别中的应用 四.insightface中的los ...

最新文章

  1. 关于Socket通信客户端是否需要绑定端口号
  2. HEOI 2012 旅行问题
  3. Android获取apk信息(版本、包名等)
  4. 解决 IPS forbidden 的问题
  5. ASP.NET MVC 实现多文件上传
  6. 收文处理和发文处理的环节_集气罩的设计是气体净化、废气处理系统设计的重要环节...
  7. Qt工作笔记-树图结构的2种方式,实现右键菜单
  8. php分页3 1,经典php分页代码与分页原理(1/3)
  9. JS与Asp.Net的传值
  10. 数据库基本----SQL语句大全(转载)
  11. gcc动态链接库基本知识 [转]
  12. 只允许输入数字,英文字母,符号(密码)
  13. 2005 年下半年程序员上 下午试卷
  14. 识人、识货、识场—— 这就是智能零售该有的样子
  15. 十九、 指派问题 - 匈牙利法 (0-1 整数规划)
  16. termux关于python3.10中下载numpy,pandas,matplotlib,以及jupyter|ahonsmile
  17. Uncaught SyntaxError: The requested module ‘/node_modules/.vite/vue.js?v=bd1817bb‘ does not provide
  18. 通用权限管理设计篇(一)
  19. Git-回退到指定版本
  20. 产品DAU下降如何分析

热门文章

  1. 11.爱芳地产项目小程序之uniapp经验
  2. 2023年长安大学材料科学基础考研成功上岸经验分享
  3. android 低频过滤器,Filters过滤器简介
  4. 字体设计的概念、意义与原则
  5. 《涨知识啦31》-电流拥挤效应对深紫外发光二极管光电性能的影响
  6. 前置器\MX2034-01-06-09-05-02-078-00变送器\ST5484E-121-132-00
  7. 基于ResNet50实现宫颈细胞病变分类
  8. 亚马逊跨境卖家选品的主要参考方向—Amazon新手选品指导
  9. 【干货分享】亚马逊百万销量卖家的选品技巧大放送
  10. 湖南科技学院C语言答案,湖南科技大学C语言期末考试习题库.doc