|
|
import logging
|
|
|
import os
|
|
|
import shutil
|
|
|
|
|
|
import PIL
|
|
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
|
|
import numpy as np
|
|
|
import matplotlib
|
|
|
import sys
|
|
|
import cv2
|
|
|
from djitellopy import tello
|
|
|
import matplotlib.pyplot as plt
|
|
|
# matplotlib.figure 模块提供了顶层的Artist(图中的所有可见元素都是Artist的子类),它包含了所有的plot元素
|
|
|
from matplotlib.figure import Figure
|
|
|
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg # pyqt5的画布
|
|
|
import calib_RGB
|
|
|
import huidu_shuai,qingxi_shuai,xiangsu_shuai,video_to_photo
|
|
|
import argparse
|
|
|
|
|
|
class MyMatplotlibFigure(FigureCanvasQTAgg):
|
|
|
"""
|
|
|
创建一个画布类,并把画布放到FigureCanvasQTAgg
|
|
|
"""
|
|
|
def __init__(self, width=10, heigh=10, dpi=100):
|
|
|
plt.rcParams['figure.facecolor'] = 'r' # 设置窗体颜色
|
|
|
plt.rcParams['axes.facecolor'] = 'b' # 设置绘图区颜色
|
|
|
self.width_ = width
|
|
|
self.heigh_ = heigh
|
|
|
self.dpi = dpi
|
|
|
self.figs = Figure(figsize=(self.width_, self.heigh_), dpi=self.dpi)
|
|
|
super(MyMatplotlibFigure, self).__init__(self.figs) # 在父类种激活self.fig, 否则不能显示图像
|
|
|
#self.axes = self.figs.add_subplot(111,projection='3d')
|
|
|
fig = plt.figure()
|
|
|
#fig.suptitle('3D reconstructed', fontsize=16)
|
|
|
#self.axes = fig.gca(projection='3d')
|
|
|
self.axes=fig.add_subplot(111, projection='3d')
|
|
|
|
|
|
def mat_plot_drow_axes(self, t, s, l):
|
|
|
|
|
|
"""
|
|
|
用清除画布刷新的方法绘图
|
|
|
:return:
|
|
|
"""
|
|
|
self.axes.cla() # 清除绘图区
|
|
|
self.axes.spines['top'].set_visible(False) # 顶边界不可见
|
|
|
self.axes.spines['right'].set_visible(False) # 右边界不可见
|
|
|
# fig = plt.figure()
|
|
|
# fig.suptitle('3D reconstructed', fontsize=16)
|
|
|
# ax = plt.axes(projection='3d')
|
|
|
# 设置左、下边界在(0,0)处相交
|
|
|
# self.axes.spines['bottom'].set_position(('data', 0)) # 设置y轴线原点数据为 0
|
|
|
self.axes.spines['left'].set_position(('data', 0)) # 设置x轴线原点数据为 0
|
|
|
# self.axes.plot(t, s, l, 'b.')
|
|
|
# self.set_xlabel('x axis')
|
|
|
# self.set_ylabel('y axis')
|
|
|
# self.set_zlabel('z axis')
|
|
|
# self.view_init(elev=135, azim=90)
|
|
|
# plt.savefig('Reconstruction.jpg')
|
|
|
# plt.show()
|
|
|
# self.axes.plot(t, s, l, 'o-r', linewidth=0.5)
|
|
|
self.axes.scatter(t,s,l, 'b.')
|
|
|
#self.axes.plot_surface(t,s,l)
|
|
|
self.axes.set_xlabel('x axis')
|
|
|
self.axes.set_ylabel('y axis')
|
|
|
self.axes.set_zlabel('z axis')
|
|
|
self.axes.view_init(elev=135, azim=90)
|
|
|
plt.savefig('Reconstruction.jpg')
|
|
|
plt.show()
|
|
|
self.figs.canvas.draw() # 这里注意是画布重绘,self.figs.canvas
|
|
|
self.figs.canvas.flush_events() # 画布刷新self.figs.canvas
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Ui_MainWindow(QtWidgets.QWidget):
|
|
|
def __init__(self, parent=None):
|
|
|
super().__init__(parent)
|
|
|
self.timer_camera = QtCore.QTimer()
|
|
|
self.cap = cv2.VideoCapture()
|
|
|
self.CAM_NUM = 0
|
|
|
|
|
|
self.set_ui()
|
|
|
self.slot_init()
|
|
|
|
|
|
|
|
|
def set_ui(self):
|
|
|
|
|
|
self.setWindowTitle('虚拟沙盘') # 标题
|
|
|
|
|
|
self.resize(1200, 800) # 窗口尺寸
|
|
|
|
|
|
#self.status = self.statusTip('虚拟沙盘3D建模系统') # 消息
|
|
|
|
|
|
#self.status.showMessage()
|
|
|
self.setWindowIcon(QIcon("./img/mou.ico")) # 图标
|
|
|
|
|
|
self.drawn_back()
|
|
|
|
|
|
self.__layout_main = QtWidgets.QVBoxLayout()
|
|
|
self.__layout_fun_button = QtWidgets.QHBoxLayout()
|
|
|
self.__layout_data_show = QtWidgets.QHBoxLayout()
|
|
|
self.button_open_camera = QtWidgets.QPushButton('打开摄像头')
|
|
|
self.button_operate = QtWidgets.QPushButton('键盘控制')
|
|
|
self.button_takephoto = QtWidgets.QPushButton('视频转图片')
|
|
|
self.button_make = QtWidgets.QPushButton('建模')
|
|
|
self.button_close = QtWidgets.QPushButton('退出')
|
|
|
|
|
|
self.button_open_camera.setMinimumHeight(50)
|
|
|
self.button_close.setMinimumHeight(50)
|
|
|
self.button_operate.setMinimumHeight(50)
|
|
|
self.button_takephoto.setMinimumHeight(50)
|
|
|
self.button_make.setMinimumHeight(50)
|
|
|
self.button_open_camera.move(10, 100)
|
|
|
self.label_show_camera = QtWidgets.QLabel()
|
|
|
#self.label_show_camera.move(400,400)
|
|
|
self.label_show_camera.setFixedSize(841, 681)
|
|
|
self.__layout_fun_button.addWidget(self.button_open_camera)
|
|
|
self.__layout_fun_button.addWidget(self.button_operate)
|
|
|
self.__layout_fun_button.addWidget(self.button_takephoto)
|
|
|
self.__layout_fun_button.addWidget(self.button_make)
|
|
|
self.__layout_fun_button.addWidget(self.button_close)
|
|
|
self.__layout_main.addLayout(self.__layout_fun_button)
|
|
|
self.__layout_main.addWidget(self.label_show_camera)
|
|
|
self.setLayout(self.__layout_main)
|
|
|
##########################################
|
|
|
|
|
|
|
|
|
|
|
|
# 将信号与槽关联
|
|
|
#self.btn1.clicked.connect(self.onClick_Button)
|
|
|
#self.btn2.clicked.connect(self.showDialog)
|
|
|
def slot_init(self):
|
|
|
self.button_open_camera.clicked.connect(
|
|
|
self.button_open_camera_clicked)
|
|
|
self.timer_camera.timeout.connect(self.show_camera)
|
|
|
self.button_close.clicked.connect(self.onClick_Button)
|
|
|
self.button_make.clicked.connect(self.showDialog)
|
|
|
self.button_takephoto.clicked.connect(self.take_photo)
|
|
|
self.button_operate.clicked.connect(self.keyboard_control)
|
|
|
def drawn_back(self):
|
|
|
self.palette = QPalette()
|
|
|
self.palette.setBrush(QPalette.Background, QBrush(QPixmap("./img/back.jpeg")))
|
|
|
self.setPalette(self.palette)
|
|
|
def keyboard_control(self):
|
|
|
dialog = QtWidgets.QDialog()
|
|
|
dialog.resize(400, 300)
|
|
|
# button = QtWidgets.QPushButton('储存', dialog)
|
|
|
# button.clicked.connect(dialog.close)
|
|
|
# button.move(350, 550)
|
|
|
dialog.setWindowTitle('键盘控制')
|
|
|
dialog.setWindowModality(QtCore.Qt.ApplicationModal)
|
|
|
|
|
|
# dialog.__layout_main = QtWidgets.QHBoxLayout()
|
|
|
# dialog.__layout_fun_button = QtWidgets.QVBoxLayout()
|
|
|
# dialog.__layout_data_show = QtWidgets.QVBoxLayout()
|
|
|
# dialog.button_takeoff = QtWidgets.QPushButton('起飞')
|
|
|
# dialog.button_set_down = QtWidgets.QPushButton('降落')
|
|
|
# dialog.button.takeoff.setMinimumHeight(50)
|
|
|
# dialog.button_takeoff.move(250, 200)
|
|
|
# dialog.button_takeoff.setMinimumHeight(50)
|
|
|
# dialog.button_set_down.setMinimumHeight(50)
|
|
|
#
|
|
|
# dialog.button_takeoff.move(10, 100)
|
|
|
|
|
|
button_takeoff = QtWidgets.QPushButton('起飞', dialog)
|
|
|
button_takeoff.move(200, 100)
|
|
|
|
|
|
button_set_down = QtWidgets.QPushButton('降落', dialog)
|
|
|
button_set_down.move(200, 150)
|
|
|
|
|
|
|
|
|
|
|
|
lab1 = QLabel()
|
|
|
# lab1.resize(200, 200) # 重设Label大小
|
|
|
# lab1.setScaledContents(True) # 设置图片自适应窗口大小
|
|
|
lab1.setPixmap(QPixmap("./img/control.png"))
|
|
|
|
|
|
vbox = QVBoxLayout()
|
|
|
|
|
|
vbox.addWidget(lab1)
|
|
|
|
|
|
dialog.setLayout(vbox)
|
|
|
#dialog.label_show_camera = QtWidgets.QLabel()
|
|
|
# self.label_show_camera.move(400,400)
|
|
|
#dialog.label_show_camera.setFixedSize(841, 681)
|
|
|
# dialog.__layout_fun_button.addWidget(dialog.button_takeoff)
|
|
|
# dialog.__layout_fun_button.addWidget(dialog.button_set_down)
|
|
|
#
|
|
|
# # self.__layout_fun_button.addWidget(self.label)
|
|
|
# dialog.__layout_main.addLayout(dialog.__layout_fun_button)
|
|
|
# dialog.__layout_main.addWidget(lab1)
|
|
|
#
|
|
|
# dialog.setLayout(dialog.__layout_main)
|
|
|
|
|
|
#self.show()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dialog.show()
|
|
|
|
|
|
#sys.exit(app.exec_())
|
|
|
dialog.exec()
|
|
|
def take_photo(self):
|
|
|
#video to photo
|
|
|
args = video_to_photo.parse_args()
|
|
|
if not os.path.exists(args.output):
|
|
|
os.makedirs(args.output)
|
|
|
print('Called with args:')
|
|
|
print(args)
|
|
|
video_to_photo.process_video(args.input, args.output, args.skip_frame)
|
|
|
|
|
|
#灰度值筛选
|
|
|
dir2 = r"C:\Users\xinluo\PycharmProjects\pythonProject\Camera Roll"
|
|
|
dir1 = r"C:\Users\xinluo\PycharmProjects\pythonProject\Saved Pictures"
|
|
|
names = os.listdir(dir1)
|
|
|
n = len(names)
|
|
|
print("文件数量", n)
|
|
|
res = 0
|
|
|
average_5 = 25565356
|
|
|
average_25 = 26409377
|
|
|
average_5_right = 10006019
|
|
|
# average_tmp = (average_25+average_5)//2
|
|
|
count = 0
|
|
|
# show(os.path.join(dir1, "uni4F6C.png"))
|
|
|
for i in range(n):
|
|
|
# 取图片
|
|
|
print(1234)
|
|
|
img = PIL.Image.open(os.path.join(dir1, names[i]))
|
|
|
file = os.path.join(dir1, names[i])
|
|
|
rmfile = os.path.join(dir2, names[i])
|
|
|
array = np.array(img)
|
|
|
num = array.sum(axis=0)
|
|
|
res_right = 0
|
|
|
for i in range(256, 512):
|
|
|
res_right += num[i]
|
|
|
average_5_right += res_right / n
|
|
|
#res_right > average_5_right
|
|
|
if (1):
|
|
|
print(4321)
|
|
|
shutil.copyfile(file, rmfile)
|
|
|
os.remove(file)
|
|
|
count += 1
|
|
|
print(average_5_right)
|
|
|
print(count)
|
|
|
#像素筛选
|
|
|
xiangsu_shuai.pixel()
|
|
|
#清晰度筛选
|
|
|
qingxi_shuai.read_path(r"C:\Users\xinluo\PycharmProjects\pythonProject\Camera Roll")
|
|
|
|
|
|
def button_open_camera_clicked(self):
|
|
|
if self.timer_camera.isActive() == False:
|
|
|
flag = self.cap.open(self.CAM_NUM)
|
|
|
if flag == False:
|
|
|
msg = QtWidgets.QMessageBox.warning(self, 'warning', "请检查无人机是否连接正确", buttons=QtWidgets.QMessageBox.Ok)
|
|
|
else:
|
|
|
self.timer_camera.start(30)
|
|
|
self.button_open_camera.setText('关闭摄像头')
|
|
|
else:
|
|
|
self.timer_camera.stop()
|
|
|
self.cap.release()
|
|
|
self.label_show_camera.clear()
|
|
|
self.button_open_camera.setText('打开摄像头')
|
|
|
|
|
|
def show_camera(self):
|
|
|
self.Drone = tello.Tello() # 创建飞行器对象
|
|
|
self.Drone.connect() # 连接到飞行器
|
|
|
|
|
|
self.Drone.streamon() # 开启视频传输
|
|
|
self.Drone.LOGGER.setLevel(logging.ERROR) # 只显示错误信息
|
|
|
#sleep(5) # 等待视频初始化
|
|
|
#kp.init() # 初始化按键处理模块
|
|
|
flag,OriginalImage = self.Drone.get_frame_read()
|
|
|
#flag, self.image = self.cap.read()
|
|
|
show = cv2.resize(OriginalImage, (640, 480))
|
|
|
show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
|
|
|
showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0],
|
|
|
QtGui.QImage.Format_RGB888)
|
|
|
self.label_show_camera.setPixmap(QtGui.QPixmap.fromImage(showImage))
|
|
|
|
|
|
#getKeyboardInput(drone=Drone, speed=70, image=Image) # 按键控制
|
|
|
cv2.imshow("Drone Control Centre", OriginalImage)
|
|
|
def showDialog(self):
|
|
|
dialog = QtWidgets.QDialog()
|
|
|
dialog.resize(1800, 1600)
|
|
|
button = QtWidgets.QPushButton('储存', dialog)
|
|
|
button.clicked.connect(dialog.close)
|
|
|
button.move(1350, 750)
|
|
|
dialog.setWindowTitle('建模视图')
|
|
|
dialog.setWindowModality(QtCore.Qt.ApplicationModal)
|
|
|
|
|
|
dialog.label = QtWidgets.QLabel(dialog)
|
|
|
dialog.label.setGeometry(QtCore.QRect(0, 0, 800, 600))
|
|
|
# 实例化自定义画布类
|
|
|
dialog.canvas = MyMatplotlibFigure(width=5, heigh=4, dpi=100)
|
|
|
#dialog.plotcos()
|
|
|
# t = np.arange(0.0, 5.0, 0.01)
|
|
|
# s = np.cos(2 * np.pi * t)
|
|
|
# dialog.canvas.mat_plot_drow_axes(t, s)
|
|
|
# dialog.canvas.figs.suptitle("sin") # 设置标题
|
|
|
# 重建3D点
|
|
|
dialog.canvas.mat_plot_drow_axes(Points3D[0], Points3D[1], Points3D[2])
|
|
|
dialog.canvas.figs.suptitle("SanDCJ") # 设置标题
|
|
|
|
|
|
dialog.hboxlayout = QtWidgets.QHBoxLayout(dialog.label)
|
|
|
dialog.hboxlayout.addWidget(dialog.canvas)
|
|
|
#不展示dialog,只看figure
|
|
|
#dialog.exec()
|
|
|
|
|
|
|
|
|
|
|
|
def onClick_Button(self):
|
|
|
sender = self.sender() #获得button
|
|
|
#print(sender.text() + '按钮被按下')
|
|
|
app = QtWidgets.QApplication.instance()
|
|
|
#退出程序
|
|
|
app.quit()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
inter_corner_shape = (9, 6)
|
|
|
size_per_grid = 0.023
|
|
|
# 储存用来标定相机的照片,这里是为畸变的照片
|
|
|
img_dir = ".\\pic\\RGB_camera_calib_img_1"
|
|
|
img_type = "jpg"
|
|
|
# 储存标定相机之后的参数,应该相机的内外参数与畸变参数
|
|
|
CameraParam_Path = '.\\CameraParam.txt'
|
|
|
# 要重建的目标图片
|
|
|
Images_Path = 'SubstitutionCalibration_Image_1/*.jpg'
|
|
|
# 计算相机参数
|
|
|
calib_RGB.calib(inter_corner_shape, size_per_grid, img_dir, img_type, CameraParam_Path)
|
|
|
# 读取相机参数
|
|
|
config = calib_RGB.readfromfile(CameraParam_Path)
|
|
|
K = np.array(config['mtx'])
|
|
|
# 计算3D点
|
|
|
Points3D = calib_RGB.epipolar_geometric(Images_Path, K)
|
|
|
|
|
|
app = QtWidgets.QApplication(sys.argv)
|
|
|
ui = Ui_MainWindow()
|
|
|
ui.show()
|
|
|
sys.exit(app.exec_()) |