import cv2, os, time
from models import models
from models2 import models2
# 不然每次YOLO处理都会输出调试信息
os.environ['YOLO_VERBOSE'] = 'False'
from ultralytics import YOLO
from PySide6.QtWidgets import QApplication, QMessageBox
from PySide6.QtUiTools import QUiLoader
from PySide6 import QtWidgets, QtCore, QtGui
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.styles import getSampleStyleSheet,ParagraphStyle
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image,Table,TableStyle
from reportlab.lib.enums import TA_CENTER,TA_LEFT,TA_JUSTIFY
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import inch
# from tkinter import *
from tkinter.filedialog import asksaveasfile
from tkinter.filedialog import asksaveasfilename
class zhong:
def __init__(self):
self.setupUI()
# 定义定时器,用于控制显示视频的帧率
self.timer_camera = QtCore.QTimer()
# 定时到了,回调 self.show_camera
self.timer_camera.timeout.connect(self.show_camera)
# 加载 YOLO nano 模型,第一次比较耗时,要20秒左右
# self.model = YOLO('yolov8x-pose-p6.pt')
self.model = YOLO('yolov8n-pose.pt')
self.args()
def args(self):
self.list1 = []
self.list2 = []
self.list3 = []
self.list4 = []
self.time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
self.x1 = []
self.y1 = []
self.x2 = []
self.y2 = []
self.x3 = []
self.y3 = []
self.x4 = []
self.y4 = []
def setupUI(self):
# self.ui = QUiLoader().load('untitled.ui')
self.ui = QUiLoader().load('new.ui')
self.ui.displayButton.clicked.connect(self.displayPage1)
self.ui.displayButton_2.clicked.connect(self.displayPage2)
self.ui.displayButton_3.clicked.connect(self.displayPage3)
self.ui.displayButton_4.clicked.connect(self.displayPage4)
self.ui.displayButton_5.clicked.connect(self.displayPage5)
self.ui.camBtn.clicked.connect(self.startCamera)
self.ui.stopBtn.clicked.connect(self.stop)
self.ui.pdfsubmit.clicked.connect(self.pdf)
# 拍照
# self.ui.takeBtn.clicked.connect(self.taking_pictures)
self.ui.takeBtn1.clicked.connect(self.taking_pictures1)
self.ui.takeBtn2.clicked.connect(self.taking_pictures2)
self.ui.takeBtn3.clicked.connect(self.taking_pictures3)
self.ui.takeBtn4.clicked.connect(self.taking_pictures4)
#修改
self.ui.fixBtn1.clicked.connect(self.fix1)
self.ui.fixBtn2.clicked.connect(self.fix2)
self.ui.fixBtn3.clicked.connect(self.fix3)
self.ui.fixBtn4.clicked.connect(self.fix4)
#显示实时时间
self.ui.time.setText(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
def startCamera(self):
self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
if not self.cap.isOpened():
print("1号摄像头不能打开")
return ()
if self.timer_camera.isActive() == False: # 若定时器未启动
# self.timer_camera.start(50)
#100帧
self.timer_camera.start(30)
# self.timer_camera.start(20)
def show_camera(self):
ret, frame = self.cap.read() # 从视频流中读取
if not ret:
return
# 把读到的16:10帧的大小重新设置
frame = cv2.resize(frame, (800, 600))
# 视频色彩转换回RGB,OpenCV images as BGR
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# qImage = QtGui.QImage(frame.data, frame.shape[1], frame.shape[0],
# QtGui.QImage.Format_RGB888) # 变成QImage形式
# 往显示视频的Label里 显示QImage
# self.ui.label_ori_video.setPixmap(QtGui.QPixmap.fromImage(qImage))
results = self.model(frame)[0]
# print(results)
img = results.plot(line_width=1)
qImage = QtGui.QImage(img.data, img.shape[1], img.shape[0],
QtGui.QImage.Format_RGB888) # 变成QImage形式
self.ui.label_treated.setPixmap(QtGui.QPixmap.fromImage(qImage)) # 往显示Label里 显示QImage
self.ui.label_treated_2.setPixmap(QtGui.QPixmap.fromImage(qImage)) # 往显示Label里 显示QImage
self.ui.label_treated_3.setPixmap(QtGui.QPixmap.fromImage(qImage)) # 往显示Label里 显示QImage
self.ui.label_treated_4.setPixmap(QtGui.QPixmap.fromImage(qImage)) # 往显示Label里 显示QImage
def taking_pictures1(self):
ret, frame = self.cap.read() # 从视频流中读取
if not ret:
return
# 把读到的16:10帧的大小重新设置
frame = cv2.resize(frame, (800, 600))
# 视频色彩转换回RGB,OpenCV images as BGR
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
qImage = QtGui.QImage(frame.data, frame.shape[1], frame.shape[0],
QtGui.QImage.Format_RGB888) # 变成QImage形式
# 往显示视频的Label里 显示QImage
# self.ui.label_take1.setPixmap(QtGui.QPixmap.fromImage(qImage))
qImage.save('pose1.jpg')
self.list1.clear()
angel_shoulder, str_shoulder, angel_xo1, angel_xo2, str_xo, diff_leg, str2_leg ,x,y= models('pose1.jpg').sum()
self.list1.append(angel_shoulder)
self.list1.append(str_shoulder)
self.list1.append( angel_xo1)
self.list1.append(angel_xo2)
self.list1.append( str_xo)
self.list1.append( diff_leg)
self.list1.append( str2_leg)
self.x1 = x
self.y1 = y
#展示qimage
# self.ui.label_show1.setPixmap(QtGui.QPixmap.fromImage(qImage))
#打开本地图片并展示
pixmap = QtGui.QPixmap('pose1.jpg_keypoint.jpg')
self.ui.label_show1.setPixmap(pixmap)
def taking_pictures2(self):
ret, frame = self.cap.read() # 从视频流中读取
if not ret:
return
# 把读到的16:10帧的大小重新设置
frame = cv2.resize(frame, (800, 600))
# 视频色彩转换回RGB,OpenCV images as BGR
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
qImage = QtGui.QImage(frame.data, frame.shape[1], frame.shape[0],
QtGui.QImage.Format_RGB888) # 变成QImage形式
# 往显示视频的Label里 显示QImage
# self.ui.label_take2.setPixmap(QtGui.QPixmap.fromImage(qImage))
qImage.save('pose2.jpg')
self.list2.clear()
angel_head, str_head , x , y= models('pose2.jpg').head()
self.list2.append(angel_head)
self.list2.append(str_head)
self.x2 = x
self.y2 = y
# self.ui.label_show2.setPixmap(QtGui.QPixmap.fromImage(qImage))
pixmap = QtGui.QPixmap('pose2.jpg_keypoint.jpg')
self.ui.label_show2.setPixmap(pixmap)
def taking_pictures3(self):
ret, frame = self.cap.read() # 从视频流中读取
if not ret:
return
# 把读到的16:10帧的大小重新设置
frame = cv2.resize(frame, (800, 600))
# 视频色彩转换回RGB,OpenCV images as BGR
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
qImage = QtGui.QImage(frame.data, frame.shape[1], frame.shape[0],
QtGui.QImage.Format_RGB888) # 变成QImage形式
# 往显示视频的Label里 显示QImage
# self.ui.label_take3.setPixmap(QtGui.QPixmap.fromImage(qImage))
qImage.save('pose3.jpg')
self.list3.clear()
angel_pelvis,str_pelvis ,x,y= models('pose3.jpg').Pelvis()
self.list3.append(angel_pelvis)
self.list3.append(str_pelvis)
self.x3 = x
self.y3 = y
# self.ui.label_show3.setPixmap(QtGui.QPixmap.fromImage(qImage))
pixmap = QtGui.QPixmap('pose3.jpg_keypoint.jpg')
self.ui.label_show3.setPixmap(pixmap)
def taking_pictures4(self):
ret, frame = self.cap.read() # 从视频流中读取
if not ret:
return
# 把读到的16:10帧的大小重新设置
frame = cv2.resize(frame, (800, 600))
# 视频色彩转换回RGB,OpenCV images as BGR
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
qImage = QtGui.QImage(frame.data, frame.shape[1], frame.shape[0],
QtGui.QImage.Format_RGB888) # 变成QImage形式
# 往显示视频的Label里 显示QImage
# self.ui.label_take4.setPixmap(QtGui.QPixmap.fromImage(qImage))
qImage.save('pose4.jpg')
self.list4.clear()
angel_shoulder, str_shoulder, angel_xo1, angel_xo2, str_xo, diff_leg, str2_leg,x,y = models('pose4.jpg').sum()
self.list4.append(angel_shoulder)
self.list4.append(str_shoulder)
self.list4.append(angel_xo1)
self.list4.append(angel_xo2)
self.list4.append(str_xo)
self.list4.append(diff_leg)
self.list4.append(str2_leg)
self.x4 = x
self.y4 = y
# self.ui.label_show4.setPixmap(QtGui.QPixmap.fromImage(qImage))
pixmap = QtGui.QPixmap('pose4.jpg_keypoint.jpg')
self.ui.label_show4.setPixmap(pixmap)
def stop(self):
self.timer_camera.stop() # 关闭定时器
self.cap.release() # 释放视频流
self.ui.label_treated.clear() # 清空视频显示区域
self.ui.label_treated_2.clear() # 清空视频显示区域
self.ui.label_treated_3.clear() # 清空视频显示区域
self.ui.label_treated_4.clear() # 清空视频显示区域
def pdf(self):
id = self.ui.id.toPlainText()
name = self.ui.name.toPlainText()
age = self.ui.age.toPlainText()
sex = self.ui.sex.currentText()
time = self.time
if(self.list1 == [] or self.list2 == [] or self.list3 == [] or self.list4 == []):
msg_box = QMessageBox(QMessageBox.Warning, '警告', '请确保所有视图都已采集')
msg_box.exec_()
else:
self.pdf_process(id,name, age, sex,time, self.list1, self.list2, self.list3, self.list4)
def displayPage1(self):
self.ui.stackedWidget.setCurrentIndex(0)
def displayPage2(self):
self.ui.stackedWidget.setCurrentIndex(1)
def displayPage3(self):
self.ui.stackedWidget.setCurrentIndex(2)
def displayPage4(self):
self.ui.stackedWidget.setCurrentIndex(3)
def displayPage5(self):
self.ui.stackedWidget.setCurrentIndex(4)
def mouse(self, imgs,x_center,y_center,radius):
def mouse_LButtonDown(event, x, y, flags, param):
global temp
if event == cv2.EVENT_LBUTTONDOWN:
for i in range(len(x_center)):
if (x - x_center[i]) ** 2 + (y - y_center[i]) ** 2 <= radius ** 2:
temp = i
if event == cv2.EVENT_LBUTTONUP:
x_center[temp] = x
y_center[temp] = y
cv2.namedWindow('Modify', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Modify', 800, 600)
cv2.setMouseCallback('Modify', mouse_LButtonDown)
color = (0, 255, 0)
while True:
img = cv2.imread(imgs)
for i in range(len(x_center)):
cv2.circle(img, (x_center[i], y_center[i]), 4, color, -1, lineType=cv2.FILLED)
cv2.imshow('Modify', img)
key = cv2.waitKey(1)
if key == ord('q'):
break
cv2.destroyAllWindows()
return x_center, y_center
def fix1(self):
x_center,y_center = self.mouse("pose1.jpg",self.x1,self.y1,10)
angel_shoulder, str_shoulder, angel_xo1, angel_xo2, str_xo, diff_leg, str2_leg = models2("pose1.jpg", x_center,
y_center).sum()
pixmap = QtGui.QPixmap('pose1.jpg')
self.ui.label_show1.setPixmap(pixmap)
self.list1.clear()
self.list1.append(angel_shoulder)
self.list1.append(str_shoulder)
self.list1.append(angel_xo1)
self.list1.append(angel_xo2)
self.list1.append(str_xo)
self.list1.append(diff_leg)
self.list1.append(str2_leg)
def fix2(self):
x_center,y_center = self.mouse("pose2.jpg", self.x2, self.y2, 10)
angel_head, str_head = models2("pose2.jpg", x_center,y_center).head()
pixmap = QtGui.QPixmap('pose2.jpg')
self.ui.label_show2.setPixmap(pixmap)
self.list2.clear()
self.list2.append(angel_head)
self.list2.append(str_head)
def fix3(self):
x_center,y_center = self.mouse("pose3.jpg", self.x3, self.y3, 10)
angel_pelvis, str_pelvis = models2("pose3.jpg", x_center,y_center).Pelvis()
pixmap = QtGui.QPixmap('pose3.jpg')
self.ui.label_show3.setPixmap(pixmap)
self.list3.clear()
self.list3.append(angel_pelvis)
self.list3.append(str_pelvis)
def fix4(self):
x_center,y_center = self.mouse("pose4.jpg", self.x4, self.y4, 10)
angel_shoulder, str_shoulder, angel_xo1, angel_xo2, str_xo, diff_leg, str2_leg = models2("pose4.jpg", x_center,y_center).sum()
pixmap = QtGui.QPixmap('pose4.jpg')
self.ui.label_show4.setPixmap(pixmap)
self.list4.clear()
self.list4.append(angel_shoulder)
self.list4.append(str_shoulder)
self.list4.append(angel_xo1)
self.list4.append(angel_xo2)
self.list4.append(str_xo)
self.list4.append(diff_leg)
self.list4.append(str2_leg)
def pdf_process(self,id,name,age,sex,time,list1,list2,list3,list4):
filetypes = [('PDF files', '*.pdf')]
# 获取用户想要保存的文件名和路径
file_path = asksaveasfilename(filetypes=filetypes, defaultextension='.pdf')
if not file_path:
return # 用户取消了操作
'''
生成pdf
'''
# 设置中文字体名称为微软雅黑
pdfmetrics.registerFont(TTFont('msyh', 'msyh.ttf'))
# 容纳所有的PDF元素
self.elements = []
'''
添加标题文字
'''
# 读取reportlab定义好的样式表
style = getSampleStyleSheet()
title = """ <para><font face="msyh">体态系统报告</font></para>"""
self.elements.append(Paragraph(title, style['Title']))
self.elements.append(Spacer(1, 0.2 * inch))
'''
添加小标题
'''
self.elements.append(Paragraph("""<font face="msyh">1. 用户信息</font>""", style["h3"]))
self.elements.append(Spacer(1, 0.2 * inch))
# 绘制表格
def draw_table(*args):
col_width = 100
style = [
('FONTNAME', (0, 0), (-1, -1), 'msyh'), # 字体
('BACKGROUND', (0, 0), (-1, 0), '#d5dae6'), # 设置第一行背景颜色
('ALIGN', (0, 0), (-1, -1), 'CENTER'), # 对齐
('VALIGN', (-1, 0), (-2, 0), 'MIDDLE'), # 对齐
('GRID', (0, 0), (-1, -1), 0.5, colors.grey), # 设置表格框线为grey色,线宽为0.5
]
table = Table(args, colWidths=col_width, style=style)
return table
# 添加表格数据
data = [('编号', '姓名', '年龄', '性别', '时间'),
(id, name, age, sex, time)
]
self.elements.append(draw_table(*data))
angel_shoulder = list1[0]
str_shoulder = list1[1]
angel_xo1 = list1[2]
angel_xo2 = list1[3]
str_xo = list1[4]
diff_leg = list1[5]
str2_leg = list1[6]
self.elements.append(Paragraph("""<font face="msyh">2. 体检结果</font>""", style["h3"]))
self.elements.append(Spacer(1, 0.2 * inch))
content2 = " ① 肩膀度数: " + str(angel_shoulder) + "°,肩膀状态: " + str_shoulder + ";"
description2 = """
<para>
<font face="msyh">
""" + content2 + """
</font>
</para>
"""
self.elements.append(Paragraph(description2, style["h5"]))
self.elements.append(Spacer(1, 0.2 * inch))
'''
分开
'''
content2 = " ②长短腿状态: " + str2_leg + " ;"
description2 = """
<para>
<font face="msyh">
""" + content2 + """
</font>
</para>
"""
self.elements.append(Paragraph(description2, style["h5"]))
self.elements.append(Spacer(1, 0.2 * inch))
content2 = " ③腿型度数: 右腿" + str(angel_xo1) + "°,左腿: " + str(
angel_xo2) + "°,腿型判断: " + str_xo + ";"
description2 = """
<para>
<font face="msyh">
""" + content2 + """
</font>
</para>
"""
self.elements.append(Paragraph(description2, style["h5"]))
self.elements.append(Spacer(1, 0.2 * inch))
'''
以下均为测试内容
'''
angel_head = list2[0]
str_head = list2[1]
content2 = " ④ 头部前倾度数: " + str(
angel_head) + "°,头部状态: " + str_head + ";"
description2 = """
<para>
<font face="msyh">
""" + content2 + """
</font>
</para>
"""
self.elements.append(Paragraph(description2, style["h5"]))
self.elements.append(Spacer(1, 0.2 * inch))
angel_pelvis = list3[0]
str_pelvis = list3[1]
content2 = " ⑤ 盆骨前倾度数: " + str(
angel_pelvis) + "°,盆骨状态: " + str_pelvis + ";"
description2 = """
<para>
<font face="msyh">
""" + content2 + """
</font>
</para>
"""
self.elements.append(Paragraph(description2, style["h5"]))
self.elements.append(Spacer(1, 0.2 * inch))
'''
此处截止
'''
'''
添加小标题
'''
from reportlab.platypus import Image
self.elements.append(Paragraph("""<font face="msyh">3. 模型检测的四视图</font>""", style["h3"]))
self.elements.append(Spacer(1, 0.2 * inch))
self.elements.append(Paragraph("""<font face="msyh">3.1 正视图</font>""", style["h4"]))
self.elements.append(Spacer(1, 0.2 * inch))
img1 = cv2.imread('pose1.jpg_keypoint.jpg')
resize1 = cv2.resize(img1, (350, 300))
cv2.imwrite('pose1.jpg_keypoint.jpg', resize1)
img1 = Image('pose1.jpg_keypoint.jpg')
self.elements.append(img1)
self.elements.append(Spacer(1, 0.2 * inch))
self.elements.append(Paragraph("""<font face="msyh">3.2 左视图</font>""", style["h4"]))
self.elements.append(Spacer(1, 0.2 * inch))
img2 = cv2.imread('pose2.jpg_keypoint.jpg')
resize2 = cv2.resize(img2, (350, 300))
cv2.imwrite('pose2.jpg_keypoint.jpg', resize2)
img2 = Image('pose2.jpg_keypoint.jpg')
self.elements.append(img2)
self.elements.append(Spacer(1, 0.2 * inch))
self.elements.append(Paragraph("""<font face="msyh">3.3 后视图</font>""", style["h4"]))
self.elements.append(Spacer(1, 0.2 * inch))
img3 = cv2.imread('pose3.jpg_keypoint.jpg')
resize3 = cv2.resize(img3, (350, 300))
cv2.imwrite('pose3.jpg_keypoint.jpg', resize3)
img3 = Image('pose3.jpg_keypoint.jpg')
self.elements.append(img3)
self.elements.append(Spacer(1, 0.2 * inch))
self.elements.append(Paragraph("""<font face="msyh">3.4 俯视图</font>""", style["h4"]))
self.elements.append(Spacer(1, 0.2 * inch))
img4 = cv2.imread('pose4.jpg_keypoint.jpg')
resize4 = cv2.resize(img4, (350, 300))
cv2.imwrite('pose4.jpg_keypoint.jpg', resize4)
img4 = Image('pose4.jpg_keypoint.jpg')
self.elements.append(img4)
# 原始图片或者修改后的图片
self.elements.append(Paragraph("""<font face="msyh">4. 修改后的四视图</font>""", style["h3"]))
self.elements.append(Spacer(1, 0.2 * inch))
self.elements.append(Paragraph("""<font face="msyh">4.1 正视图</font>""", style["h4"]))
self.elements.append(Spacer(1, 0.2 * inch))
img1 = cv2.imread('pose1.jpg')
resize1 = cv2.resize(img1, (350, 300))
cv2.imwrite('pose1.jpg', resize1)
img1 = Image('pose1.jpg')
self.elements.append(img1)
self.elements.append(Spacer(1, 0.2 * inch))
self.elements.append(Paragraph("""<font face="msyh">4.2 左视图</font>""", style["h4"]))
self.elements.append(Spacer(1, 0.2 * inch))
img2 = cv2.imread('pose2.jpg')
resize2 = cv2.resize(img2, (350, 300))
cv2.imwrite('pose2.jpg', resize2)
img2 = Image('pose2.jpg')
self.elements.append(img2)
self.elements.append(Spacer(1, 0.2 * inch))
self.elements.append(Paragraph("""<font face="msyh">4.3 后视图</font>""", style["h4"]))
self.elements.append(Spacer(1, 0.2 * inch))
img3 = cv2.imread('pose3.jpg')
resize3 = cv2.resize(img3, (350, 300))
cv2.imwrite('pose3.jpg', resize3)
img3 = Image('pose3.jpg')
self.elements.append(img3)
self.elements.append(Spacer(1, 0.2 * inch))
self.elements.append(Paragraph("""<font face="msyh">4.4 俯视图</font>""", style["h4"]))
self.elements.append(Spacer(1, 0.2 * inch))
img4 = cv2.imread('pose4.jpg')
resize4 = cv2.resize(img4, (350, 300))
cv2.imwrite('pose4.jpg', resize4)
img4 = Image('pose4.jpg')
self.elements.append(img4)
self.elements.append(Spacer(1, 0.2 * inch))
# 生成PDF文件
# name = str(name) + '_体态系统报告.pdf'
doc = SimpleDocTemplate(
file_path,
pagesize=(A4[0], A4[1]),
topMargin=30,
bottomMargin=30
)
doc.build(self.elements)
#写入pdf文件
import os
os.system(name)
# 将pdf另存其他路径
# os.rename(name, 'D:/Python/test/'+name)
# 删除中间文件
# os.remove('pose1.jpg')
# os.remove('pose2.jpg')
# os.remove('pose3.jpg')
# os.remove('pose4.jpg')
# os.remove('pose1.jpg_keypoint.jpg')
# os.remove('pose2.jpg_keypoint.jpg')
# os.remove('pose3.jpg_keypoint.jpg')
# os.remove('pose4.jpg_keypoint.jpg')
if __name__ == '__main__':
app = QApplication([])
zhongke = zhong()
zhongke.ui.show()
app.exec()
04-17
1567
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交