2317浏览
查看: 2317|回复: 6

[项目] 行空板——视频车

[复制链接]
【项目设计】
回传行空板摄像头实时图像,并能控制行空板小车。

【行空板与电脑端测试】
行空板——视频车图2




行空板上server.py程序:
  1. import socket
  2. import cv2
  3. import sys
  4. import numpy as np
  5. address =('192.168.31.8', 5006)  # 服务端地址和端口
  6. ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  7. ser.bind(address)
  8. ser.listen(5)
  9. # 阻塞式
  10. print('waiting。。。')
  11. conn, addr = ser.accept()
  12. print('建立连接...')
  13. print('连接对象:', addr)
  14. cap = cv2.VideoCapture(0)
  15. frames_num=cap.get(7)
  16. print('视频总帧数:',frames_num)
  17. print('发送目标...')
  18. count = 0
  19. while cap.isOpened():
  20.     try:
  21.         data = conn.recv(1024)
  22.         data = data.decode()
  23.         if not data:
  24.             break
  25.         ret, frame = cap.read()
  26.         if not ret:
  27.             continue
  28.         frame = cv2.resize(frame,(320,240))
  29.         cv2.imshow('send', frame)
  30.         cv2.waitKey(1)
  31.         count += 1
  32.         # 数据打包有很多方式,也可以用json打包
  33.         img_encode = cv2.imencode('.jpg', frame)[1]
  34.         data_encode = np.array(img_encode)
  35.         str_encode = data_encode.tostring()
  36.         conn.sendall(str_encode)
  37.     except KeyboardInterrupt:
  38.         print('KeyboardInterrupt')
  39.         sys.exit(0)
复制代码
电脑端程序computer.py
  1. import socket
  2. import sys
  3. import cv2
  4. import numpy as np
  5. import time
  6. address = ('192.168.31.8', 5006)  # 服务端地址和端口
  7. cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8. try:
  9.     cli.connect(address)  # 尝试连接服务端
  10. except Exception:
  11.     print('[!] Server not found or not open')
  12.     sys.exit()
  13. frame_count = 1
  14. while True:
  15.     time1 = time.time() if frame_count == 1 else time1
  16.     trigger = 'ok'
  17.     cli.sendall(trigger.encode())
  18.     data = cli.recv(1024*1024*20)
  19.     image = np.frombuffer(data, np.uint8)
  20.     image = cv2.imdecode(image,cv2.IMREAD_COLOR)
  21.     cv2.imshow('video',image)
  22.     cv2.waitKey(1)
  23.     end_time = time.time()
  24.     time2 = time.time()
  25.     print(image.shape[:2], int(frame_count / (time2 - time1)))
  26.     frame_count += 1
  27. cli.close()
复制代码

行空板屏幕显示实现全屏:

  1. import socket
  2. import cv2
  3. import sys
  4. import numpy as np
  5. address =('192.168.31.8', 5006)  # 服务端地址和端口
  6. ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  7. ser.bind(address)
  8. ser.listen(5)
  9. # 阻塞式
  10. print('waiting。。。')
  11. conn, addr = ser.accept()
  12. print('建立连接...')
  13. print('连接对象:', addr)
  14. #cap = cv2.VideoCapture(r"D:\project\dataset\video\测试.mp4")
  15. cap = cv2.VideoCapture(0)
  16. frames_num=cap.get(7)
  17. print('视频总帧数:',frames_num)
  18. print('发送目标...')
  19. count = 0
  20. cv2.namedWindow("send",cv2.WINDOW_KEEPRATIO)
  21. cv2.setWindowProperty("send", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
  22. while cap.isOpened():
  23.     try:
  24.         data = conn.recv(1024)
  25.         data = data.decode()
  26.         if not data:
  27.             break
  28.         ret, frame = cap.read()
  29.         if not ret:
  30.             continue
  31.         frame = cv2.resize(frame,(480,360))
  32.         frame=frame[20:340,120:360]
  33.         cv2.imshow('send', frame)
  34.         cv2.waitKey(1)
  35.         count += 1
  36.         # 数据打包有很多方式,也可以用json打包
  37.         img_encode = cv2.imencode('.jpg', frame)[1]
  38.         data_encode = np.array(img_encode)
  39.         str_encode = data_encode.tostring()
  40.         conn.sendall(str_encode)
  41.     except KeyboardInterrupt:
  42.         print('KeyboardInterrupt')
  43.         sys.exit(0)
复制代码


【电脑控制行空车】
行空板——视频车图1
电脑端连接UNO+按钮键盘。
  1. import socket
  2. import sys
  3. import cv2
  4. import numpy as np
  5. import time
  6. from pinpong.board import Board,Pin
  7. Board("UNO") .begin()
  8. p_p8_in=Pin(Pin.D5, Pin.IN)
  9. p_p9_in=Pin(Pin.D6, Pin.IN)
  10. p_p12_in=Pin(Pin.D7, Pin.IN)
  11. p_p13_in=Pin(Pin.D8, Pin.IN)
  12. p_p14_in=Pin(Pin.D9, Pin.IN)
  13. bs1 = 0
  14. bs2 = 0
  15. bs3 = 0
  16. bs4 = 0
  17. bs5 = 0
  18. bs6 = 0
  19. bs7 = 0
  20. address = ('192.168.31.8', 5006)  # 服务端地址和端口
  21. cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  22. try:
  23.     cli.connect(address)  # 尝试连接服务端
  24. except Exception:
  25.     print('[!] Server not found or not open')
  26.     sys.exit()
  27. cv2.namedWindow('video',cv2.WINDOW_KEEPRATIO)
  28. cv2.resizeWindow('video', 240, 320);
  29. #cv2.setWindowProperty('video', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
  30. currtime=time.time()
  31. while True:
  32.     bs6=0
  33.    
  34.     if(p_p8_in.read_digital()==True):
  35.           if(bs1 == 0):   
  36.              cli.send(b'L0')
  37.              bs1 = 1
  38.              bs6=1
  39.     else:
  40.           if(bs1 == 1):   
  41.              cli.send(b'L1')
  42.              bs1 = 0
  43.              bs6=1
  44.     if(p_p9_in.read_digital()==True):
  45.           if(bs2 == 0):   
  46.              cli.send(b'B0')
  47.              bs2 = 1
  48.              bs6=1
  49.     else:
  50.             if(bs2 == 1):   
  51.                cli.send(b'B1')
  52.                bs2 = 0
  53.                bs6=1
  54.     if(p_p12_in.read_digital()==True):
  55.             if(bs3 == 0):   
  56.                cli.send(b'R0')
  57.                bs3 = 1
  58.                bs6=1
  59.     else:
  60.             if(bs3 == 1):   
  61.                cli.send(b'R1')
  62.                bs3 = 0
  63.                bs6=1
  64.     if(p_p13_in.read_digital()==True):
  65.             if(bs4 == 0):   
  66.                cli.send(b'F0')
  67.                bs4 = 1
  68.                bs6=1
  69.     else:
  70.             if(bs4 == 1):   
  71.                cli.send(b'F1')
  72.                bs4 = 0
  73.                bs6=1
  74.     if(p_p14_in.read_digital()==True):
  75.             if(bs5 == 0):   
  76.               cli.send(b'S0')
  77.               bs5 = 1
  78.               bs6=1
  79.     else:
  80.             if(bs5 == 1):   
  81.               cli.send(b'S1')
  82.               bs5 = 0
  83.               bs6=1
  84.               
  85.     if bs6==0:
  86.        cli.send(b'OK')
  87.     if 1:
  88.         data = cli.recv(1024*40)
  89.         image = np.frombuffer(data, np.uint8)
  90.         image = cv2.imdecode(image,cv2.IMREAD_COLOR)
  91.         if image is None:
  92.             continue
  93.         cv2.imshow('video',image)
  94.         cv2.waitKey(1)
  95.       
  96. cli.close()
复制代码
行空板程序:
  1. import socket
  2. import cv2
  3. import time
  4. import sys
  5. import numpy as np
  6. from pinpong.board import Board
  7. from dfrobot_motor import MOTOR
  8. Board().begin()
  9. M = MOTOR()
  10. address =('192.168.31.8', 5006)  # 服务端地址和端口
  11. ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  12. ser.bind(address)
  13. ser.listen(5)
  14. # 阻塞式
  15. print('waiting。。。')
  16. conn, addr = ser.accept()
  17. print('建立连接...')
  18. print('连接对象:', addr)
  19. #cap = cv2.VideoCapture(r"D:\project\dataset\video\测试.mp4")
  20. cap = cv2.VideoCapture(0)
  21. frames_num=cap.get(7)
  22. print('视频总帧数:',frames_num)
  23. print('发送目标...')
  24. cv2.namedWindow("send",cv2.WINDOW_KEEPRATIO)
  25. cv2.setWindowProperty("send", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
  26. currtime=time.time()
  27. while cap.isOpened():
  28.         data = conn.recv(2)
  29.         data = data.decode()
  30.         if data:
  31.                   
  32.          if data=="R0":
  33.            M.motor_run(M.M1,M.CW,200)
  34.            M.motor_run(M.M2,M.CW,0)
  35.          elif data=="L0":
  36.            M.motor_run(M.M1,M.CW,0)
  37.            M.motor_run(M.M2,M.CW,200)
  38.          elif data=="B0":
  39.            M.motor_run(M.ALL,M.CCW,200)
  40.          elif data=="F0":
  41.            M.motor_run(M.ALL,M.CW,200)
  42.          elif data=="S0":
  43.            M.motor_stop(M.ALL)
  44.          elif data=="R1" or data=="L1" or data=="B1" or data=="F1" or data=="S1":
  45.            M.motor_stop(M.ALL)
  46.         #if time.time()-currtime>0.039:
  47.            #currtime=time.time()
  48.         if 1:   
  49.            ret, frame = cap.read()
  50.            if not ret:
  51.              continue
  52.            frame = cv2.resize(frame,(480,360))
  53.            frame=frame[20:340,120:360]
  54.            cv2.imshow('send', frame)
  55.            cv2.waitKey(1)
  56.         
  57.         # 数据打包有很多方式,也可以用json打包
  58.            img_encode = cv2.imencode('.jpg', frame)[1]
  59.            data_encode = np.array(img_encode)
  60.            str_encode = data_encode.tostring()
  61.            conn.sendall(str_encode)
  62. conn.close()        
复制代码


【演示视频】





使用另一个行空板作为控制端代替电脑,正在努力中,处理有延迟,代码需优化。

Mr-k  初级技匠

发表于 2022-9-29 15:00:45

厉害厉害
回复

使用道具 举报

34603471  初级技师

发表于 2023-1-24 16:26:14

为大神的作品点赞
回复

使用道具 举报

花生编程  中级技匠

发表于 2023-1-30 08:25:28

厉害厉害
回复

使用道具 举报

花生编程  中级技匠

发表于 2023-1-30 08:28:05

赞!!!
回复

使用道具 举报

手机连接万物  中级技师

发表于 2023-12-11 14:39:16

非常不错
回复

使用道具 举报

easy猿  见习技师

发表于 2023-12-19 20:17:10

老师厉害
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail