|  | import math
import time
import itertools as it
import cv2
import colorsys
from pythonosc import udp_client
import numpy as np
DENSITY = 4
RED = [0, 0, 255]
N_COLORS = 3
LAST_MESSAGE_TIME = 0
def analyze_block(frame, osc, index, sp, ep, send=False):
    """ Analyze a block """
    block = frame[sp[1]:ep[1], sp[0]:ep[0], 0:3]
    average_color = np.average(block, (0, 1)) / 255
    h, s, v = colorsys.rgb_to_hsv(*average_color)
    # Configure the oscillator
    if send:
        osc.send_message(
            "/radio",
            [int(index), float(h),
             float(s), float(v), .5])
    return frame
def analyze(frame, osc):
    """ Analyze the full frame """
    global LAST_MESSAGE_TIME
    height, width, d = frame.shape
    n = DENSITY
    m = math.ceil(n * (height / width))
    dx = width / n
    dy = height / m
    send = False
    if time.time() - LAST_MESSAGE_TIME > 0.1:
        LAST_MESSAGE_TIME = time.time()
        send = True
    for index, (y, x) in enumerate(it.product(range(m), range(n))):
        sp = (int(x * dx), int(y * dy))
        ep = (int(x * dx + dx), int(y * dy + dy))
        frame = analyze_block(frame, osc, index, sp, ep, send)
    return frame
if __name__ == '__main__':
    # camera = cv2.VideoCapture("/dev/video2")
    camera = cv2.VideoCapture(0)
    osc = udp_client.SimpleUDPClient("0.0.0.0", 5005)
    print("Radio is running...")
    while True:
        ret, frame = camera.read()
        frame = analyze(frame, osc)
    camera.release()
 |