OpenALPR与PyQt不兼容

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版本2.2.4PyQT4。同时,检查了图片,它确实存在。当使用recognize_array()而不是recognize file时也是一样的。我得到的错误是:

OpenCV错误:在detectMultiScale函数(文件/build/opencv-SviWsf/opencv-2.4.9.1+dfsg/modules/objdetect/src/cascadedetect.cpp,第1081行)中,断言失败(scaleFactor > 1 && image.depth() == CV_8U)。在OpenALPR识别中捕获异常:/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)


我无法重现这个错误。你应该尝试使用最新版本的openalpr及其依赖项进行测试。顺便说一句,我的设置是:openalpr-2.3.0,opencv-3.2.0,tesseract-3.0.5,python-2.7.10,pyqt-4.12。openalpr的自述文件声称opencv-2.4.8是最低要求。尽管如此,我的直觉是,由于2系列版本现在已经是遗留代码,而且你甚至没有使用最新版本(2.4.13),所以opencv很可能是最有可能的罪魁祸首。 - ekhumoro
经过一段时间的缺席,我又回到了这个问题。@ekhumoro注意到了opencv的版本,我也注意到了,但我知道我已经安装了OpenCV 3.1。在调查安装的软件包后,我记得OpenALPR是通过apt-get安装的,并且它带有opencv支持(版本为2.4.9.1)。因此,从源代码安装解决了我的问题,而无需进行任何代码修改。但问题是,为什么opencv 2.4.9和pyqt会发生冲突? - Aleksandar
3个回答

1

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

这完全是错误的,而且完全没有回答问题。 - ekhumoro

1
我们发现使用Python的多进程时,如果进程A启动了进程B,无论B是否重新导入OpenCV,只要A中已经导入并从B中调用它,OpenCV就会失败。我不熟悉QT,但如果窗口在单独的进程中运行,则可能会发生相同的情况(OpenCV是OpenALPR的依赖项)。
如果是这样的话,那么您可能会发现将AnalizePlate[1]保留在单独的源文件中,并在顶部包含import openalpr,然后在窗口代码中引用它而不在顶部包含import openalpr将可以正常工作。
[1] 我想你的意思是Analyze(美国)/ Analyse(BR / AU)。Analize有其他意思 :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接