OpenALPR 不适用于 PyQt
Posted
技术标签:
【中文标题】OpenALPR 不适用于 PyQt【英文标题】:OpenALPR not work with PyQt 【发布时间】:2017-02-19 08:10:09 【问题描述】:我尝试使用 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.4
和PyQT4
。另外,检查图像,它就在那里。当使用recognize_array()
而不是recognize file
时,同样适用。我得到的错误是:
OpenCV 错误:断言失败 (scaleFactor > 1 && image.depth() == CV_8U) 在detectMultiScale,文件 /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 in function 检测多尺度
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 property name: line 1 column 122 (char 121)
【问题讨论】:
我无法重现此错误。您应该尝试使用最新版本的 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 注意到 opencv 版本,我也注意到了,但我知道我安装了 OpenCV 3.1。在调查了已安装的软件包后,我记得 OpenALPR 是通过apt-get
安装的,它带有 opencv 支持(版本 2.4.9.1)。因此,从源代码安装解决了我的问题,无需任何代码修改。但是,问题是,为什么opencv 2.4.9 和pyqt 会有冲突?
【参考方案1】:
这可能是 DPI Awareness 的问题。您可能需要在http://doc.qt.io/qt-5/highdpi.html 上查看 Qt 中的高 DPI 支持。 此外,如果您愿意将 Qt 更新到 5.6,这可能会有所帮助 https://***.com/a/36058813/2135548
【讨论】:
【参考方案2】:我猜新应用程序app = QtGui.QApplication(sys.argv)
的签名丢失了argc。新申请的签名是QApplication(int & argc, char ** argv)
见here
【讨论】:
这是完全错误的,并没有以任何方式回答问题。【参考方案3】:我们发现,当进程 A 启动进程 B 时,使用 Python 多处理,如果 OpenCV 在 A 中导入并从 B 调用,则无论 B 是否再次导入,OpenCV 都会失败。我不熟悉 QT,但如果窗口在单独的进程中运行,可能会发生同样的事情(OpenCV 是 OpenALPR 的依赖项)。
如果是,那么您可能会发现将 AnalizePlate[1] 保留在单独的源文件中,顶部带有 import openalpr
并从您的窗口代码中引用它而顶部没有 import openalpr
会正常工作.
[1] 我认为您的意思是分析(美国)/分析(巴西/澳大利亚)。分析意味着别的东西:-)
【讨论】:
以上是关于OpenALPR 不适用于 PyQt的主要内容,如果未能解决你的问题,请参考以下文章
Tensorflow - 多 GPU 不适用于模型(输入),也不适用于计算梯度