我打算在电视机后面制作一个流光溢彩的效果。我想通过使用指向我电视的相机来实现这一目标。我认为最简单的方法是使用简单的ip-camera。我需要颜色检测来检测屏幕上的颜色并将其转换为LED灯条上的rgb值。
我家中间有一个Raspberry Pi作为枢纽。我正在考虑像这样使用它
Ip相机指向我的屏幕处理pi上的视频并将其转换为rgb值并将其发送到mqtt服务器。在我的电视后面收到我的nodeMCU上的颜色。
如何检测我的pi上的直播(多点)上的颜色?
答案 0 :(得分:1)
如果您可以创建任何背景颜色,最佳方法可能是计算k均值或中位数以获得“最流行”的颜色。如果环境光在不同的地方可能不同,那么在图像边缘使用ROI,您可以检查该区域中的主要颜色(通过比较不同颜色的样本数量)。
如果您只有有限的颜色(例如只有R,G和B),那么您只需检查哪个通道在所需区域内具有最高强度。
我编写代码时假设您可以创建任何RGB环境颜色。
代码是:
#define UTF_WIDTH1_MAX 0x7F
#define UTF_WIDTH2_MAX 0x7FF
#define UTF_WIDTH3_MAX 0xFFFF
#define UTF_WIDTH4_MAX 0x10FFFF
void PrintCodepointUTF8(uint32_t codepoint) {
uint8_t first;
uint8_t continuation_bytes[3];
unsigned continuation_bytes_n;
if (codepoint <= UTF_WIDTH1_MAX) {
first = codepoint;
continuation_bytes = 0;
} else if (codepoint <= UTF_WIDTH2_MAX) {
// extract 5 bits for first and 6 bits for one continuation_byte
// and set some bits
first = ...;
continuation_bytes = ...
continuation_bytes_n = 1;
} else if (codepoint <= UTF_WIDTH4_MAX) {
if (isasurrogate(codepoint)) fail.
// else extract 4 bits for first and 6 bits for each continuation_byte
// and set some bits
first = ...;
continuation_bytes = ...
continuation_bytes_n = 2;
} else if (codepoint <= UTF_WIDTH4_MAX) {
// extract 3 bits for first and 6 bits for each continuation_byte
// and set some bits
first = ...;
continuation_bytes = ...
continuation_bytes_n = 3;
} else {
fail out of range.
}
print first and 0-3 continuation_bytes
}
我希望这有帮助!