我用的是PyQT5。我想用QQuickPaintedItem将帧从Opencv发送到QML。我在这里编写了一个示例实现。为什么只有一次调用事件时我才发现应用程序无法加载。它只绘制从摄影机到QML组件和自我更新()未调用绘制事件。在
from OpenGL import GL
from PyQt5.QtQuick import QQuickPaintedItem, QQuickView
from PyQt5.QtGui import QPainter, QPixmap, QImage
from PyQt5.QtQml import qmlRegisterType
import sys
from PyQt5.QtGui import QColor
from PyQt5.QtCore import QUrl,QObject,pyqtSignal
import cv2.cv2 as cv2
from PyQt5.QtWidgets import QApplication
class ImageWriter(QQuickPaintedItem):
cam_frame = None
def __init__(self, *args, **kwargs):
super(ImageWriter, self).__init__(*args, **kwargs)
self.setRenderTarget(QQuickPaintedItem.FramebufferObject)
def paint(self, painter):
print(ImageWriter.cam_frame)
painter.drawPixmap(0,0,ImageWriter.cam_frame)
def update_frame(self,frame):
frame = cv2.resize(frame, (700, 500), cv2.INTER_AREA)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
frame = QImage(frame, frame.shape[1], frame.shape[0], 17)
ImageWriter.cam_frame = QPixmap.fromImage(frame)
self.update()
def get_frames(app):
cap = cv2.VideoCapture(0)
num = 0
imgw = ImageWriter()
while True:
while num != 30:
_ , bgframe = cap.read()
num += 1
_ , frame = cap.read()
imgw.update_frame(frame)
print("get frames")
app.processEvents()
if __name__ == '__main__':
app = QApplication(sys.argv)
qmlRegisterType(ImageWriter, "imageWriter", 1, 0, "ImageWriter")
view = QQuickView()
view.setSource(QUrl('test.qml'))
rootObject = view.rootObject()
view.show()
get_frames(app)
sys.exit(app.exec_())
这是我为此写的QML
^{pr2}$为什么我不能画得很坚强自我更新()。我不能使用QWidgets,我必须使用这个。我有什么遗漏吗?在
这个问题是由两个ImageWriter对象引起的,一个在
imgw = ImageWriter()
中创建,另一个在QML中创建,您可以通过在.py in.QML中添加prints来组合它:*.py
*.qml
^{pr2}$输出:
如您所见,有两个对象指向不同的内存地址,因此一个可能的解决方案是使用this library创建一个单例:
有了以上应该工作的图像采集我觉得还有更好的方法,过一会儿我会展示出一个更好的选择。
以my previous answer为基础,我创建了一个模块,该模块使用opencv实现了摄像机的处理程序,除了一个查看器,还有一个允许添加过滤器的泛型类,为此项目必须具有以下结构
PyCVQML公司/cvcapture.py
PyCVQML公司/cvitem.py
PyCVQML/\uu init\uy.py
然后在
main.py
中使用它,我添加了2个示例过滤器,因为这个CVCapture
具有filters属性,其中过滤器被传递给它,它们将按照它们建立的顺序执行。要实现一个新的过滤器,您必须从CVAbstractFilter
继承并重写process_image()
方法,该方法以np.ndarray
的形式接收图像,并在过滤器之后返回结果。主.py
qml
相关问题 更多 >
编程相关推荐