pyqt编制简单的图像标注软件
转载:https://blog.csdn.net/yubin1277408629/article/details/77199947?locationNum=7&fps=1
#coding:utf-8
from PyQt4 import QtGui
import sys
import cv2 as cv
import os
#全局变量,图像文件夹路径
imgPath = "F:/Pictures/"
#全局变量,结果存放变量
ptRslt = []
#图像标记类
class Mark(QtGui.QWidget):
def __init__(self):
super(Mark,self).__init__()
#左上角点100,100, 宽高1000,900, 可自己设置,未利用布局
self.setGeometry(100,100,1000,900)
self.setWindowTitle("Mark") #窗口标题
self.initUI()
def initUI(self):
self.labelR = QtGui.QLabel(u'缩放比例:', self) #label标签
self.labelR.move(200, 20) #label标签坐标
self.editR = QtGui.QLineEdit(self) #存放图像缩放的比例值
self.editR.move(250,20) #编辑框坐标
self.buttonSave = QtGui.QPushButton(u"保存结果", self) #保存按钮
self.buttonSave.move(400,20) #保存按钮坐标
self.buttonSave.clicked.connect(self.buttonClick) #保存按钮关联的时间
self.allFiles = QtGui.QListWidget(self) #列表框,显示所有的图像文件
self.allFiles.move(10,40) #列表框坐标
self.allFiles.resize(180,700) #列表框大小
allImgs = os.listdir(imgPath) #遍历路径,将所有文件放到列表框中
for imgTmp in allImgs:
self.allFiles.addItem(imgTmp)
print self.allFiles.count() #打印列表框文件数,没有作用
self.allFiles.itemClicked.connect(self.itemClick) #列表框关联时间,用信号槽的写法方式不起作用
self.labelImg = QtGui.QLabel("testImage", self) # 显示图像的标签
self.labelImg.move(200,70) #显示图像标签坐标
self.labelImg.resize(700,800) #显示图像标签大小,图像按照宽或高缩放到这个尺度
def mousePressEvent(self, QMouseEvent): #鼠标单击事件
fr = float(self.editR.text()) # 读取缩放比例
pointT = QMouseEvent.pos() # 获得鼠标点击处的坐标
ptRslt.append(int( (pointT.x()-200)/fr + 0.5)) #将当前点击的坐标放到全局变量中
ptRslt.append(int((pointT.y()-70)/fr+0.5) ) # 减去图像标签的左上角坐标,再除以缩放比例,得到图像真实点坐标
def itemClick(self): #列表框单击事件
tmp = imgPath + self.allFiles.currentItem().text() #图像的绝对路径
imgOri = cv.imread(str(tmp),1) #读取图像
height = imgOri.shape[0] #图像高度
ratioY = self.labelImg.height()/(height+0.0) #按高度值缩放
self.editR.setText(str(ratioY)) # 编辑框记录缩放值
width = imgOri.shape[1] # 计算图像宽度,缩放图像
height2 = self.labelImg.height()
width2 = int(width*ratioY + 0.5)
img2 = cv.resize(imgOri, (width2, height2))
cv.imwrite("F:/tmp.jpg", img2) # 将图像保存到本地
#注释的三行,是对mat类型的图像进行转换,也可显示。但部分图像出现了错误,所以采用硬盘存取的方式,虽然笨拙,但是没错误
# img3 = cv.cvtColor(img2, cv.COLOR_BGR2RGB)
# qImg = QtGui.QImage(img3.tostring(), width2, height2, QtGui.QImage.Format_RGB888)
# # self.labelImg.setPixmap(QtGui.QPixmap(qImg))
qImgT = QtGui.QPixmap("F:/tmp.jpg") #读取本地的图像
self.labelImg.setPixmap(qImgT) #标签显示图像
def buttonClick(self): #保存按钮事件
nameT = str(self.allFiles.currentItem().text()) #获得列表框名称
name = nameT[0:-3] + "txt" #名称改为txt
file = open("F:/" + name, "w") # 打开文本,进行写操作
nId = 0 #点集的索引,循环用到
global ptRslt # 此处用到了全局变量标志,不用好像会出错,也不太明白
while nId<len(ptRslt): #循环写入点
xt = ptRslt[nId]
yt = ptRslt[nId+1]
file.write(str(xt) + " " + str(yt) + "\n")
nId = nId + 2
file.close()
ptRslt = [] # 保存之后,将结果集置空
if __name__ == "__main__": # main函数
app = QtGui.QApplication(sys.argv)
mark = Mark()
mark.show()
sys.exit(app.exec_())