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 相关文章推荐
jupyter安装小结
Mar 13 Python
Python简单格式化时间的方法【strftime函数】
Sep 18 Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
python构建深度神经网络(续)
Mar 10 Python
python实现简易通讯录修改版
Mar 13 Python
Python基于opencv的图像压缩算法实例分析
May 03 Python
对Python模块导入时全局变量__all__的作用详解
Jan 11 Python
200行python代码实现2048游戏
Jul 17 Python
python3实现微型的web服务器
Sep 03 Python
python实现的Iou与Giou代码
Jan 18 Python
python3跳出一个循环的实例操作
Aug 18 Python
详解Pycharm第三方库的安装及使用方法
Dec 29 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
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
php去除HTML标签实例
2013/11/06 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
Zend Framework教程之资源(Resources)用法实例详解
2016/03/14 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
Sublime Text 3常用插件及安装方法
2015/12/16 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
javascript 中模板方法单例的实现方法
2017/10/17 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
小程序实现tab标签页
2020/11/16 Javascript
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
有针对性的求职自荐信
2013/11/14 职场文书
八年级生物教学反思
2014/01/22 职场文书
应急处置方案
2014/06/16 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
nginx日志格式分析和修改
2022/04/28 Servers