PyQt写的简单图像标注工具

来源:互联网 发布:js 百度地图样式修改 编辑:程序博客网 时间:2024/06/05 20:59
#coding:utf-8from PyQt4 import QtGuiimport sysimport cv2 as cvimport 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_())

代码说明:
本程序比较简单,使用PyQt实现,主要点是列表框显示所有文件,一个label标签显示图像,鼠标单击事件获得点坐标。如果要使用的话,在程序中删除所有的汉字,再更改成自己的图像路径和保存文本的路径,应该就可以了。注意main部分,下划线之间不应有控制,应该是编辑器问题,不能正确显示。

如下图所示,五个主要的部件,用红色方框标出了。 程序简单思路,点击列表框的图像,获得缩放比例,图像名称,然后通过名称将图像显示到图像标签,然后点集图像,进行简单的坐标转换,将坐标点集保存到文本中。
这里写图片描述