废话不多说,直接上代码
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()