1715浏览
查看: 1715|回复: 2

[项目] 行空板——流光溢彩

[复制链接]
行空板——流光溢彩图1
【项目背景】
”流光溢彩灯“有非常炫酷的效果,它可以根据不同的画面和内容,配备在显示器后方的墙壁上投射出不同颜色的LED灯光。这个行空板——流光溢彩灯能够通过Python识别当前视频相应区域RGB颜色,自动调节出与当前屏幕画面相近的灯效,将屏幕上的画面延伸到屏幕之外,营造出更大的让人身临其境的视觉氛围。
行空板——流光溢彩图2
【项目技术】
1、cv2播放视频
2、使用到了列表求行列平均值mean(计算视频区域颜色平均值)
3、Pinpong库控制LED灯带
【知识准备】
mean()函数功能:求取均值
经常操作的参数为axis,以m * n矩阵举例:
axis 不设置值,对 m*n 个数求均值,返回一个实数
axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
axis =1 :压缩列,对各行求均值,返回 m *1 矩阵
举例:
  1. >>>  import numpy as np
  2. >>> num1 = np.array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]])
  3. >>> now2 = np.mat(num1)
  4. >>> now2
复制代码
matrix([[1, 2, 3],
        [2, 3, 4],
        [3, 4, 5],
        [4, 5, 6]])

  1. >>> np.mean(now2) # 对所有元素求均值
复制代码
3.5
  1. >>> np.mean(now2,0) # 压缩行,对各列求均值
复制代码
matrix([[ 2.5,  3.5,  4.5]])
  1. >>> np.mean(now2,1) # 压缩列,对各行求均值
复制代码
matrix([[ 2.],
        [ 3.],
        [ 4.],
        [ 5.]])

【测试操作】
首先使用笔记本电脑,在Mind+的Python模式下,OpenCV播放视频,使用Pinpong库连接UNO控制RGB灯。
1.播放视频
行空板——流光溢彩图4

  1. import pygame
  2. import time
  3. import cv2
  4. import numpy as np
  5. vd = cv2.VideoCapture()
  6. vd.open("red.mp4")
  7. vd.set(cv2.CAP_PROP_BUFFERSIZE, 1)     #设置OpenCV内部的图像缓存,可以极大提高图像的实时性。
  8. pygame.mixer.init()
  9. pygame.mixer.music.load("red.mp3")
  10. pygame.mixer.music.set_volume(50 / 100)
  11. currenttime=time.time()
  12. bs=True
  13. while True:
  14.   if bs==True:
  15.          bs=False
  16.          pygame.mixer.music.play()   
  17.   if time.time()-currenttime>=0.039:
  18.         currenttime=time.time()
  19.         ret, img = vd.read()
  20.         if ret:
  21.             cv2.imshow('windows', img)
  22.         else:
  23.             cv2.destroyAllWindows()
  24.             vd.set(cv2.CAP_PROP_POS_MSEC, 0)   
  25.             bs=True
  26. if cv2.waitKey(1) & 0xff== 27:
  27.             break
复制代码
2、根据识别视频相应区域颜色,控制RGB灯
行空板——流光溢彩图3
  1. import pygame
  2. import time
  3. import cv2
  4. from pinpong.board import Board,Pin
  5. from pinpong.board import NeoPixel
  6. import numpy as np
  7. bs=True
  8. vd = cv2.VideoCapture()
  9. vd.open("red.mp4")
  10. screen_rotation = True
  11. vd.set(cv2.CAP_PROP_FRAME_WIDTH, 320)  #设置视频图像宽度
  12. vd.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) #设置视频摄像头图像高度
  13. vd.set(cv2.CAP_PROP_BUFFERSIZE, 1)     #设置OpenCV内部的图像缓存,可以极大提高图像的实时性。
  14. pygame.mixer.init()
  15. pygame.mixer.music.load("red.mp3")
  16. pygame.mixer.music.set_volume(50 / 100)
  17. currenttime=time.time()
  18. currenttime1=time.time()
  19. Board("UNO").begin()
  20. p_p22_out=Pin(Pin.D8, Pin.OUT)
  21. np1 = NeoPixel(p_p22_out,1)
  22. while True:
  23.     if bs==True:
  24.           bs=False
  25.           pygame.mixer.music.play()   
  26.     if time.time()-currenttime>=0.039:
  27.         currenttime=time.time()
  28.         ret, img = vd.read()
  29.         if ret:
  30.    
  31.             if screen_rotation:
  32.       
  33.                 pass
  34.             if time.time()-currenttime1>=0.2:
  35.                 currenttime1=time.time()
  36.                 color=img[0:30,0:30].mean(axis=(0,1))
  37.                 print(color)
  38.                 np1.range_color(0,0,int(color[2])*65536+int(color[1])*256+int(color[0]))   
  39.             cv2.imshow('windows', img)
  40.             cv2.imshow('windows1', img[0:30,0:30])
  41.         else:
  42.             cv2.destroyAllWindows()
  43.             vd.set(cv2.CAP_PROP_POS_MSEC, 0)   
  44.             
  45.             bs=True
  46.     if cv2.waitKey(1) & 0xff== 27:
  47.             break
复制代码

【行空板流光溢彩】
行空板——流光溢彩图5

行空板——流光溢彩图6
  1. import pygame
  2. import time
  3. import cv2
  4. from unihiker import GUI
  5. from pinpong.board import Board,Pin
  6. from pinpong.board import NeoPixel
  7. bf=False
  8. bs=True
  9. # 事件回调函数
  10. def button_click1():
  11.     global bf
  12.     bf=True
  13. Board().begin()
  14. u_gui=GUI()
  15. 屏幕=u_gui.draw_image(image="back.JPG",x=0,y=0)
  16. 按钮=u_gui.draw_image(image="an.png",x=90,y=130)
  17. 按钮.config(onclick=button_click1)
  18. vd = cv2.VideoCapture()
  19. vd.open("red.mp4")
  20. screen_rotation = True
  21. vd.set(cv2.CAP_PROP_FRAME_WIDTH, 320)  #设置视频图像宽度
  22. vd.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) #设置视频摄像头图像高度
  23. vd.set(cv2.CAP_PROP_BUFFERSIZE, 1)     #设置OpenCV内部的图像缓存,可以极大提高图像的实时性。
  24. pygame.mixer.init()
  25. pygame.mixer.music.load("red.mp3")
  26. pygame.mixer.music.set_volume(50 / 100)
  27. p_p22_out=Pin(Pin.P22, Pin.OUT)
  28. np1 = NeoPixel(p_p22_out,18)
  29. np1.clear()
  30. currenttime=time.time()
  31. currenttime1=time.time()
  32. while True:
  33.      if bf==True:
  34.       if bs==True:
  35.           bs=False
  36.           cv2.namedWindow('windows',cv2.WND_PROP_FULLSCREEN)    #窗口全屏
  37.           cv2.setWindowProperty('windows', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)   #窗口全屏
  38.           pygame.mixer.music.play()   
  39.       if time.time()-currenttime>=0.039:
  40.         currenttime=time.time()
  41.         ret, img = vd.read()
  42.         if ret:
  43.             
  44.             if screen_rotation:
  45.                 img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) #旋转屏幕
  46.             cv2.imshow('windows', img)
  47.             if time.time()-currenttime1>=0.4:
  48.                 currenttime1=time.time()
  49.                 color=img[120:220,0:10].mean(axis=(0,1))
  50.                 np1.range_color(9,14,int(color[2])*65536+int(color[1])*256+int(color[0]))  
  51.                
  52.                 color=img[309:319,115:125].mean(axis=(0,1))
  53.                 np1.range_color(6,8,int(color[2])*65536+int(color[1])*256+int(color[0]))
  54.                 color=img[229:239,155:165].mean(axis=(0,1))
  55.                 np1.range_color(1,5,int(color[2])*65536+int(color[1])*256+int(color[0]))   
  56.                 color=img[0:10,115:125].mean(axis=(0,1))
  57.                 np1.range_color(15,17,int(color[2])*65536+int(color[1])*256+int(color[0]))   
  58.                
  59.         else:
  60.             cv2.destroyAllWindows()
  61.             vd.set(cv2.CAP_PROP_POS_MSEC, 0)   
  62.             bf=False
  63.             bs=True
  64.             np1.clear()
  65.       if cv2.waitKey(1) & 0xff== 27:
  66.             break
复制代码


安卓机器人  中级技神

发表于 2022-9-14 16:18:06

炫 幻 彩
回复

使用道具 举报

云天  初级技神
 楼主|

发表于 2022-9-14 19:27:13

如果我能再打印一个外壳就更好了
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail