python opencv实现图像矫正功能
作者:DanCheng-studio 发布时间:2022-05-22 17:00:13
标签:python,opencv,图像矫正
本文实例为大家分享了python opencv实现图像矫正的具体代码,供大家参考,具体内容如下
问题简介
一般的我们对图像中的目标进行分析和检测时,往往目标具有一定的倾斜角度,自然环境中正面向我们的目标实际是很少的,那将这些倾斜的目标“扶正”的过程就就叫做图像矫正。
透视变换demo
图像矫正使用的主要技术是透视变换。
python-opencv 透视变换demo如下:
import cv2
import numpy as np
img = cv2.imread('/home/pzs/图片/1.jpeg')
result3 = img.copy()
img = cv2.GaussianBlur(img,(3,3),0)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
cv2.imwrite("canny.jpg", edges)
src = np.float32([[207, 151], [517, 285], [17, 601], [343, 731]])
dst = np.float32([[0, 0], [337, 0], [0, 488], [337, 488]])
m = cv2.getPerspectiveTransform(src, dst)
result = cv2.warpPerspective(result3, m, (337, 488))
cv2.imshow("result", result)
cv2.waitKey(0)
主要是使用cv2.warpPerspective()函数
透视变换结果
透视变换使用很简单,关键是如何找到目标的4个顶点。
如何找到目标的4个顶点
如何找到这4个顶点:
方法有很多种,如:直线检测,轮廓检测,最小外接矩形等。
使用轮廓检测方式:
import cv2
import imutils
img = cv2.imread('1.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
dilate = cv2.dilate(blurred, cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)))
edged = cv2.Canny(dilate, 30, 120, 3) # 边缘检测
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 轮廓检测
cnts = cnts[0] if imutils.is_cv2() else cnts[1] # 判断是opencv2还是opencv3
docCnt = None
if len(cnts) > 0:
cnts = sorted(cnts, key=cv2.contourArea, reverse=True) # 根据轮廓面积从大到小排序
for c in cnts:
peri = cv2.arcLength(c, True) # 计算轮廓周长
approx = cv2.approxPolyDP(c, 0.02*peri, True) # 轮廓多边形拟合
# 轮廓为4个点表示找到纸张
if len(approx) == 4:
docCnt = approx
break
for peak in docCnt:
peak = peak[0]
cv2.circle(img, tuple(peak), 10, (255, 0, 0))
cv2.imshow('img', img)
cv2.waitKey(0)
原理:
1、对图片进行轮廓检测
2、对检测出的轮廓进行多边形逼近
3、多边形为四边形且轮廓面积最大的图形为纸张
4、输出标记四个定点
cv2.approxPolyDP() 多边形逼近
重点讲解这个函数
作用:
对目标图像进行近似多边形拟合,使用一个较少顶点的多边形去拟合一个曲线轮廓,要求拟合曲线与实际轮廓曲线的距离小于某一阀值。
函数原形:
cv2.approxPolyDP(curve, epsilon, closed) -> approxCurve
参数:
curve : 图像轮廓点集,一般由轮廓检测得到
epsilon : 原始曲线与近似曲线的最大距离,参数越小,两直线越接近
closed : 得到的近似曲线是否封闭,一般为True
返回值:
approxCurve :返回的拟合后的多边形顶点集。
来源:https://blog.csdn.net/HUXINY/article/details/89467344


猜你喜欢
- 本文实例讲述了javascript获取select值的方法。分享给大家供大家参考,具体如下:<!DOCTYPE html><
- 免责声明:本教程所有资源均来源于网络;仅用于学习交流,请勿用于任何商业行为;如需要,请使用正版授权;侵权联删。此篇教程通过无限重置试用期持续
- 我记得在刚开始接触动态HTML及JavaScript时就接触过关于鼠标右键屏蔽的脚本代码,当时这些代码很多会用在防止浏览者未经允许的复制网页
- 关于电脑的垃圾清理操作,已经有很多的成熟的软件可以帮助我们完成C盘的垃圾清理操作,比如360等等。但是使用三方的清理软件往往伴随着很多的广告
- 实现对下一个单词的预测RNN 原理自己找,这里只给出简单例子的实现代码import tensorflow as tfimport numpy
- CSS Sprites技术早在2005年 CSS Zengarden 的园主 Dave Shea就在ALA发表对该技术的详细阐述。原先只在C
- 前言腾讯《Go安全指南》中提到【必须】nil指针判断:进行指针操作时,必须判断该指针是否为nil,防止程序panic,尤其在进行结构体Unm
- 对于个人用户来说,除了病毒和木马,网页中的隐形代码也开始严重地威胁着我们的安全,但大多数人却缺乏自我保护意识,对隐形代码的危害认识不够,甚至
- 一 Django的视图函数view一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。响
- commit 粒度commit message 在工程开发中有很重要的作用。一个好的 message 不仅仅能够降低 reviewer 的心
- 本文实例讲述了Python使用sorted排序的方法。分享给大家供大家参考,具体如下:# 例1. 按照元素出现的次数来排序seq = [2,
- 为什么使用生产者消费者模式在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发中,如果生产者处理速度很快,而消费者
- 一、效果演示二、制作步骤/过程(一)绘制戒指使用tkinter的canvas画布绘制8个点,然后把这8个点使用canvas.create_l
- ES6 开始,js 新增了剩余参数语法、展开语法等,它们有个共同之处就是都以 ... 这么个符号为前缀,好像很多地方都可以用到,但实际上又不
- flask中的sqlalchemy 相比于sqlalchemy封装的更加彻底一些 , 在一些方法上更简单首先import类库:在CODE上查
- 索引相关1. 查询(或更新,删除,可以转换为查询)没有用到索引这是最基础的步骤,需要对sql执行explain查看执行计划中是否用到了索引,
- 本文实例为大家分享了Python实现简单扫雷游戏的具体代码,供大家参考,具体内容如下#coding: utf-8__note__ = &qu
- 即text-overflow:ellipsis,需要配合white-space:nowrap使用。运行代码:<div style=&q
- 本文主要讲解如何使用python绘制三维的柱形图,如下图源代码如下:import numpy as npimport matplotlib.
- 本文实例为大家分享了js实现九宫格布局效果的具体代码,供大家参考,具体内容如下效果代码如下:<!DOCTYPE html><