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()