2021電賽D 題《基于互聯網的攝像測量系統》
- 任務
- 要求
- 說明
- 方案選擇
- 實作程序
任務
設計并制作一個基于互聯網的攝像測量系統,系統構成如圖 1 所示,圖中邊長為 1 米的正方形區域三個頂點分別為 A、B 和 O,系統有兩個獨立的攝像節點,分別放置在 A 和 B,兩個攝像節點拍攝盡量沿 AO、BO 方向正交,并通過一個百兆/千兆以太網交換機與連接在該交換機的一個終端節點實作網路互聯,交換機必須為互聯網通用交換機,使用的網口可以任意指定,在 O 點上方懸掛一個用柔性透明細線吊起的激游標,透明細線長度為 l,激游標常亮向下指示,靜止下垂時的指示光點與 O 點重合,拉動激游標偏離靜止點的距離小于 10cm,松開后時激游標自由擺動,應保證激游標指示光點的軌跡經 O 點往復直線運動,軌跡與 OA 邊的夾角為 θ,利用該系統實作對長度 l 和角度 θ 的測量,

要求
- 基本要求
(1)設計并制作兩個獨立的攝像節點,每個節點由一個攝像頭和相應的電路組成,兩個攝像節點均可以拍攝到激游標的運動視頻并顯示,
(2)設計并制作終端節點,在終端顯示幕上可以分別和同時顯示兩個攝像節點拍攝的實時視頻,在視頻中可以識別出激游標,并在視頻中用紅色方框實時框住激游標輪廓,
(3)測量系統在終端節點設定一鍵啟動,從激游標擺動開始計時,測量系統通過對激游標周期擺動視頻信號的處理,自動測量長度 l,50cm≤ l ≤150cm,θ 角度自定,測量完成時,終端聲光提示并顯示長度 l,要求測量誤差絕對值小于 2cm,測量時間小于 30 秒, - 發揮部分
(1)一鍵啟動后,測量系統通過兩個獨立攝像節點的網路協同作業,當 θ=0° 和 θ=90°時,能自動測量長度 l,50cm≤ l ≤150cm,要求測量誤差絕對值小于 2cm,測量時間小于 30 秒,
(2)一鍵啟動后,可以測量 θ,0°≤ θ ≤90°,要求測量誤差絕對值小于 5°,測量時間小于 30 秒,
(3)其他,
說明
(1)擺的柔性透明細線建議采用單股透明的釣魚線,直徑小于 0.2mm,不
要采用一般捻和的縫紉線,防止激游標吊起后自轉,考慮實際擺與理想擺的差異
以及各地重力加速度會有差異,系統應具有校準處理的功能,
(2)系統獲取擺的資訊必須來自攝像節點拍攝的視頻資訊,不得在擺及其
附近安裝其他傳感器和附加裝置,θ角度的標定可利用量角器測量激光指示光點
軌跡與 OA 邊的夾角實作,
(3)兩個攝像節點拍攝的取景范圍僅限激游標擺動區間的內容,不能包含
全部柔性細線的內容和地面激光光點軌跡的內容,在測量 l 和 θ 的程序中,如果
視頻包含上述內容,需用紙片遮擋這部分內容,否則不進行測驗,
(4)拍攝背景為一般實驗室場景,背景物體靜止即可,不得要求額外處理,
(5)三個節點不得采用臺式計算機和筆記本電腦
方案選擇
檔案說僅說明了三個節點不得采用臺式計算機和筆記本電腦,因此下列方案個人覺得應該可以使用(僅代表個人觀點,不負任何責任,最終解釋在比賽主辦方)
方案一:openmv
方案二:K210
方案三:樹莓派+opencv
方案四:jetson系列
實作程序
打算使用k210方案
圖傳方案使用[Maixpy]+[vofa+]實作K210串口圖傳【POST提交圖片】
# Untitled - By: Lithromantic - 周二 3月 9 2021
from fpioa_manager import fm
fm.register(10, fm.fpioa.UART1_TX, force=True)
fm.register(9, fm.fpioa.UART1_RX, force=True)
from machine import UART
import sensor, image, time,network
import socket
ssid="1234"
key="11111111"
ADDR = ("192.168.137.1", 80)
uart_A = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)
net=network.ESP8285(uart_A)
net.connect(ssid, key)
print(net.ifconfig())
sock = socket.socket()
sock.connect(ADDR)
sock.settimeout(10)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
post_request_info = b'''POST /photo/ HTTP/1.1
Host: 127.0.0.1:80
FILENAME:JPG
Content-Type: application/multipart/form-data
Content-Length: '''
usrname=b'''
'''
while (True):
img = sensor.snapshot()
img = img.compress(quality=50)#壓縮圖片為jpg,質量為10%
img_size=img.size()
img_bytes=img.to_bytes()
post_bytes=post_request_info+str(img_size)+usrname
print(post_bytes)
sock.send(post_bytes)
block = int(len(img_bytes)/2048)
for i in range(block):
sock.send(img_bytes[i*2048:(i+1)*2048])
sock.send(img_bytes[block*2048:])
res = sock.recv(8096)
print(res)
使用從K210從攝像頭中獲取影像
import sensor, lcd
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
sensor.skip_frames()
img = sensor.snapshot()
print(img)
import sensor: 首先匯入內置的sensor(攝像頭)庫
sensor.reset(): 初始化攝像頭,這里失敗需要檢查硬體
sensor.set_pixformat(sensor.RGB565): 設定攝像頭為RGB565格式,默認都是用RGB565即可
sensor.set_framesize(sensor.QVGA): 解析度為QVGA,即320x240
sensor.run(1): 開始運行,在現在的版本中也可以不呼叫,在上面設定完成后,攝像頭會自動開始運行
sensor.skip_frames(): 攝像頭剛啟動時,影像質量還沒穩定,所以跳過一些影像
sensor.snapshot():從攝像頭取一幀影像資料,回傳值是一張影像的物件
測驗尋找激游標色塊
import sensor
import image
import lcd
import time
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
laser_threshold = (0, 80, -70, -10, -0, 30)
while True:
img=sensor.snapshot()
blobs = img.find_blobs([laser_threshold])
if blobs:
for b in blobs:
tmp=img.draw_rectangle(b[0:4])
tmp=img.draw_cross(b[5], b[6])
c=img.get_pixel(b[5], b[6])
lcd.display(img)
特別說明: 從圖片中查找所有色塊物件(image.blob)串列, 傳入的顏色閾值引數按照 LAB 格式(l_lo,l_hi,a_lo,a_hi,b_lo,b_hi)
重要:將色塊物件在影像中用矩形框標識出來,修改這個值:tmp=img.draw_rectangle(b[0:4])
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/348451.html
標籤:其他
下一篇:程式員必須要懂的計算機核心概念
