opencv threshold_opencv有多强?看它如何识别你的银行卡并提取出卡号

前言

一个好的深度学习算法工程师,从来就是和opencv、pilow、Matplotlib一起混合用,由于这个代码不是我写的,我就不上传代码了。

opencv的安装

这里我们使用python版opnecv,c++版本的基础算法也差不多。

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

预备知识

1.二值化

ret, dst = cv2.threshold(src, thresh, maxval, type)
src: 输入图,只能输入单通道图像,通常来说为灰度图
thresh:一般取127和255
maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
type:二值化操作的类型,包含以下5种类型:
1.cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
2.cv2.THRESH_BINARY_INV THRESH_BINARY的反转
3.cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
4.cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
5.cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转常用
THRESH_BINARY_INV自动找到阙值
cv2.threshold(group, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

62d508f272a9cdc8e7682e27b732848f.png
ff1c1d35b20c691e4697bf634b9bb8d8.png
import cv2import matplotlib.pyplot as pltimg = cv2.imread('cat.jpg')img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret,img_bi = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)ret,img_bi_inv = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV)ret,img_tr = cv2.threshold(img_gray,127,255,cv2.THRESH_TRUNC)ret,img_zero = cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO)ret,img_zero_inv = cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO_INV)titles = ['Original','Binary','Binary_INV','TRUNC','ZERO','ZERO_INV']images = [img,img_bi,img_bi_inv,img_tr,img_zero,img_zero_inv]for i in range(6):    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray'),plt.title(titles[i])    plt.xticks([]),plt.yticks([])   # 不显示坐标轴plt.show(
ea079e0bc989babba336c62130497978.png

2.轮廓检测

contours,hierarchy=cv2.findContours(image, mode, method[, offset])
image:8位单通道图像。视为二值图像
contours:轮廓点。列表格式,每一个元素为一个3维数组(其形状为(n,1,2),其中n表示轮廓点个数,2表示像素点坐标),表示一个轮廓
hierarchy:轮廓间的层次关系,为三维数组,形状为(1,n,4),其中n表示轮廓总个数,4指的是用4个数表示各轮廓间的相互关系。第一个数表示同级轮廓的下一个轮廓编号,第二个数表示同级轮廓的上一个轮廓的编号,第三个数表示该轮廓下一级轮廓的编号,第四个数表示该轮廓的上一级轮廓的编号
mode:轮廓检索的方式
1.cv2.RETR_EXTERNAL:只检索外部轮廓
2.cv2.RETR_LIST: 检测所有轮廓且不建立层次结构
3.cv2.RETR_CCOMP: 检测所有轮廓,建立两级层次结构
4.cv2.RETR_TREE: 检测所有轮廓,建立完整的层次结构
method:轮廓近似的方法
1.cv2.CHAIN_APPROX_NONE:存储所有的轮廓点
2.cv2.CHAIN_APPROX_SIMPLE:压缩水平,垂直和对角线段,只留下端点。常用
cv2.findContours(group.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

3.形态学

腐蚀与膨胀属于形态学操作,所谓的形态学,就是改变物体的形状,形象理解一些:腐蚀=变瘦(白色部分) 膨胀=变胖(白色部分)
主要是采用 cv2.erode() 和 cv2.dilate()

688e15c98a25d61fb2a2a0c614e04a40.png

主要针对二值化图像的白色部分腐蚀:是一种消除边界点,使边界向内部收缩的过程.到亮区(背景)变细,而黑色区域(字母)则变大了。

a589b7005aeed979c82e654c5b9aa041.png

通俗讲法:在原图的每一个小区域里取最小值,由于是二值化图像,只要有一个点为0,则都为0,来达到瘦身的目的算法:用 3x3 的 kernel,扫描图像的每一个像素;用 kernel 与其覆盖的二值图像做 “与” 操作;若都为1,则图像的该像素为1;否则为0. 最终结果:使二值图像减小一圈.膨胀:是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程,可以用来填补物体中的空洞。背景(白色)膨胀,而黑色字母缩小了。

33b97bffd39093674093d62cd89a8195.png

算法:用 3x3 的 kernel,扫描图像的每一个像素;用 kernel 与其覆盖的二值图像做 “与” 操作;若都为0,则图像的该像素为0;否则为1. 最终结果:使二值图像扩大一圈
1.先腐蚀后膨胀的过程称为 开运算。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积
【cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)】

5d09155959ed6be0c75731be22d8050f.png

2.先膨胀后腐蚀的过程称为 闭运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积.
【cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)】

41aca3a7540e5fee817570d2b22f3c01.png

3.膨胀 减去 腐蚀的过程称为 梯度运算。用来计算轮廓【cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)】

39463614fb2ed1687a42c537c7ae364a.png

4.顶帽:原始输入 减去 开运算结果 【cv2.morphologyEx(img,cv.MORPH_TOPHAT,kernel)】

b51406d9f51567c89fa034d78bd74135.png

5.黑帽:闭运算 减去 原始输入 【cv2.morphologyEx(img,cv.MORPH_BLACKHAT,kernel)】

911fa5be925cde065265a1b1f3381026.png

3.sobel算子

cv2.Sobel(src, ddepth, dx, dy, ksize) 进行sobel算子计算
src表示当前图片,
ddepth表示图片深度,这里使用cv2.CV_64F使得结果可以是负值,
dx表示x轴方向,
dy表示y轴方向, ksize表示移动方框的大小
cv2.convertScalerAbs(src) 将像素点进行绝对值计算
src表示当前图片

import cv2import matplotlib.pyplot as pltimg = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE)sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)# 1,0: 表示只算水平的,不算竖直的sobelxx = cv2.convertScaleAbs(sobelx)# sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)sobelyy = cv2.convertScaleAbs(sobely)# 分别计算x和y,再求和,融合的较好sobelxy_1 = cv2.addWeighted(sobelxx,0.5,sobelyy,0.5,0)# 不建议直接计算,融合的不好sobelxy_2 = cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)# cv_show('pie',img)cv2.imshow('sobelx',sobelx)cv2.imshow('sobelxx',sobelxx)cv2.imshow('sobely',sobely)cv2.imshow('sobelyy',sobelyy)cv2.imshow('sobelxy_1',sobelxy_1)cv2.imshow('sobelxy_2',sobelxy_2)cv2.waitKey(0)cv2.destroyAllWindows()
33c933e744f4a4e5c9be0049a463c021.png
78bdfcfc89d0b6904e02feaef0fc013d.png
0baac9fe38aab5f288e2d260b82e10e1.png
9e73426d444a465e43d278ea0556565a.png

4.模版匹配

模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别程度的计算方法在opencv里有6种,然后格每次计算的結果放入一个矩阵里,作为結果输出.假如原图形是AxB大小,而模板是axb大小,则输出结果的矩阵是(A-a+1)x(B-b+1)

简单来说,模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。

ede2de9cd033a8949430dc6bc5783a81.png


cv2.matchTemplate(image, templ, method, result=None, mask=None)
image:待搜索图像
templ:模板图像
method:计算匹配程度的方法
返回参数res:是一个结果矩阵,假设待匹配图像为 I,宽高为(W,H),模板图像为 T,宽高为(w,h)。那么result的大小就为(W-w+1, H-h+1)
其中method:
TM-SQDIFF:计算平方不同,计算出来的值越小,越相关
TM_CCORR:计算相关性,计算出来的值越大,越相关
TM_CCOEFF:计算相关系数,计算出来的值越大,越相关
TM SQDIFF-NORMED: 计算归一化平方不同,计算出来的值越接近0,越相关
TM_CCORR-NORMED: 计t算归一化相关性,计算出来的值越接近1,越相关
TM-CCOEFF-NORMED:计算归一化相关系数,计算出来的值越接近1,越相关

项目步骤

93b8f75cfe59b9391d39b1e23db4179f.png

1.准备识别模版

准备好识别模版,对它进行opencv操作,拆分为单个图0,1,2,3,4,5…并按从左到右排序。

fb148a5a5e72b0c11a65459dd42d71b7.png

2.对银行卡操作

对银行卡部分进行opencv的一些列操作,选取银行卡卡号的部分,进行拆分,并排序。

2866b374dd1fc748c840aba4c124cabf.png
30e49cb7aa8401c1f048e2512f21b480.png

3.模版匹配

利用模版匹配,计算得分最高的,银行卡号进行识别。

具体代码

文件配置

ap = argparse.ArgumentParser()ap.add_argument("-i", "--image", default='./image/credit_card_01.png',required=True,help="path to input image")ap.add_argument("-t", "--template",default='./image/ocr_a_reference.png', required=True,help="path to template OCR-A image")args = vars(ap.parse_args())# 指定信用卡类型FIRST_NUMBER = {"3": "American Express","4": "Visa","5": "MasterCard","6": "Discover Card"}# 绘图展示def cv_show(name,img):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()print(args["template"])

识别模版读取与裁剪

img=cv2.imread(args["template"])cv_show("tem",img)#灰度图ref=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv_show("GRAY",ref)#二值化ref=cv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV)[1]cv_show("GRAY1",ref)refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# cv版本大于3.8的,只有两个返回值cv2.drawContours(img,refCnts,-1,(0,0,255),3)cv_show("GRAY1",img)refCnts = myutils.sort_contours(refCnts, method="left-to-right")[0]digits = {}# 存模板的单个数字# 2.遍历每一个轮廓,外接矩形for (i, c) in enumerate(refCnts):# 计算外接矩形并且resize成合适大小(x, y, w, h) = cv2.boundingRect(c)# 3.抠出模板roi = ref[y:y + h, x:x + w]# 每个roi对应一个数字roi = cv2.resize(roi, (57, 88))# 太小,调大点cv_show("waijie",roi)# 4.每一个数字对应每一个模板digits[i] = roi

代码拆分:

img=cv2.imread(args["template"])cv_show("tem",img)
33f5d22226a20a2f97484f50d874bd73.png
#灰度图ref=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv_show("GRAY",ref)
46db7bba4d5a7c723517c7a83267d7b6.png
#二值化ref=cv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV)[1]cv_show("GRAY1",ref)123
1c2405ad3199df592b5cd9949fac9423.png
refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# cv版本大于3.8的,只有两个返回值cv2.drawContours(img,refCnts,-1,(0,0,255),3)cv_show("GRAY1",img)12345
be25791117ed60278c361c28608c82a3.png
for (i, c) in enumerate(refCnts):# 计算外接矩形并且resize成合适大小(x, y, w, h) = cv2.boundingRect(c)# 3.抠出模板roi = ref[y:y + h, x:x + w]# 每个roi对应一个数字roi = cv2.resize(roi, (57, 88))# 太小,调大点cv_show("waijie",roi)# 4.每一个数字对应每一个模板digits[i] = roi123456789
de124810eff95232a2bc78f6cbdf82c7.png
91015c48863e05901b2704e3a06165d6.png
#初始化卷积核的大小################################################## kernel = cv2.getStructuringElement(shape, ksize, anchor)# shape: 核的形状# cv2.MORPH_RECT: 矩形# cv2.MORPH_CROSS: 十字形(以矩形的锚点为中心的十字架)# cv2.MORPH_ELLIPSE: 椭圆(矩形的内切椭圆)## ksize: 核的大小,矩形的宽,高格式为(width, height)# anchor: 核的锚点,默认值为(-1, -1), 即核的中心点##################################################卷积核的大小根据项目设定rectKernel =cv2.getStructuringElement(cv2.MORPH_RECT,(9,3))sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

银行卡读取与裁剪

# 2.读取输入图像,预处理image = cv2.imread(args["image"])cv_show('Input_img',image)image = myutils.resize(image, width=300)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)cv_show('Input_gray',gray)# 3.礼帽操作,突出更明亮的区域# 形态学操作,礼帽+闭操作可以突出明亮区域,但并不是非得礼帽+闭操作tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel)cv_show('tophat',tophat)# 4.x方向的Sobel算子,实验表明,加y的效果的并不好gradX = cv2.Sobel(tophat, ddepth=cv2.CV_32F, dx=1, dy=0,ksize=-1) #ksize=-1相当于用3*3的# sobelyy = cv2.convertScaleAbs(gradX)# cv_show('gradXt',sobelyy)# x方向取绝对值 -> 归一化# 绝对值+归一化# 归一化 x’ = (x-min)/(max-mingradX = np.absolute(gradX)# absolute: 计算绝对值(minVal, maxVal) = (np.min(gradX), np.max(gradX))gradX = (255 * ((gradX - minVal) / (maxVal - minVal)))gradX = gradX.astype("uint8")print (np.array(gradX).shape)cv_show('Input_Sobel_gradX',gradX)#通过闭操作(先膨胀,再腐蚀)将数字连在一起.变亮gradX = cv2.morphologyEx(gradX, cv2.MORPH_CLOSE, rectKernel)cv_show('Input_CLOSE_gradX',gradX)# THRESH_OTSU会自动寻找合适的阈值,适合双峰,需把阈值参数设置为0thresh = cv2.threshold(gradX, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]cv_show('Input_thresh',thresh)#再来一个闭操作,填补空洞#两段代码雷同# onekernel = np.ones((9,9), np.uint8)# thresh = cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,onekernel)thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, sqKernel) # 填补空洞cv_show('Input_thresh_CLOSE',thresh)#计算轮廓threshCnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# 1.遍历轮廓locs = []# 存符合条件的轮廓for i,c in enumerate(threshCnts):# 计算矩形x,y,w,h = cv2.boundingRect(c)ar = w / float(h)# 选择合适的区域,根据实际任务来,这里的基本都是四个数字一组if ar > 2.5 and ar < 4.0:if (w > 40 and w < 55) and (h > 10 and h < 20):#符合的留下来locs.append((x, y, w, h))# 将符合的轮廓从左到右排序#x:x[]字母可以随意修改,排序方式按照中括号[]里面的维度,[0]按照第一维,[1]按照第二维。locs = sorted(locs,key=lambda x:x[0])

分解代码:

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)cv_show('Input_gray',gray)
85bed0d71a37ca7025650e0157ea4701.png

# 3.礼帽操作,突出更明亮的区域 # 形态学操作,礼帽+闭操作可以突出明亮区域,但并不是非得礼帽+闭操作 tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel) cv_show('tophat',tophat)

c8fb5242e30eebf7e5df0142e6b56070.png
# 4.x方向的Sobel算子,实验表明,加y的效果的并不好gradX = cv2.Sobel(tophat, ddepth=cv2.CV_32F, dx=1, dy=0,ksize=-1) #ksize=-1相当于用3*3的
1b40139dba802f8e10cdd676e65b1afd.png
# x方向取绝对值 -> 归一化# 绝对值+归一化# 归一化 x’ = (x-min)/(max-mingradX = np.absolute(gradX)# absolute: 计算绝对值(minVal, maxVal) = (np.min(gradX), np.max(gradX))gradX = (255 * ((gradX - minVal) / (maxVal - minVal)))gradX = gradX.astype("uint8")
85ff4da94d48a99ebc5d3387f73c2979.png
#通过闭操作(先膨胀,再腐蚀)将数字连在一起.变亮gradX = cv2.morphologyEx(gradX, cv2.MORPH_CLOSE, rectKernel)cv_show('Input_CLOSE_gradX',gradX)
d638b7f522042a35e8d34dd6ab7202ed.png
# THRESH_OTSU会自动寻找合适的阈值,适合双峰,需把阈值参数设置为0thresh = cv2.threshold(gradX, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]cv_show('Input_thresh',thresh)
221843984c2f7e603e3afa2db9ef10ac.png

进行模版匹配

遍历每一个轮廓中的数字output = []# 存正确的数字for (i,(gx,gy,gw,gh)) in enumerate(locs):groupOutput = []# 根据坐标提取每一个组(4个值)group = gray[gy-5:gy+gh+5, gx-5:gx+gw+5]# 往外扩一点#cv_show('group_' + str(i), group)# 二值化预处理group = cv2.threshold(group, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]  # 二值化的group#cv_show('group2_' + str(i), group)# 把每个轮廓分成小轮廓digitCnts = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]#排序digitCnts = myutils.sort_contours(digitCnts, method="left-to-right")[0]for c in digitCnts:z = 0(x, y, w, h) = cv2.boundingRect(c)  # 外接矩形roi = group[y:y + h, x:x + w]  # 在原图中取出小轮廓覆盖区域,即数字roi = cv2.resize(roi, (57, 88))        #cv_show('roi' , roi )scores = []#进行遍历模版匹配for (digit, digitROI) in digits.items():# 进行模板匹配, res是结果矩阵res = cv2.matchTemplate(roi, digitROI, cv2.TM_CCOEFF)  # 此时roi是X digitROI是0 依次是1,2.. 匹配10次,看模板最高得分多少Max_score = cv2.minMaxLoc(res)[1]  # 返回4个,取第二个最大值Maxscorescores.append(Max_score)  # 10个最大值print("scores:", scores)groupOutput.append(str(np.argmax(scores)))z = z + 1# 2画出来cv2.rectangle(image, (gx - 5, gy - 5), (gx + gw + 5, gy + gh + 5), (0, 0, 255), 1)  # 左上角,右下角# putText参数:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细cv2.putText(image, "".join(groupOutput), (gx, gy - 15),cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)# 得到结果output.extend(groupOutput)print("groupOutput:", groupOutput)cv_show("result",image)
d1ca908c9ef55b7afed67b9165dfd96a.png

进行模版匹配

z遍历每一个轮廓中的数字output = []# 存正确的数字for (i,(gx,gy,gw,gh)) in enumerate(locs):groupOutput = []# 根据坐标提取每一个组(4个值)group = gray[gy-5:gy+gh+5, gx-5:gx+gw+5]# 往外扩一点#cv_show('group_' + str(i), group)# 二值化预处理group = cv2.threshold(group, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]  # 二值化的group#cv_show('group2_' + str(i), group)# 把每个轮廓分成小轮廓digitCnts = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]#排序digitCnts = myutils.sort_contours(digitCnts, method="left-to-right")[0]for c in digitCnts:z = 0(x, y, w, h) = cv2.boundingRect(c)  # 外接矩形roi = group[y:y + h, x:x + w]  # 在原图中取出小轮廓覆盖区域,即数字roi = cv2.resize(roi, (57, 88))        #cv_show('roi' , roi )scores = []#进行遍历模版匹配for (digit, digitROI) in digits.items():# 进行模板匹配, res是结果矩阵res = cv2.matchTemplate(roi, digitROI, cv2.TM_CCOEFF)  # 此时roi是X digitROI是0 依次是1,2.. 匹配10次,看模板最高得分多少Max_score = cv2.minMaxLoc(res)[1]  # 返回4个,取第二个最大值Maxscorescores.append(Max_score)  # 10个最大值print("scores:", scores)groupOutput.append(str(np.argmax(scores)))z = z + 1# 2画出来cv2.rectangle(image, (gx - 5, gy - 5), (gx + gw + 5, gy + gh + 5), (0, 0, 255), 1)  # 左上角,右下角# putText参数:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细cv2.putText(image, "".join(groupOutput), (gx, gy - 15),cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)# 得到结果output.extend(groupOutput)print("groupOutput:", groupOutput)cv_show("result",image)
c4e11b2a0b17f9995aad9eb1e32a1227.png

你学会了吗?如需获取系列教程私信小编 01

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机视觉(Computer Vision)又称为机器视觉(Machine Vision),顾名思义是一门“教”会计算机如何去“看”世界的学科。在机器学习大热的前景之下,计算机视觉与自然语言处理(Natural Language Process, NLP)及语音识别(Speech Recognition)并列为机器学习方向的三大热点方向。在如今互联网时代,人工智能发展迅速,计算机视觉领域应用非常广泛,对人才的需求也是非常大,计算机视觉在IT领域的工资水平非常高,初级就能达到一个很好的薪资水平,学好计算机视觉,势在必得,增加自己的竞争力以及给自己一个好的薪水。 以下是计算机视觉部分应用场景,可以看到它的需求非常大:1.Google, MS, Facebook, Apple,华为,阿里,腾讯,百度等世界科技公司,无一没有建立自己的AI实验室,AI里面,计算机视觉或图像处理是非常重要的一块,当然它们研究方向就多了,几乎会涵盖所有方向。2.世界各大汽车公司,如特斯拉,宝马。汽车公司开始发力自动驾驶,而自动驾驶里面最核心的技术就是“教”汽车里的电脑如何通过摄像头实时产生的图片和视频自动驾驶。因此视觉和图像处理便是核心技术所在,如行人探测,道路识别,模式识别。3.Adobe,美图秀秀等照片、Winrar、Real player等视频处理、压缩软件。这个不多说,最最直观的应用,比如降噪,图像分割、图像压缩、视频压缩。4.AR(增强现实)最近由于Pockman GO的风靡全球又被推到第一线,而Google Class或者三星Gear眼镜等等,也无不和图像处理、计算机视觉的科研有关。预测这将是未来几年主推的东西。5.迪士尼等各大电影制片公司。3-D电影,以及各种炫酷的电影特效,当然里面不光有图像处理,还有计算机图形学的东西在里面。6.地平线,大疆无人机等机器人公司。和自动驾驶一个道理,机器人要通过摄像头“判断”并躲开前方障碍物,核心技术都在视觉和图像处理。7.医疗器械设备公司。医学图像处理,核磁共振,断层扫描等等,众所周知医疗行业都是暴利阿。8.工业级摄像头;包括高速路上的摄像头,机场火车站安检摄像头,工业流水线上的摄像头,嵌入了人脸或次品识别的芯片,智能地识别罪犯、次品,等等。 基于SpringBoot+Python多语言银行卡识别系统,将以基础知识为根基,带大家完成一个强大的银行卡识别系统。该系统将包含算法部分,算法服务,算法商业化api部分等。应用场景可以为:帮助用户快速完成信息录入和银行卡绑定、批量快速录入银行卡号的业务场景、商场购物现场扫码app绑定银行卡等等,算法可以商业化,系统同时实现了商业化api功能,商业价值非常高,大家可以基于课程项目的基础上进一步完善,做到商用,学到知识的同时,给自己额外增加收入。 本课程包含的技术: 开发工具为:IDEA、WebStorm、PyCharmPythonAnconaOpencvDjangoSpringBootSpringCloudVue+ElementUI+NODEJS等等 课程亮点: 1.与企业接轨、真实工业界产品2.强大的计算机视觉库OPENCV3.从基础到案例,逐层深入,学完即用4.市场主流的前后端分离架构和人工智能应用结合开发5.多语言结合开发,满足多元化的需求6.商业化算法api实现7.多Python环境切换8.微服务SpringBoot9.集成SpringCloud实现统一整合方案 10.全程代码实操,提供全部代码和资料 11.提供答疑和提供企业技术方案咨询 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值