pyqt编制简单的图像标注软件

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_())

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值