[英]OpenALPR not work with PyQt
我嘗試用PyQt和openalpr構建一個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
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_())
這是一個基本的例子,但錯誤仍然存在。 試圖直接向Window
類實現openalpr
代碼而沒有運氣。 所以基本上,如果沒有gui,代碼就可以了。 使用openALPR version 2.2.4
和PyQT4
。 另外,檢查圖像,它就在那里。 當使用recognize_array()
而不是recognize file
時,同樣適用。 我得到的錯誤是:
OpenCV錯誤:在detectMultiScale中斷言失敗(scaleFactor> 1 && image.depth()== CV_8U),文件/build/opencv-SviWsf/opencv-2.4.9.1+dfsg/modules/objdetect/src/cascadedetect.cpp,第1081行OpenALPR中的捕獲異常識別:/build/opencv-SviWsf/opencv-2.4.9.1+dfsg/modules/objdetect/src/cascadedetect.cpp:1081:錯誤:(-215)scaleFactor> 1 && image.depth()== CV_8U函數detectMultiScale
回溯(最近一次調用最后一次):文件“analize.py”,第39行,在window = Window()文件“analize.py”,第31行,在init self.analize.proccess()文件“analize.py”中,第22行,在proccess results = self.alpr.recognize_file(“/ tmp / 1487428945.14.jpg”)文件“/usr/lib/python2.7/dist-packages/openalpr/openalpr.py”,第132行,在recogn_file response_obj中= json.loads(json_data)文件“/usr/lib/python2.7/json/ INIT py”為,線339,在負荷返回_default_decoder.decode(一個或多個)文件“/usr/lib/python2.7/json/ decoder.py“,第364行,在解碼obj中,end = self.raw_decode(s,idx = _w(s,0).end())文件”/usr/lib/python2.7/json/decoder.py“ ,第380行,在raw_decode obj中,end = self.scan_once(s,idx)ValueError:期望屬性名稱:第1行第122列(字符121)
這可能是DPI意識的問題。 您可能需要在http://doc.qt.io/qt-5/highdpi.html上查看Qt中的高DPI支持 。 此外,如果您願意將Qt更新為5.6,這可能有助於https://stackoverflow.com/a/36058813/2135548
我猜新應用程序app = QtGui.QApplication(sys.argv)
簽名缺少argc 。 新應用程序的簽名是QApplication(int & argc, char ** argv)
請看這里
我們發現,當進程A啟動進程B時,使用Python多處理,如果在A中導入並從B調用,OpenCV將失敗,無論B是否再次導入它。 我不熟悉QT,但如果窗口在一個單獨的進程中運行,可能會發生同樣的事情(OpenCV是OpenALPR的依賴)。
如果是,那么您可能會發現將AnalizePlate [1]保留在單獨的源文件中,並在頂部import openalpr
並從窗口代碼引用它,頂部沒有import openalpr
將正常工作。
[1]我認為你的意思是分析(美國)/分析(BR / AU)。 Analize意味着別的東西:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.