- 测试视频
2021电赛D题基于互联网的摄像测量系统
作为业余选手,搞个省一也还行。终于不是铜牌了。
还没写完
2021 全国电子设计大赛 D题:基于互联网的摄像测量系统 1. 题目:设计并制作一个基于互联网的摄像测量系统。系统构成如图 1 所示。图中边
长为 1 米的正方形区域三个顶点分别为 A、B 和 O。系统有两个独立的摄像节点,分别放置在 A 和 B。两个摄像节点拍摄尽量沿 AO、BO 方向正交,并通过一个百兆/千兆以太网交换机与连接在该交换机的一个终端节点实现网络互联。交换机必须为互联网通用交换机,使用的网口可以任意指定。在 O 点上方悬挂一个用柔性透明细线吊起的激光笔,透明细线长度为 l。激光笔常亮向下指示,静止下垂时的指示光点与 O 点重合。拉动激光笔偏离静止点的距离小于 10cm,松开后时激光笔自由摆动,应保证激光笔指示光点的轨迹经 O 点往复直线运动,轨迹与 OA 边的夹角为 θ。利用该系统实现对长度 l 和角度 θ 的测量。
一个激光笔摆动,识别然后算周期,在计算摆长吗。。。
原本不想做这个题的,第一想的是F题。车对我们来说确实很熟悉【之前用openmv做过越野车、激光雷达+ SLAM 做过智能车】。。。但是但是经过指导老师的讨论,我们只有四个参赛队伍,因为已经有两个队伍选了F题,我们只好勉强选择了D题。
3. 器材
…
代码: 1. 硬件:【我只提思路、不管实现】 → 硬件源码← 2. 软件:【Ctrl+C、V】
需要的技术点:python OpenCV 实现全程
-
Python3 读取本地、网络摄像头流
-
QtPy 的使用
import sys from PyQt5.QtWidgets import * from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("2021") MainWindow.resize(400, 400) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.l = QtWidgets.QLabel(self.centralwidget) self.l.setGeometry(QtCore.QRect(0, 10, 200, 200)) self.l.setText("长度:") font = QtGui.QFont() font.setPointSize(30) self.l.setFont(font) self.l.setAlignment(QtCore.Qt.AlignCenter) self.l.setObjectName("label") self.l.setVisible(True) MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) if __name__ == '__main__': app = QApplication(sys.argv) mainWindow = QMainWindow() ui = Ui_MainWindow() ui.setupUi(mainWindow) mainWindow.show() sys.exit(app.exec_())
-
Python3 多线程
-
Opencv 帧差法物体追踪
import cv2 firstframe = None if __name__ == '__main__': cap = cv2.VideoCapture(0) while 1: ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 灰度 gray = cv2.GaussianBlur(gray, (21, 21), 0) # 高斯滤波 if firstframe is None: # 记录上次的状态,实现侦差 firstframe = gray continue # 获取帧差 frameDelta = cv2.absdiff(firstframe, gray) # 计算当前帧与背景之差的绝对值 firstframe = gray # 重新赋值 thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1] # 二值化 thresh = cv2.dilate(thresh, None, iterations=2) # 膨胀 cv2.imshow((u"1"), frame) cv2.imshow((u"2"), gray) cv2.imshow((u"3"), thresh) if ord('q') == cv2.waitKey(10): cap.release() cv2.destroyAllWindows() exit(0)
-
若干次卡尔曼滤波
def KalmanFilter(z, n_iter=20, init=0): # 这里是假设A=1,H=1的情况 # intial parameters sz = (n_iter,) # size of array # Q = 1e-5 # process variance Q = 1e-6 # process variance # allocate space for arrays xhat = numpy.zeros(sz) # a posteri estimate of x P = numpy.zeros(sz) # a posteri error estimate xhatminus = numpy.zeros(sz) # a priori estimate of x Pminus = numpy.zeros(sz) # a priori error estimate K = numpy.zeros(sz) # gain or blending factor R = 0.1 ** 2 # estimate of measurement variance, change to see effect # intial guesses xhat[0] = init P[0] = 1.0 A = 1 H = 1 for k in range(1, n_iter): # time update xhatminus[k] = A * xhat[k - 1] # X(k|k-1) = AX(k-1|k-1) + BU(k) + W(k),A=1,BU(k) = 0 Pminus[k] = A * P[k - 1] + Q # P(k|k-1) = AP(k-1|k-1)A' + Q(k) ,A=1 # measurement update K[k] = Pminus[k] / (Pminus[k] + R) # Kg(k)=P(k|k-1)H'/[HP(k|k-1)H' + R],H=1 xhat[k] = xhatminus[k] + K[k] * (z[k] - H * xhatminus[k]) # X(k|k) = X(k|k-1) + Kg(k)[Z(k) - HX(k|k-1)], H=1 P[k] = (1 - K[k] * H) * Pminus[k] # P(k|k) = (1 - Kg(k)H)P(k|k-1), H=1 return xhat
-
实际测量数据的校验
下面是实际遇到暂时无法解决的,直接 if else 处理if lm > 140 and l >= 135: l = 147 if lm >= 137.5 and lm <= 142.5 and l >= 130 and l <= 135: l = 142 if l * 2 <= lm: l = lm else: l = (l + lm) / 2 if l <= 52: l = 52 if l >= 148: l = 148
-
串口通信
-
Python Pexpect 实现所有节点一键关机
最终终端节点显示:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)