• Python_科学计算库


    说明:若没有训练级联表,则需要相关级联表才能实现功能 

    文字识别

    # -*- coding: utf-8 -*-
    """
    简介:用样本训练数据,再识别
    """
    
    import cv2
    import numpy as np
    from PIL import Image  #Python Image Lib
    import skimage.feature as feature2d
    import sklearn.neighbors as nhb
    from sklearn.externals import joblib  #对训练模型保存或读取
    #cvhog=cv2.HOGDescriptor()
    
    #预处理图片
    def imgPrepare(filename):
        img=cv2.imread(filename,0)
        img=np.uint8(img/img.ptp()*255)
        img=np.where(img>128,255,img)
        img=np.where(img<=128,0,img)
        img=np.bitwise_not(img)
        return img
    
    #横切    
    def splitchar(img,axis=1):
        idxrowb=np.all(img<64,axis=axis)
        idxrowi=np.uint8(idxrowb).ravel()
        dy=idxrowi[1:]-idxrowi[:-1]
        #print(dy)
        rowb=np.argwhere(dy==255).ravel()
        rowe=np.argwhere(dy==1).ravel()
        #print(rowb,rowe)
        if axis==1:
            imglines=[img[b:e+1,:] for b,e in zip(rowb,rowe)]
        else:
            imglines=[img[:,b:e+1] for b,e in zip(rowb,rowe)]
      
        return imglines
    
    #切块
    def splitBox(img):
        idxrowb=np.all(img<64,axis=1)
        idxrowi=np.uint8(idxrowb).ravel()
        dy=idxrowi[1:]-idxrowi[:-1]
        #print(dy)
        rowb=np.argwhere(dy==255).ravel()
        rowe=np.argwhere(dy==1).ravel()
        b=0
        e=-1
        if len(rowe)>0:
            e=rowe[-1]+1
        if len(rowb)>0:
            b=rowb[0]
        return img[b:e,:]
    
    #把图片整成一样大小
    def myResize(img,size=(48,48)):
        h,w=img.shape
        bw=max(h,w)
        bh=bw
        bimg=np.zeros((bh,bw),np.uint8)
        if bw==w:
            dh=(bh-h)//2
            bimg[dh:dh+h,:]=img[:,:]
        else:
            dw=(bw-w)//2
            bimg[:,dw:dw+w]=img[:,:]
            
        bimg=cv2.resize(bimg,size)
        return bimg
    
    #获取hog向量   图片转为向量
    def getHog(img,cell=(16,16),block=(3,3)):
        vec=feature2d.hog(img,12,cell,block,'L2')
        return vec
    
    #训练的主方法
    gimg=imgPrepare('e:/sx.jpg')
    lines=splitchar(gimg,axis=1)
    chars=[]
    for line in lines:
        charlist=splitchar(line,axis=0)
        cchars=[  myResize(splitBox(c))  for c in charlist]
        chars.append(cchars)
    chars=np.asarray(chars)
    X=[]
    Y=[]
    y=0
    for linech in chars:
        
        for ch in linech:
            chhog=getHog(ch)
            X.append(chhog)
            Y.append(y)
        
        y+=1
    
    KNC=nhb.KNeighborsClassifier(algorithm='ball_tree',n_neighbors=3)
    KNC.fit(X,Y)
    
    joblib.dump(KNC,'knc.knn')
    
    
    
    # 识别的主方法
    def predict(img):
         knc=nhb.KNeighborsClassifier(algorithm='ball_tree',n_neighbors=3)
         knc=joblib.load('knc.knn')
         lines=splitchar(img,axis=1)
         chars=[]
         for line in lines:
             charlist=splitchar(line,axis=0)
             cchars=[  myResize(splitBox(c))  for c in charlist]
             chars.append(cchars)
        
         chars=np.asarray(chars)
        
         Y=[]
         for linech in chars:
            x=[]
            for ch in linech:
                chhog=getHog(ch)
                x.append(chhog)
                
            y=knc.predict(x)
            print(y)
            Y.append(y)
        
         return Y
         
         
    文字识别

    语音处理

    def input(self,overtime=60,Noise=12000):
            
            time.sleep(0.5)
            pa=au.PyAudio()
            
            stream=pa.open(format = au.paInt16, channels = 1, rate = 16000, input = True,frames_per_buffer = 4000)
            spk=pa.open(format=au.paInt16,channels=1,rate=16000,output=True,frames_per_buffer=1000)
            
            filename='./temp/in_%s.wav'%(self._gettoken())  #pcm格式
    
            wf = wave.open(filename, 'wb')  
            wf.setnchannels(1)  
            wf.setsampwidth(2)  
            wf.setframerate(16000)
           
            ch=0
            ptparr=np.array([0,0,0,0])
            begin=False
            
            while ch<overtime*4:
              ch+=1
              bs=stream.read(4000)
              #spk.write(bs)
             
              arr=np.frombuffer(bs,dtype=np.short)
              
              ptp=arr.max()*1.0-arr.min()*1.0
              ptparr[:-1]=ptparr[1:]
              ptparr[-1]=np.abs(ptp)
              
              if not begin:
                  if ptparr[-1]>Noise * 1.5:
                      begin=True
                      ch=1
                      wf.writeframes(bs)
                      if self.debuge:
                          print('+',end='')
                      
              else:
                  
                  if np.all(ptparr<Noise):
                      if self.debuge:
                          print('+')
                      break
                  else:
                      if self.debuge:
                          print('-',end='')
                          
                      wf.writeframes(bs)
              
                
              
            stream.close()    
            spk.close()
            wf.close()  
            wr=wave.open(filename,'rb')
            buf=wr.readframes(wr.getnframes())
            wr.close()
            pa.terminate()
            return filename,buf
            # self.speech.asr()
            
        def inputvoice(self,overtime=60,Noise=12000):
            fn,buf=self.input(overtime,Noise)
            result=self.speech.asr(buf)
            msgs=[]
            if 'result' in result.keys():
                msgs=result['result']
            msg=''
            for m in msgs:
                msg+=str(m)
            return result['err_no'],msg
    语言处理
    #语音处理,录音
    
        def input(self,overtime=60,Noise=12000):
            
            time.sleep(0.5)
            pa=au.PyAudio()
            
            stream=pa.open(format = au.paInt16, channels = 1, rate = 16000, input = True,frames_per_buffer = 4000)
            spk=pa.open(format=au.paInt16,channels=1,rate=16000,output=True,frames_per_buffer=1000)
            
            filename='./temp/in_%s.wav'%(self._gettoken())  #pcm格式
            
            wf = wave.open(filename, 'wb')  
            wf.setnchannels(1)  
            wf.setsampwidth(2)  
            wf.setframerate(16000)
           
            ch=0
            ptparr=np.array([0,0,0,0])
            begin=False
            
            while ch<overtime*4:
              ch+=1
              bs=stream.read(4000)
              #spk.write(bs)
             
              arr=np.frombuffer(bs,dtype=np.short)
              
              ptp=arr.max()*1.0-arr.min()*1.0
              ptparr[:-1]=ptparr[1:]
              ptparr[-1]=np.abs(ptp)
              
              if not begin:
                  if ptparr[-1]>Noise * 1.5:
                      begin=True
                      ch=1
                      wf.writeframes(bs)
                      if self.debuge:
                          print('+',end='')
                      
              else:
                  
                  if np.all(ptparr<Noise):
                      if self.debuge:
                          print('+')
                      break
                  else:
                      if self.debuge:
                          print('-',end='')
                          
                      wf.writeframes(bs)
              
                
              
            stream.close()    
            spk.close()
            wf.close()  
            wr=wave.open(filename,'rb')
            buf=wr.readframes(wr.getnframes())
            wr.close()
            pa.terminate()
            return filename,buf
            # self.speech.asr()
            
        def inputvoice(self,overtime=60,Noise=12000):
            fn,buf=self.input(overtime,Noise)
            result=self.speech.asr(buf)
            msgs=[]
            if 'result' in result.keys():
                msgs=result['result']
            msg=''
            for m in msgs:
                msg+=str(m)
            return result['err_no'],msg
    语音处理(录音)
    import cv2
    import numpy as np
    from PIL import Image
    #pip install PIL
    #pip install opencv-python
    #pip install dlib
    dector=cv2.CascadeClassifier()
    ret=dector.load('haarcascade_frontalface_alt_tree.xml')
    if not ret:
        print('未找到级联表文件:plate_cascade.xml')
        exit()
    
    img=cv2.imread('e:/85n.jpg')
    if img is None:
        print('文件不存在')
        exit()
    #彩色转成灰度图像
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    gray=np.uint8(gray/gray.ptp()*255)
    
    boxs=dector.detectMultiScale(gray,1.015,1)
    platelist=[]
    for box in boxs:
        x,y,w,h=box
        g=img[y:y+h,x:x+w,:]
        platelist.append(g)
        linew=h//100+1
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),linew)
    gimg=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    image=Image.fromarray(gimg)
    image.show()
    image.close()
    人脸识别
    import cv2
    detector=cv2.CascadeClassifier()
    ret=detector.load('plate_cascade.xml')
    if not ret:
        print('error')
        quit()
    img=cv2.imread('cars1.jpg')
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    boxs=detector.detectMultiScale(gray,1.01,3)
    for box in boxs:
        x,y,w,h=box
        p=img[y:y+h,x:x+w:]
        name='%d_%d.jpg'%(x,h)
        cv2.imwrite(name,p)
    车牌识别
    # -*- coding: utf-8 -*-
    """
    Created on Thu May 17 18:13:35 2018
    
    @author: inspiron
    """
    
    import cv2
    from PIL import Image
    
    hog=cv2.HOGDescriptor()
    hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
    img=cv2.imread('e:/1.jpg')
    boxs,rets=hog.detectMultiScale(img)
    
    for box in boxs:
        x,y,w,h=box
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    gimg=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    image=Image.fromarray(gimg)
    image.show()
    
    cam=cv2.VideoCapture(0)
    while True:
        ret,img=cam.read()
        if not ret:
            break
        boxs,rets=hog.detectMultiScale(img)
        for box in boxs:
            x,y,w,h=box
            cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        cv2.imshow('hog',img)
        ch=cv2.waitKey(5)
        if ch==27:
            break
    
    cv2.destroyAllWindows()
    cam.release()
    人形识别
    # -*- coding: utf-8 -*-
    """
    Created on Thu May 17 19:30:13 2018
    
    @author: AI04班级
    """
    
    import cv2
    import numpy as np
    from PIL import Image  #Python Image Lib
    import skimage.feature as feature2d
    import sklearn.neighbors as nhb
    from sklearn.externals import joblib  #对训练模型保存或读取
    #cvhog=cv2.HOGDescriptor()
    
    
    def imgPrepare(filename):
        img=cv2.imread(filename,0)
        img=np.uint8(img/img.ptp()*255)
        img=np.where(img>128,255,img)
        img=np.where(img<=128,0,img)
        img=np.bitwise_not(img)
        return img
        
    def splitchar(img,axis=1):
        idxrowb=np.all(img<64,axis=axis)
        idxrowi=np.uint8(idxrowb).ravel()
        dy=idxrowi[1:]-idxrowi[:-1]
        #print(dy)
        rowb=np.argwhere(dy==255).ravel()
        rowe=np.argwhere(dy==1).ravel()
        #print(rowb,rowe)
        if axis==1:
            imglines=[img[b:e+1,:] for b,e in zip(rowb,rowe)]
        else:
            imglines=[img[:,b:e+1] for b,e in zip(rowb,rowe)]
      
        return imglines
    
    def splitBox(img):
        idxrowb=np.all(img<64,axis=1)
        idxrowi=np.uint8(idxrowb).ravel()
        dy=idxrowi[1:]-idxrowi[:-1]
        #print(dy)
        rowb=np.argwhere(dy==255).ravel()
        rowe=np.argwhere(dy==1).ravel()
        b=0
        e=-1
        if len(rowe)>0:
            e=rowe[-1]+1
        if len(rowb)>0:
            b=rowb[0]
            
            
        return img[b:e,:]
    
    def myResize(img,size=(48,48)):
        h,w=img.shape
        bw=max(h,w)
        bh=bw
        bimg=np.zeros((bh,bw),np.uint8)
        if bw==w:
            dh=(bh-h)//2
            bimg[dh:dh+h,:]=img[:,:]
        else:
            dw=(bw-w)//2
            bimg[:,dw:dw+w]=img[:,:]
            
        bimg=cv2.resize(bimg,size)
        return bimg
    
    def getHog(img,cell=(16,16),block=(3,3)):
        vec=feature2d.hog(img,12,cell,block,'L2')
        return vec
    #main
    gimg=imgPrepare('e:/sx.jpg')
    lines=splitchar(gimg,axis=1)
    chars=[]
    for line in lines:
        charlist=splitchar(line,axis=0)
        cchars=[  myResize(splitBox(c))  for c in charlist]
        chars.append(cchars)
    chars=np.asarray(chars)
    X=[]
    Y=[]
    y=0
    for linech in chars:
        
        for ch in linech:
            chhog=getHog(ch)
            X.append(chhog)
            Y.append(y)
        
        y+=1
    
    KNC=nhb.KNeighborsClassifier(algorithm='ball_tree',n_neighbors=3)
    KNC.fit(X,Y)
    
    joblib.dump(KNC,'knc.knn')
    
    def predict(img):
         knc=nhb.KNeighborsClassifier(algorithm='ball_tree',n_neighbors=3)
         knc=joblib.load('knc.knn')
         lines=splitchar(img,axis=1)
         chars=[]
         for line in lines:
             charlist=splitchar(line,axis=0)
             cchars=[  myResize(splitBox(c))  for c in charlist]
             chars.append(cchars)
        
         chars=np.asarray(chars)
        
         Y=[]
         for linech in chars:
            x=[]
            for ch in linech:
                chhog=getHog(ch)
                x.append(chhog)
                
            y=knc.predict(x)
            print(y)
            Y.append(y)
        
         return Y
    数字识别
  • 相关阅读:
    hdu 1023 卡特兰数+高精度
    hdu 1568 Fibonacci 快速幂
    hdu 3054 Fibonacci 找循环节的公式题
    hdu 5167 Fibonacci 打表
    hdu 4165 Pills dp
    HDU 5791 Two DP
    BZOJ 2152: 聪聪可可 树分治
    HDU 5213 Lucky 莫队+容斥
    HDU 5145 NPY and girls 莫队+逆元
    BZOJ 3289: Mato的文件管理 莫队+BIT
  • 原文地址:https://www.cnblogs.com/hellangels333/p/9053682.html
Copyright © 2020-2023  润新知