gpt4 book ai didi

python - 使用pyqt进行图像标注

转载 作者:行者123 更新时间:2023-12-01 01:49:36 31 4
gpt4 key购买 nike

我有需要注释的图像,即;我应该能够像使用笔一样绘制矩形、多边形或任何形状。

Pyqt4 中可以使用哪些库?

最佳答案

有两种可能的解决方案:

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

关于python - 使用pyqt进行图像标注,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50864170/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com