2017-02-19 122 views
11

我試圖用PyQt和openalpr構建一個GUI應用程序,但是我的代碼存在問題。一個簡單的例子:OpenALPR不能與PyQt一起工作

from openalpr import Alpr 
from PyQt4 import QtCore, QtGui 

class AnalizePlate(object): 

    def __init__(self): 

     self.alpr = None 
     try: 
      self.alpr = Alpr("eu", "/etc/openalpr/openalpr.conf", "/usr/share/openalpr/runtime_data") 
      if not self.alpr.is_loaded(): 
       print("Error loading OpenALPR") 
     except: 
      print "Error" 


    def proccess(self): 
     self.alpr.set_top_n(7) 
     self.alpr.set_default_region("md") 

     results = self.alpr.recognize_file("/tmp/1487428945.14.jpg") 
     print results 

a = AnalizePlate() 
a.proccess() 

上面的代碼工作就像一個魅力,但如果GUI參與,出現奇怪的行爲。

from openalpr import Alpr 
from PyQt4 import QtCore, QtGui 

class AnalizePlate(object): 

    def __init__(self): 

     self.alpr = None 
     try: 
      self.alpr = Alpr("eu", "/etc/openalpr/openalpr.conf", "/usr/share/openalpr/runtime_data") 
      if not self.alpr.is_loaded(): 
       print("Error loading OpenALPR") 
     except: 
      print "Error" 


    def proccess(self): 
     self.alpr.set_top_n(7) 
     self.alpr.set_default_region("md") 

     results = self.alpr.recognize_file("/tmp/1487428945.14.jpg") 
     print results 

class Window(QtGui.QWidget): 

    def __init__(self): 
     super(Window, self).__init__() 
     self.resize(1198, 651) 
     self.analize = AnalizePlate() 
     self.analize.proccess() 
     QtCore.QMetaObject.connectSlotsByName(self) 


if __name__ == "__main__": 
    import sys 
    import sip 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 

    window.show() 
    sys.exit(app.exec_()) 

這是一個基本的例子,但錯誤仍然存​​在。試圖執行openalpr代碼直接到Window類沒有運氣。基本上,如果沒有gui,代碼就可以工作。使用openALPR version 2.2.4PyQT4。此外,檢查圖像,它在那裏。使用recognize_array()代替recognize file時也是如此。我得到的錯誤是:

OpenCV Error: Assertion failed (scaleFactor > 1 && image.depth() == CV_8U) in detectMultiScale, file /build/opencv-SviWsf/opencv-2.4.9.1+dfsg/modules/objdetect/src/cascadedetect.cpp, line 1081 Caught exception in OpenALPR recognize: /build/opencv-SviWsf/opencv-2.4.9.1+dfsg/modules/objdetect/src/cascadedetect.cpp:1081: error: (-215) scaleFactor > 1 && image.depth() == CV_8U in function detectMultiScale

Traceback (most recent call last): File "analize.py", line 39, in window = Window() File "analize.py", line 31, in init self.analize.proccess() File "analize.py", line 22, in proccess results = self.alpr.recognize_file("/tmp/1487428945.14.jpg") File "/usr/lib/python2.7/dist-packages/openalpr/openalpr.py", line 132, in recognize_file response_obj = json.loads(json_data) File "/usr/lib/python2.7/json/init.py", line 339, in loads return _default_decoder.decode(s) File "/usr/lib/python2.7/json/decoder.py", line 364, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib/python2.7/json/decoder.py", line 380, in raw_decode obj, end = self.scan_once(s, idx) ValueError: Expecting property name: line 1 column 122 (char 121)

+0

我無法重現此錯誤。您應該嘗試使用最新版本的openalpr及其依賴項進行測試。 FWIW,我的設置是:openalpr-2.3.0,opencv-3.2.0,tesseract-3.0.5,python-2.7.10,pyqt-4.12。 openalpr自述聲稱opencv-2.4.8是最低要求。不過,我的直覺是,opencv是最有可能的罪魁禍首,因爲第2版系列現在是遺留代碼,你甚至沒有使用它的最新版本(2.4.13)。 – ekhumoro

+0

經過一番工作後,我回到了這個問題。 @ekhumoro注意到opencv版本,我也是,但我知道我已經安裝了OpenCV 3.1。在調查安裝的軟件包之後,我記得OpenALPR是通過'apt-get'安裝的,它帶有opencv支持(版本2.4.9.1)。所以,從源代碼安裝解決了我的問題,沒有任何代碼修改。但是,問題是,爲什麼在opencv 2.4.9和pyqt中存在衝突? – Aleksandar

回答

0

我想爲新的應用app = QtGui.QApplication(sys.argv)簽名缺少ARGC。新應用程序的簽名是QApplication(int & argc, char ** argv)請參閱here

+0

這是完全錯誤的,並不以任何方式回答問題。 – ekhumoro