使用pyq进行图像标注

2024-06-25 22:37:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Pyqt4中可以使用哪些库?在


Tags: 图像多边形形状pyqt4矩形钢笔
1条回答
网友
1楼 · 发布于 2024-06-25 22:37:29

有两种可能的解决方案:

  • 创建一个继承自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_())

另一个例子:

^{pr2}$

相关问题 更多 >