淘先锋技术网

首页 1 2 3 4 5 6 7

opencv提供了方便的绘图功能,使用其中的绘图函数可以绘制直线,矩形,圆,椭圆等多种几何图形,还能在图像中的指定位置添加文字说明。在处理图像时,可能需要与当前正在处理的图像进行交互。OpenCV提供了鼠标事件,使用户可以通过鼠标与图像交互。鼠标事件能识别常用的鼠标操作,列入:针对不同案件的单击,双击,鼠标的滑动,托叶等。
重点
模板匹配,轮廓检测,阈值处理,边缘检测

阈值处理

ret, dst = cv2.threshold(src, thresh, maxval, type)
ret:表示返回的阈值。
dst:表示输出图片。
src:表示输入图片。
thresh:表示阈值。
maxval:当像素值超过了阈值(或者小于阈值,这里需要根据type参数决定),所将像素值替换为maxval。
type:二值化操作类型。
cv2.THRESH_BINARY:超过阈值部分取maxval(最大值),否则取0。
cv2.THRESH_BINARY_INV:THRESH_BINARY的反转。
cv2.THRESH_TRUNC:大于阈值部分设为阈值,否则不变。
cv2.THRESH_TOZERO:大于阈值部分不改变,否则设为0。
cv2.THRESH_TOZERO_INV:THRESH_TOZERO的反转。

轮廓查找

cv2.findContours(img,mode,method)
img:输入图片。
mode:轮廓检索模式
RETR_EXTERNAL :只检索最外面的轮廓;
RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;
method:轮廓逼近方法
CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
返回值有是三个,分别是image、cnts、hierarchy。image为一张图片,该图片与输入img图片没什么区别。cnts为轮廓的坐标值。hierarchy为轮廓之间的关系。

代码部分

import cv2
import numpy as np

def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
def sort_contours(cnts,method = "left-to-right"):
    reverse = False
    i=0
    if method =="right-to-left" or method =="bottom-to-top":
        reverse = True
    if method =="top-to-bottom" or method =="bottom-to-top":
        i=1
    boundingBoxes = [cv2.boundingRect(c) for c in cnts]
    (cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes), key = lambda b:b[1][i], reverse = reverse))
    return cnts, boundingBoxes
template = cv2.imread("ocr_a_reference.png")
cv_show("template",template)
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
ret, template_binary = cv2.threshold(template_gray,0,255,1)
cv_show("template_binary",template_binary)
cnts, h = cv2.findContours(template_binary, cv2.RETR_EXTERNAL, \
                           cv2.CHAIN_APPROX_SIMPLE)
template_rect = cv2.drawContours(template.copy(), cnts, -1, (255,255,0),-1)
cv_show("template_rect",template_rect)
cnts = sort_contours(cnts)[0]
number = {}
for (i,cnt) in enumerate(cnts):
    (x,y,w,h) = cv2.boundingRect(cnt)
    roi = template_binary[y:y+h,x:x+w]
    roi = cv2.resize(roi, (57,88))
    number[i] = roi
    cv_show("roi",roi)
#信用卡去背景

# 读取信用卡图片
cardImg = cv2.imread('credit_card_01.png')
h,w = cardImg.shape[:2]
cardImg = cv2.resize(cardImg,(300, int(float(300 / w) *h)))
cardImg_gray = cv2.cvtColor(cardImg, cv2.COLOR_BGR2GRAY)
cv_show("cardImg_gray",cardImg_gray)
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))