2016-09-12 4 views
1

내가 뭘하고 있니? 나는 지문의 유효성을 검사하여 사용자에게 액세스 권한을 부여하는 PyQt를 사용하여 GUI 인터페이스를 구축했습니다.센서 R305를 사용하여 저장된 지문을 검색하려면 어떻게합니까?

모듈 용으로 지문 센서 R305를 사용하고 있습니다.

내 문제는 무엇입니까? 내 코드를 GIT에서 사용할 수 있으며 데이터를 특정 ID에 저장합니다. 그러나 지정된 지문을 검색하지 못합니다. 지문을 검색 *

ser = serial.Serial(port='COM4', baudrate=57600) 
pack = [0xef01, 0xffffffff, 0x1] 

def printx(l): 
    for i in l: 
     print (i) 
    print ('') 

def readPacket(): 
    time.sleep(1) 
    w = ser.inWaiting() 
    ret = [] 
    if w >= 9: 
     s = ser.read(9) #partial read to get length 
     ret.extend(struct.unpack('!HIBH', s)) 
     ln = ret[-1] 

     time.sleep(1) 
     w = ser.inWaiting() 
     if w >= ln: 
      s = ser.read(ln) 
      form = '!' + 'B' * (ln - 2) + 'H' 
      ret.extend(struct.unpack(form, s)) 
    return ret 


def writePacket(data): 
    pack2 = pack + [(len(data) + 2)] 
    a = sum(pack2[-2:] + data) 
    pack_str = '!HIBH' + 'B' * len(data) + 'H' 
    l = pack2 + data + [a] 
    s = struct.pack(pack_str, *l) 
    ser.write(s) 


def verifyFinger(): 
    data = [0x13, 0x0, 0, 0, 0] 
    writePacket(data) 
    s = readPacket() 
    return s[4] 

def genImg(): 
    data = [0x1] 
    writePacket(data) 
    s = readPacket() 
    return s[4] 

def img2Tz(buf): 
    data = [0x2, buf] 
    writePacket(data) 
    s = readPacket() 
    return s[4] 

def regModel(): 
    data = [0x5] 
    writePacket(data) 
    s = readPacket() 
    return s[4] 

def store(id): 
    data = [0x6, 0x1, 0x0, id] 
    writePacket(data) 
    s = readPacket() 
    return s[4] 


if verifyFinger(): 
    print ('Verification Error') 
    sys.exit(0) 

print ('Put finger') 
sys.stdout.flush() 

time.sleep(1) 
while genImg(): 
    time.sleep(0.1) 

    print ('.') 
    sys.stdout.flush() 

print ('') 
sys.stdout.flush() 

if img2Tz(1): 
    print ('Conversion Error') 
    sys.exit(0) 

print ('Put finger again') 
sys.stdout.flush() 

time.sleep(1) 
while genImg(): 
    time.sleep(0.1) 
    print ('.') 
    sys.stdout.flush() 

print ('') 
sys.stdout.flush() 

if img2Tz(2): 
    print ('Conversion Error') 
    sys.exit(0) 

if regModel(): 
    print ('Template Error') 
    sys.exit(0) 
id = 1 
if store(id): 
    print ('Store Error') 
    sys.exit(0) 

print ("Enrolled successfully at id %d"%id) 

* 

:

지문 등록 *

ser = serial.Serial('COM4',57600) 
pack = [0xef01, 0xffffffff, 0x1] 

def printx(): 
    for i in l: 
     print(i) 
    print('') 

def readPacket(): 
    time.sleep(1) 
    w = ser.inWaiting() 
    ret = [] 
    if w >= 9: 
     s = ser.read(9) #partial read to get length 
     ret.extend(struct.unpack('!HIBH', s)) 
     ln = ret[-1] 

     time.sleep(1) 
     w = ser.inWaiting() 
     if w >= ln: 
      s = ser.read(ln) 
      form = '!' + 'B' * (ln - 2) + 'H' 
      ret.extend(struct.unpack(form, s)) 
    return ret 


def writePacket(data): 
    pack2 = pack + [(len(data) + 2)] 
    a = sum(pack2[-2:] + data) 
    pack_str = '!HIBH' + 'B' * len(data) + 'H' 
    l = pack2 + data + [a] 
    s = struct.pack(pack_str, *l) 
    ser.write(s) 


def verifyFinger(): 
    data = [0x13, 0x0, 0, 0, 0] 
    writePacket(data) 
    s = readPacket() 
    return s[4] 

def genImg(): 
    data = [0x1] 
    writePacket(data) 
    s = readPacket() 
    return s[4] 

def img2Tz(buf): 
    data = [0x2, buf] 
    writePacket(data) 
    s = readPacket() 
    return s[4] 

def regModel(): 
    data = [0x5] 
    writePacket(data) 
    s = readPacket() 
    return s[4] 

def search(): 
    data = [0x4, 0x1, 0x0, 0x0, 0x0, 0x5] 
    writePacket(data) 
    s = readPacket() 
    return s[4:-1] 

def mainfuncn(): 
    if verifyFinger(): 
     print('Verification Error') 
     sys.exit(-1) 

    print('Put finger') 
    sys.stdout.flush() 

    time.sleep(1) 
    for _ in range(5): 
     g = genImg() 
     if g == 0: 
      break 
     #time.sleep(1) 

     print('.') 
     sys.stdout.flush() 

    print('') 
    sys.stdout.flush() 
    if g != 0: 
     sys.exit(-1) 

    if img2Tz(1): 
     print('Conversion Error') 
     sys.exit(-1) 

    r = search() 
    print('Search result', r) 
    if r[0] == 0 and r[2] in [0,1]: 
     print('Successful') 
     sys.exit(0) 
    else: 
     print('Unsuccessful') 
    sys.exit(1) 

mainfuncn() 

*

는 GUI CODE : 012,351,641 *

from PyQt4 import QtCore, QtGui 
import serial, time, datetime, struct 
import sys 
import random 
newarray=[] 
distarray=[] 
data1="" 
m="" 
k=0 
ser = serial.Serial('COM4',57600) 
pack = [0xef01, 0xffffffff, 0x1] 


try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName(_fromUtf8("Dialog")) 
     Dialog.resize(400, 300) 
     self.verticalLayoutWidget = QtGui.QWidget(Dialog) 
     self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 381, 281)) 
     self.verticalLayoutWidget.setObjectName(_fromUtf8("verticalLayoutWidget")) 
     self.verticalLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget) 
     self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) 

     self.pushButton = QtGui.QPushButton(self.verticalLayoutWidget) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 
     self.verticalLayout.addWidget(self.pushButton) 
     self.pushButton.clicked.connect(self.finger_call_main) 

     self.pushButton1 = QtGui.QPushButton(self.verticalLayoutWidget) 
     self.pushButton1.setObjectName(_fromUtf8("pushButton1")) 
     self.verticalLayout.addWidget(self.pushButton1) 
     self.pushButton1.clicked.connect(self.mainfuncn) 

     self.lineEdit = QtGui.QLineEdit(self.verticalLayoutWidget) 
     self.lineEdit.setText(_fromUtf8("")) 
     self.lineEdit.setObjectName(_fromUtf8("lineEdit")) 
     self.verticalLayout.addWidget(self.lineEdit) 

     self.retranslateUi(Dialog) 
     QtCore.QMetaObject.connectSlotsByName(Dialog) 

    def printx(self,l): 
     for i in l: 
      print (i) 
     print ('') 

    def readpacket(self): 
     time.sleep(1) 
     w = ser.inWaiting() 
     ret = [] 
     if w >= 9: 
      s = ser.read(9) #partial read to get length 
      ret.extend(struct.unpack('!HIBH', s)) 
      ln = ret[-1] 

      time.sleep(1) 
      w = ser.inWaiting() 
      if w >= ln: 
       s = ser.read(ln) 
       form = '!' + 'B' * (ln - 2) + 'H' 
       ret.extend(struct.unpack(form, s)) 
     return ret 


    def writePacket(self,data): 
     pack2 = pack + [(len(data) + 2)] 
     a = sum(pack2[-2:] + data) 
     pack_str = '!HIBH' + 'B' * len(data) + 'H' 
     l = pack2 + data + [a] 
     s = struct.pack(pack_str, *l) 
     #print("Writepacket S value: " +s) 
     ser.write(s) 


    def verifyFinger(self): 
     data = [0x13, 0x0, 0, 0, 0] 
     self.writePacket(data) 
     s = self.readpacket() 
     return s[4] 

    def genImg(self): 
     data = [0x1] 
     self.writePacket(data) 
     s = self.readpacket() 
     return s[4] 

    def img2Tz(self,buf): 
     data = [0x2, buf] 
     self.writePacket(data) 
     s = self.readpacket() 
     return s[4] 

    def regModel(self): 
     data = [0x5] 
     self.writePacket(data) 
     s = self.readpacket() 
     return s[4] 

    def store(self,id): 
     data = [0x6, 0x1, 0x0, id] 
     self.writePacket(data) 
     s = self.readpacket() 
     return s[4] 

    def new(self): 

     m=random.randrange(1,250) 
     if m in distarray: 
      print("hii") 
      # newarray.append(m) 
      self.new() 

     else: 
      print("else") 
      distarray.append(m) 
     id1=m 
     print(id1) 
     return id1 
     #for x in distarray: 
      #print(x) 

    def search(self): 
     data = [0x4, 0x1, 0x0, 0x0, 0x0, 0x5] 
     self.writePacket(data) 
     s = self.readpacket() 
     return s[4:-1] 



    def finger_call_main(self): 


     if self.verifyFinger(): 
      print ('Verification Error1') 
      sys.exit(0) 

     print ('Put finger') 
     sys.stdout.flush() 

     time.sleep(1) 
     while self.genImg(): 
      time.sleep(0.1) 

      print ('.') 
      sys.stdout.flush() 

     print ('') 
     sys.stdout.flush() 

     if self.img2Tz(1): 
      print ('Conversion Error') 
      sys.exit(0) 

     print ('Put finger again') 
     sys.stdout.flush() 

     time.sleep(1) 
     while self.genImg(): 
      time.sleep(0.1) 
      print ('.') 
      sys.stdout.flush() 

     print ('') 
     sys.stdout.flush() 

     if self.img2Tz(2): 
      print ('Conversion Error') 
      sys.exit(0) 

     if self.regModel(): 
      print ('Template Error') 
      sys.exit(0) 

     id=self.new() 

     if self.store(id): 
      print ('Store Error') 
      sys.exit(0) 
     self.lineEdit.setText("Enrolled successfully at id %d"%id) 

     print ("Enrolled successfully at id %d"%id) 

    def mainfuncn(self): 
     if self.verifyFinger(): 
      print('Verification Error') 
      sys.exit(-1) 

     print('Put finger') 
     sys.stdout.flush() 

     time.sleep(1) 
     for _ in range(5): 
      g = self.genImg() 
      if g == 0: 
       break 
      #time.sleep(1) 

      print('.') 
      sys.stdout.flush() 

     print('') 
     sys.stdout.flush() 
     if g != 0: 
      sys.exit(-1) 

     if self.img2Tz(1): 
      print('Conversion Error') 
      sys.exit(-1) 

     r = self.search() 
     #print('Search result', r) 
     if r[0] == 0: 
      print('Successful') 
      sys.exit(0) 
     else: 
      print('Unsuccessful') 
     sys.exit(1) 






    def retranslateUi(self, Dialog): 
     Dialog.setWindowTitle(_translate("Dialog", "Dialog", None)) 
     self.pushButton.setText(_translate("Dialog", "PushButton", None)) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    Dialog = QtGui.QDialog() 
    ui = Ui_Dialog() 
    ui.setupUi(Dialog) 
    Dialog.show() 
    sys.exit(app.exec_()) 

*

답변

1

는 코드를 통과 한 후, 당신의 GUI 코드는 지문 템플릿 데이터를 저장하기위한 새로운()를 생성하는 임의의 ID 값을 사용하고 있는지 얻을. 그러나 검색 코드에서 배열 [0,1]의 r [2] 값을 확인하고 있습니다.이 값은 실제로 현재 저장된 ID 목록입니다. 이것은 귀하의 검색 프로그램이 지문을 찾을 수없는 이유입니다 ID의 동적 값을 파이썬에서 생성하려면 동적 배열 또는 루핑을 사용할 수 있습니다.

lst=[] 
    def new(self): 
      print("new") 

    def main1(self): 
      for z in range(0,256): 
       if z in lst: 
       z=z+1 
       self.new() 
       else: 
        lst.append(z) 
        a=z 
        z=z+1 
        break 
      return a 

을 그리고 메인 1()를 호출하여 ID 값을 얻을 : GUI 코드() 새와 함께이 교체

id=self.main1() 

그리고 검색 코드

수 있도록 다음과 같이 변경 :

if r[0]==0 and r[2] in lst: