2017-02-02 5 views
1

Я планирую создать эффект, созданный для моего телевизора. Я хочу добиться этого, используя камеру, направленную на мой телевизор. Я думаю, что самый простой способ - использовать простую ip-камеру. Мне нужно распознавание цвета, чтобы определить цвета на экране и перевести их на значения rgb на светодиодной полосе.Обнаружение цвета видео в реальном времени Pi

У меня есть малина Pi как центр в центре моего дома. Я думал об использовании его вот так:

Ip камера указала на мой экран Обработала видео на pi и перевела его на значения rgb и отправила на сервер mqtt. За моим телевизором получаются цвета на моем узлеMCU.

Как я могу определить цвета в прямом эфире (на нескольких точках) на моем пи?

ответ

1

Если вы можете создать любой цвет фона, лучшим подходом может быть вычисление k-средних или медианных, чтобы получить «самые популярные» цвета. Если окружающий свет может быть разным в разных местах, то с помощью ROI на краях изображения вы можете проверить, какой цвет является доминирующим в этой области (путем сравнения количества образцов разных цветов).

Если у вас есть только ограниченные цвета (например, только R, G и B), вы можете просто проверить, какой канал имеет наибольшую интенсивность в желаемой области.

Я написал код с предположением, что вы можете создать любой окружающий цвет RGB.

В качестве тестового изображения я использую это одно: Input image

Код:

import cv2 
import numpy as np 

# Read an input image (in your case this will be an image from the camera) 
img = cv2.imread('saul2.png ', cv2.IMREAD_COLOR) 

# The block_size defines how big the patches around an image are 
# the more LEDs you have and the more segments you want, the lower block_size can be 
block_size = 60 

# Get dimensions of an image 
height, width, chan = img.shape 

# Calculate number of patches along height and width 
h_steps = height/block_size 
w_steps = width/block_size 

# In one loop I calculate both: left and right ambient or top and bottom 
ambient_patch1 = np.zeros((60, 60, 3)) 
ambient_patch2 = np.zeros((60, 60, 3)) 

# Create output image (just for visualization 
# there will be an input image in the middle, 10px black border and ambient color) 
output = cv2.copyMakeBorder(img, 70, 70, 70, 70, cv2.BORDER_CONSTANT, value = 0) 

for i in range(h_steps): 
    # Get left and right region of an image 
    left_roi = img[i * 60 : (i + 1) * 60, 0 : 60] 
    right_roi = img[i * 60 : (i + 1) * 60, -61 : -1] 

    left_med = np.median(left_roi, (0, 1)) # This is an actual RGB color for given block (on the left) 
    right_med = np.median(right_roi, (0, 1)) # and on the right 

    # Create patch having an ambient color - this is just for visualization 
    ambient_patch1[:, :] = left_med 
    ambient_patch2[:, :] = right_med 

    # Put it in the output image (the additional 70 is because input image is in the middle (shifted by 70px) 
    output[70 + i * 60 : 70+ (i + 1) * 60, 0 : 60] = ambient_patch1 
    output[70 + i * 60 : 70+ (i + 1) * 60, -61: -1] = ambient_patch2 


for i in range(w_steps): 
    # Get top and bottom region of an image 
    top_roi = img[0 : 60, i * 60 : (i + 1) * 60] 
    bottom_roi = img[-61 : -1, i * 60: (i + 1) * 60] 

    top_med = np.median(top_roi, (0, 1)) # This is an actual RGB color for given block (on top) 
    bottom_med = np.median(bottom_roi, (0, 1)) # and bottom 

    # Create patch having an ambient color - this is just for visualization 
    ambient_patch1[:, :] = top_med 
    ambient_patch2[:, :] = bottom_med 

    # Put it in the output image (the additional 70 is because input image is in the middle (shifted by 70px) 
    output[0 : 60, 70 + i * 60 : 70 + (i + 1) * 60] = ambient_patch1 
    output[-61: -1, 70 + i * 60 : 70 + (i + 1) * 60] = ambient_patch2 

# Save output image 
cv2.imwrite('saul_output.png', output) 

И это дает результат следующим образом: Output image

Я надеюсь, что это помогает!

EDIT: И еще два примера: Example1 Example2

+0

И как я могу это сделать? С помощью какого инструмента/программы? – Robert

+0

Как вы правильно отметили этот вопрос, OpenCV - хороший выбор. Я бы предложил использовать python для этого (если вы не чувствуете себя более комфортно с C++). Вы можете найти множество примеров, как захватить поток с IP-камер (это зависит от производителя/модели вашей камеры). В дальнейшем я расскажу подробнее о том, как обрабатывать себя. – MateuszB

+0

Спасибо заранее! – Robert