13

我尝试使用 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_())

这是一个基本示例,但错误仍然存​​在。试图openalpr直接将代码实现到Window类,但没有运气。所以基本上,如果没有 gui,代码就可以工作。使用openALPR version 2.2.4PyQT4。另外,检查图像,它就在那里。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() ==函数detectMultiScale中的CV_8U

Traceback(最近一次调用最后一次):文件“analize.py”,第 39 行,在 window = Window() 文件“analize.py”,第 31 行,在init self.analize.proccess() 文件“analize.py”中,第 22 行,在进程结果 = self.alpr.recognize_file("/tmp/1487428945.14.jpg") 文件 "/usr/lib/python2.7/dist-packages/openalpr/openalpr.py",第 132 行,在识别文件 response_obj = json.loads(json_data) 文件“ /usr/lib/python2.7/json/init.py”,第 339 行,加载中返回 _default_decoder.decode(s) 文件“/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: Expecting属性名称:第 1 行第 122 列(字符 121)

4

3 回答 3

1

这可能是 DPI Awareness 的问题。您可能需要在http://doc.qt.io/qt-5/highdpi.html上查看Qt中的高 DPI 支持。此外,如果您愿意将 Qt 更新到 5.6,这可能会有所帮助https://stackoverflow.com/a/36058813/2135548

于 2017-02-27T13:42:21.830 回答
1

我们发现,当进程 A 启动进程 B 时,使用 Python 多处理,如果 OpenCV 在 A 中导入并从 B 调用,则无论 B 是否再次导入,OpenCV 都会失败。我不熟悉 QT,但如果窗口在单独的进程中运行,可能会发生同样的事情(OpenCV 是 OpenALPR 的依赖项)。

如果是这样,那么您可能会发现将 AnalizePlate[1] 留在一个单独的源文件中import openalpr,顶部为 ,并从您的窗口代码中引用它,顶部为 noimport openalpr将可以正常工作。

[1] 我认为您的意思是分析(美国)/分析(巴西/澳大利亚)。分析意味着别的东西:-)

于 2018-06-14T11:24:52.780 回答
1

我猜新应用程序的签名app = QtGui.QApplication(sys.argv)缺少argc。新申请的签名QApplication(int & argc, char ** argv)这里

于 2017-02-28T07:43:35.280 回答