【问题标题】:Image annotation using pyqt使用 pyqt 进行图像标注
【发布时间】:2018-06-15 05:31:33
【问题描述】:

我有需要注释的图像,即;我应该能够画一个矩形或一个多边形或任何类型的形状,比如使用钢笔。

Pyqt4可以使用哪些库?

【问题讨论】:

  • 您想稍后导出该图像吗?
  • 是的,没错。

标签: python pyqt pyqt4


【解决方案1】:

有两种可能的解决方案:

  • 创建一个继承自 QLabel 或 QWidget 的类并覆盖 paintEvent 方法。

  • 使用 QGraphicsView 并添加代表这些特征的 QGraphicsItem。

我认为第二个解决方案是最好的,所以这是我实施的一个。

导入系统

import math

from PyQt4.QtCore import *
from PyQt4.QtGui import * 


class Widget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.btn = QPushButton("Press Me")

        self.gv = QGraphicsView()
        self.scene = QGraphicsScene(self)
        self.gv.setScene(self.scene) 
        self.gv.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)

        lay = QVBoxLayout(self)
        lay.addWidget(self.btn)
        lay.addWidget(self.gv)

        self.p_item = self.scene.addPixmap(QPixmap("lena.png"))
        self.p_item.setPos(100, 100)

        self.btn.clicked.connect(self.print_)
        self.emulate_drawing()

    def emulate_drawing(self):
        rect = self.p_item.boundingRect()

        path = QPainterPath()
        A = rect.height()

        for i in range(0, int(rect.width())-10):
            path.lineTo(i, A/2*(1-math.cos(i*math.pi/40)))

        item = QGraphicsPathItem(path, self.p_item)
        item.setPen(QPen(Qt.red, 3))

        r = QRectF(QPointF(), rect.size()*0.5)

        item = QGraphicsEllipseItem(r, self.p_item)
        item.setPos(rect.center()-r.center())
        item.setPen(QPen(Qt.blue, 4))

    def print_(self):

        image = QImage(self.gv.viewport().size(), QImage.Format_RGB32)
        image.fill(Qt.transparent)

        painter = QPainter(image)
        self.gv.render(painter)
        painter.end()

        image.save("output.png")

    def showEvent(self, event):
        QWidget.showEvent(self, event)
        self.gv.fitInView(self.scene.sceneRect())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

另一个例子:

import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import * 


class Widget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.btn = QPushButton("Add Line")

        self.gv = QGraphicsView()
        self.scene = QGraphicsScene(self)
        self.gv.setScene(self.scene) 
        self.gv.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)

        lay = QHBoxLayout(self)
        lay.addWidget(self.btn)
        lay.addWidget(self.gv)

        self.p_item = self.scene.addPixmap(QPixmap("lena.png"))
        self.btn.clicked.connect(self.add_line)

    def add_line(self):
        p1 = self.p_item.boundingRect().topLeft()
        p2 = self.p_item.boundingRect().center()
        line = QGraphicsLineItem(QLineF(p1, p2), self.p_item)
        line.setPen(QPen(Qt.red, 5))
        line.setFlag(QGraphicsItem.ItemIsMovable, True)
        line.setFlag(QGraphicsItem.ItemIsSelectable, True)
        self.gv.fitInView(self.scene.sceneRect())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

【讨论】:

  • 非常感谢..我正在寻找非常相似的东西 - stackoverflow.com/questions/8993842/… 并且它有效。我相信你也为这篇文章做出了贡献..
  • @eyylanesc:有没有办法让我在左侧有一个小部件(右侧图像),然后我点击小部件,一条线会生成并放在我点击的地方。 .此外,我们应该能够调整线条的大小。
  • @user1050619 我加了个例子,按一下按钮,然后按一下就行了,拖着就可以移动了。
  • @eyylansesc:- 有没有办法让我在 pyqt 中调整这一行的大小?另外,有没有邮箱或电话号码可以联系到你?
猜你喜欢
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
相关资源
最近更新 更多