OpenCV 表计识别中倾斜的仪表转正透视变换投影变换
有的时候表非常的歪,再加上镜头畸变,你们来感受下这个画风:
就要想办法把它从这个样子给正过来,拿起你的右手,食指向前中指向左大拇指向上其他收起来
跟我一起做这个动作:
好了,放下吧,我们用不到~
首先思路就是做个变换,做个啥变换呢?是不是要揪住表的左边往屏幕外拽
然后我发现变换分为两种,一种是仿射变换,一种是透视变换(投影变换),我偷了一张非常好懂的图
显然仿射变换不满足我们的要求,这种方法没办法把它拉出屏幕外。
这个时候我发现了另外一种思路: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 表计识别中倾斜的仪表转正透视变换投影变换相关推荐
- 基于OpenCV修复表格缺失的轮廓--如何识别和修复表格识别中的虚线
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...
- opencv 表识别 工业表智能识别 数字式表盘识别,指针式表盘刻度识别,分为表检测,表盘纠正,刻度分割,刻度拉直识别
opencv 表识别 工业表智能识别 数字式表盘识别,指针式表盘刻度识别,分为表检测,表盘纠正,刻度分割,刻度拉直识别 _:34400640060136589IT干将
- opencv 表识别 工业表智能识别 数字式表盘识别,指针式表盘刻度识别,分为表检测
opencv 表识别 工业表智能识别 数字式表盘识别,指针式表盘刻度识别,分为表检测,表盘纠正,刻度分割,刻度拉直识别 YYID:37400640060136589
- AI图形算法之一:液位计识别
AI人工智能的主要应用之一就是图形化处理和识别,之前写了两篇,分别是: AI图形算法的应用之一:通过图片模板对比发现油田漏油 AI图形算法的应用之一:仪表识别 经过几个晚上的辛苦,液位计识别也测试成功 ...
- python.freelycode.com-通过OpenCV和Python进行文本倾斜校正
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 本文所展示的是一个由Pyhton实现的文本倾斜校正的脚本,在实现中使用到了OpenCV和Python的图像 ...
- latex 表格中虚线_如何识别和修复表格识别中的虚线
latex 表格中虚线 When documents are digitalized via scanning or via photo, the image quality can suffer f ...
- 【计算机视觉】基于OpenCV的人脸识别
一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...
- OpenCV+OCR文字识别
需配置好OpenCV和OCR环境下运行 1.opencv简介 OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库. OpenCV用C ...
- 一文读懂交叉熵和最大似然的关系及在人脸识别中的应用
目录 一.信息论 1.信息量 2.信息熵 3. 相对熵(KL散度) 4.交叉熵 二.最大似然 1.概念 2.最大似然的求解 三.交叉熵和最大似然在人脸识别中的应用 四.insightface中的los ...
最新文章
- 关于Socket通信客户端是否需要绑定端口号
- HEOI 2012 旅行问题
- Android获取apk信息(版本、包名等)
- 解决 IPS forbidden 的问题
- ASP.NET MVC 实现多文件上传
- 收文处理和发文处理的环节_集气罩的设计是气体净化、废气处理系统设计的重要环节...
- Qt工作笔记-树图结构的2种方式,实现右键菜单
- php分页3 1,经典php分页代码与分页原理(1/3)
- JS与Asp.Net的传值
- 数据库基本----SQL语句大全(转载)
- gcc动态链接库基本知识 [转]
- 只允许输入数字,英文字母,符号(密码)
- 2005 年下半年程序员上 下午试卷
- 识人、识货、识场—— 这就是智能零售该有的样子
- 十九、 指派问题 - 匈牙利法 (0-1 整数规划)
- termux关于python3.10中下载numpy,pandas,matplotlib,以及jupyter|ahonsmile
- Uncaught SyntaxError: The requested module ‘/node_modules/.vite/vue.js?v=bd1817bb‘ does not provide
- 通用权限管理设计篇(一)
- Git-回退到指定版本
- 产品DAU下降如何分析
热门文章
- 11.爱芳地产项目小程序之uniapp经验
- 2023年长安大学材料科学基础考研成功上岸经验分享
- android 低频过滤器,Filters过滤器简介
- 字体设计的概念、意义与原则
- 《涨知识啦31》-电流拥挤效应对深紫外发光二极管光电性能的影响
- 前置器\MX2034-01-06-09-05-02-078-00变送器\ST5484E-121-132-00
- 基于ResNet50实现宫颈细胞病变分类
- 亚马逊跨境卖家选品的主要参考方向—Amazon新手选品指导
- 【干货分享】亚马逊百万销量卖家的选品技巧大放送
- 湖南科技学院C语言答案,湖南科技大学C语言期末考试习题库.doc