python opencv批量读入图像并进行文本检测

废话不多说,直接上代码

import sys
sys.path.append('/usr/local/lib/python2.7/dist-packages/')
from skimage import measure
import numpy as np
import cv2
import skimage.io as io
str="D:/ruanjianxiazai/tuxiangyangben/fengehou/jishenbianhao/*.bmp"#注意这里的斜杠方向一定是/这样的 
coll = io.ImageCollection(str)
print(len(coll))
for i in range(0,len(coll)):
    print i+1
    img=coll[i]

但是这样读进来的灰度图像是单通道的,灰度图像本身就是单通道的,而用cv2.imread读入的灰度图像默认是三通道的,我后面会做mser的文本检测,单通道的检测率很低,这也是我发现的一个trick吧,可能mser对彩色图像的检测效果比较好,所以对灰度图像也得变成三通道的才更好。这就需要我们自己把它变成三通道的去检测。

所以后面又加了

jishenbianhao3=[]#将单通道的灰度图像,变成三通道的灰度图像,因为这样的检测效果会更好
    for x in range(3):
        jishenbianhao3.append(img)
    jishenbianhao3=np.array(jishenbianhao3).transpose([1,2,0])
    img1=jishenbianhao3

然后进行文本检测

 mser = cv2.MSER_create(_min_area=3000)
 regions = mser.detectRegions(img1, None)

画出文本检测的矩形框

for p in regions:
        rect = cv2.minAreaRect(p)# 得到最小外接矩形的(中心(x,y), (宽,高), 旋转角度)
        box = cv2.boxPoints(rect)# cv2.boxPoints(rect) for OpenCV 3.x 获取最小外接矩形的4个顶点
        box = np.int0(box)#这里的四个顶点不一定是水平的,需要对他进行扭转
        cv2.drawContours(img, [box], -1, (0, 255, 0), 2)#原始图像,轮廓(列表),轮廓索引(绘制独立轮廓时有用,
    #-1绘制所有轮廓) ,轮廓颜色,轮廓厚度,因为这里我们是循环画的图,所以画的是所有的轮廓

然后显示图像:

cv2.namedWindow('img',0)
cv2.resizeWindow('img', 250, 250);
cv2.imshow('img',img)
k=cv2.waitKey(0)
cv2.destroyAllWindows() 

然而我又发现了一个bug,就是cv2.drawContours不能在我创造的三通道的灰度图上画轮廓,但是在另一个程序里面是可以画在三通道的灰度图上的,那个灰度图是cv2.imread读进来的,但是都是np.array的形式,找了半天也没发现问题在哪里,算了,反正这也不是重点,那就用三通道的检测,在单通道上画图吧,重点是坐标嘛。检测出来的结果如下:


完整代码

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 13 17:34:54 2017

@author: wangyt19
"""

# -*- coding: utf-8 -*-
"""
Created on Fri Dec 08 15:25:08 2017

@author: wangyt19
"""    

import sys
sys.path.append('/usr/local/lib/python2.7/dist-packages/')
from skimage import measure
import numpy as np
import cv2
import skimage.io as io
str="D:/ruanjianxiazai/tuxiangyangben/fengehou/jishenbianhao/*.bmp"
coll = io.ImageCollection(str)#这个的检测率之所以低,是因为读进来的时候只读了一个通道的,需要三通道,
所以后面再直接用彩色图像试试,另外也可以试试把图像进行滤波增强处理来提高检测率
print(len(coll))
for i in range(0,len(coll)):
    print i+1
    img=coll[i]
    jishenbianhao3=[]#将单通道的灰度图像,变成三通道的灰度图像,因为这样的检测效果会更好
    for x in range(3):
        jishenbianhao3.append(img)
    jishenbianhao3=np.array(jishenbianhao3).transpose([1,2,0])
#img = cv2.imread(r'D:\ruanjianxiazai\tuxiangyangben\fengehou\jishenbianhao\18.bmp',0)
    img1=jishenbianhao3
    mser = cv2.MSER_create(_min_area=3000)
    regions = mser.detectRegions(img1, None)
    for p in regions:
        rect = cv2.minAreaRect(p)# 得到最小外接矩形的(中心(x,y), (宽,高), 旋转角度)
        box = cv2.boxPoints(rect)# cv2.boxPoints(rect) for OpenCV 3.x 获取最小外接矩形的4个顶点
        box = np.int0(box)#这里的四个顶点不一定是水平的,需要对他进行扭转
        cv2.drawContours(img, [box], -1, (0, 255, 0), 2)#原始图像,轮廓(列表),轮廓索引(绘制独立轮廓时有用,
    #-1绘制所有轮廓) ,轮廓颜色,轮廓厚度,因为这里我们是循环画的图,所以画的是所有的轮廓
    cv2.namedWindow('img',0)
    cv2.resizeWindow('img', 250, 250);
    cv2.imshow('img',img)
    k=cv2.waitKey(0)
    cv2.destroyAllWindows() 
  












  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值