openCV提取图像中的矩形区域


Posted in Python onJuly 21, 2020

改编自详解利用OpenCV提取图像中的矩形区域(PPT屏幕等) 原文是c++版,我改成了python版,供大家参考学习。
主要思想:边缘检测—》轮廓检测—》找出最大的面积的轮廓—》找出顶点—》投影变换

import numpy as np
import cv2
# 这个成功的扣下了ppt白板
srcPic = cv2.imread('2345.jpg')
length=srcPic.shape[0]
depth=srcPic.shape[1]
polyPic = srcPic
shrinkedPic = srcPic
greyPic = cv2.cvtColor(shrinkedPic, cv2.COLOR_BGR2GRAY)
ret, binPic = cv2.threshold(greyPic, 130, 255, cv2.THRESH_BINARY)
print(binPic.shape)
median = cv2.medianBlur(binPic, 5)
# 进行边缘检测
cannyPic = cv2.Canny(median, 10, 200)

cv2.namedWindow("binary", 0)
cv2.namedWindow("binary2", 0)
cv2.imshow("binary", cannyPic)
# 找出轮廓
contours, hierarchy = cv2.findContours(cannyPic, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
cv2.imwrite('binary2.png', cannyPic)
cv2.imshow("binary2", cannyPic)
i = 0
maxArea = 0
# 挨个检查看那个轮廓面积最大
for i in range(len(contours)):
 if cv2.contourArea(contours[i]) > cv2.contourArea(contours[maxArea]):
 maxArea = i
#检查轮廓得到分布在四个角上的点
hull = cv2.convexHull(contours[maxArea])
s = [[1,2]]
z = [[2,3]]
for i in hull:
 s.append([i[0][0],i[0][1]])
 z.append([i[0][0],i[0][1]])
del s[0]
del z[0]

#现在的目标是从一堆点中挑出分布在四个角落的点,决定把图片分为四等份,每个区域的角度来划分点,
#默认四个角分别分布在图像的四等分的区间上,也就是矩形在图像中央
# 我们把所有点的坐标,都减去图片中央的那个点(当成原点),然后按照x y坐标值的正负 判断属于哪一个区间

center=[length/2,depth/2]

# 可以得到小数
for i in range(len(s)):
 s[i][0] = s[i][0] - center[0]
 s[i][1] = s[i][1] - center[1]
one = []
two = []
three = []
four = []
# 判断是那个区间的
for i in range(len(z)):
 if s[i][0] <= 0 and s[i][1] <0 :
 one.append(i)
 elif s[i][0] > 0 and s[i][1] <0 :
 two.append(i)
 elif s[i][0] >= 0 and s[i][1] > 0:
 four.append(i)
 else:three.append(i)

p=[]
distance=0
temp = 0
# 下面开始判断每个区间的极值,要选择距离中心点最远的点,就是角点
for i in one :
 x=z[i][0]-center[0]
 y=z[i][1]-center[1]
 d=x*x+y*y
 if d > distance :
 temp = i
 distance = d
p.append([z[temp][0],z[temp][1]])
distance=0
temp=0
for i in two :
 x=z[i][0]-center[0]
 y=z[i][1]-center[1]
 d=x*x+y*y
 if d > distance :
 temp = i
 distance = d
p.append([z[temp][0],z[temp][1]])
distance=0
temp=0
for i in three :
 x=z[i][0]-center[0]
 y=z[i][1]-center[1]
 d=x*x+y*y
 if d > distance :
 temp = i
 distance = d
p.append([z[temp][0],z[temp][1]])
distance=0
temp=0
for i in four :
 x=z[i][0]-center[0]
 y=z[i][1]-center[1]
 d=x*x+y*y
 if d > distance :
 temp = i
 distance = d
p.append([z[temp][0],z[temp][1]])


for i in p:
 cv2.circle(polyPic, (i[0],i[1]),2,(0,255,0),2)
# 给四个点排一下顺序
a=[]
b=[]
st=[]
for i in p:
 a.append(i[0])
 b.append(i[1])
index=np.lexsort((b, a))
for i in index:
 st.append(p[i])
p = st
print(p)
pts1 = np.float32([[p[0][0],p[0][1]],[p[1][0],p[1][1]],[p[2][0],p[2][1]],[p[3][0],p[3][1]]])
# dst=np.float32([[0,0],[0,srcPic.shape[1]],[srcPic.shape[0],0],[srcPic.shape[0],srcPic.shape[1]]])
dst=np.float32([[0,0],[0,600],[400,0],[400,600]])

# 投影变换
M = cv2.getPerspectiveTransform(pts1,dst)
cv2.namedWindow("srcPic2", 0)
cv2.imshow("srcPic2", srcPic)
#dstImage = cv2.warpPerspective(srcPic,M,(srcPic.shape[0],srcPic.shape[1]))
dstImage = cv2.warpPerspective(srcPic,M,(400,600))


# 在原图上画出红色的检测痕迹,先生成一个黑色图
black = np.zeros((shrinkedPic.shape[0], shrinkedPic.shape[1]), dtype=np.uint8)
# 二值图转为三通道图
black3 = cv2.merge([black, black, black])
# black=black2
cv2.drawContours(black, contours, maxArea, 255, 11)
cv2.drawContours(black3, contours, maxArea, (255, 0, 0), 11)
cv2.imwrite('cv.png', black)

cv2.namedWindow("cannyPic", 0)
cv2.imshow("cannyPic", black)
cv2.namedWindow("shrinkedPic", 0)
cv2.imshow("shrinkedPic", polyPic)
cv2.namedWindow("dstImage", 0)
cv2.imshow("dstImage", dstImage)
# 等待一个按下键盘事件
cv2.waitKey(0)
# 销毁所有创建出的窗口

运行效果

openCV提取图像中的矩形区域

用到的图片

openCV提取图像中的矩形区域

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python网络爬虫采集联想词示例
Feb 11 Python
python读取二进制mnist实例详解
May 31 Python
Python实现将文本生成二维码的方法示例
Jul 18 Python
Python中进程和线程的区别详解
Oct 29 Python
Python模拟登录的多种方法(四种)
Jun 01 Python
通过Pandas读取大文件的实例
Jun 07 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
python实现贪吃蛇双人大战
Apr 18 Python
用python实现名片管理系统
Jun 18 Python
Python 如何定义匿名或内联函数
Aug 01 Python
Django使用django-simple-captcha做验证码的实现示例
Jan 07 Python
一篇文章弄懂Python中的内建函数
Aug 07 Python
Python文件夹批处理操作代码实例
Jul 21 #Python
Python常用库Numpy进行矩阵运算详解
Jul 21 #Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
Jul 21 #Python
Pandas的Apply函数具体使用
Jul 21 #Python
Python pandas对excel的操作实现示例
Jul 21 #Python
浅谈Python爬虫原理与数据抓取
Jul 21 #Python
用于ETL的Python数据转换工具详解
Jul 21 #Python
You might like
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
新浪新闻小偷
2006/10/09 PHP
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
javascript设计模式之工厂模式示例讲解
2014/03/04 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
BootStrap表单时间选择器详解
2017/05/09 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
Python之re操作方法(详解)
2017/06/14 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
python如何更新包
2020/06/11 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
sklearn的predict_proba使用说明
2020/06/28 Python
Django自带的用户验证系统实现
2020/12/18 Python
STAUD官方网站:洛杉矶独有的闲适风格
2019/04/11 全球购物
研究生求职推荐信范文
2013/11/30 职场文书
董事长岗位职责
2013/11/30 职场文书
大学组织委员竞选稿
2015/11/21 职场文书