首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >你能把闪光转换成摩尔斯电码吗?

你能把闪光转换成摩尔斯电码吗?
EN

Stack Overflow用户
提问于 2021-07-30 10:20:01
回答 2查看 122关注 0票数 1

我已经做了一个摩尔斯电码翻译器,我希望它能够记录闪光,并使其成为摩尔斯电码。我想我需要OpenCV或光传感器,但我不知道如何使用它们。我还没有它的任何代码,因为我在其他地方找不到任何解决方案。

EN

回答 2

Stack Overflow用户

发布于 2021-08-20 09:02:15

以下只是你可以尝试的一个概念。是的,你也可以为此训练一个神经网络,但如果你的设置足够简单,一些工程就可以了。

我们首先创建一个要使用的“玩具视频”:

代码语言:javascript
运行
复制
import numpy as np
import matplotlib.pyplot as plt

# Create a toy "video"

image = np.asarray([
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 1, 2, 2, 1],
    [0, 0, 2, 4, 4, 2],
    [0, 0, 2, 4, 4, 2],
    [0, 0, 1, 2, 2, 1],
])

signal = np.asarray([0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0])
x = list(range(len(signal)))
signal = np.interp(np.linspace(0, len(signal), 100), x, signal)[..., None]
frames = np.einsum('tk,xy->txyk', signal, image)[..., 0]

绘制几个帧:

代码语言:javascript
运行
复制
fig, axes = plt.subplots(1, 12, sharex='all', sharey='all')
for i, ax in enumerate(axes):
    ax.matshow(frames[i], vmin=0, vmax=1)
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
    ax.set_title(i)
plt.show()

现在你已经有了这种玩具视频,可以很直接地将其转换回某种二进制信号。你可以简单的计算每一帧的平均亮度:

代码语言:javascript
运行
复制
reconstructed = frames.mean(1).mean(1)
reconstructed_bin = reconstructed > 0.5
plt.plot(reconstructed, label='original')
plt.plot(reconstructed_bin, label='binary')
plt.title('Reconstructed Signal')
plt.legend()
plt.show()

从这里开始,我们只需确定每个闪存的长度。

代码语言:javascript
运行
复制
# This is ugly, I know. Just for understanding though:
# 1. Splits the binary signal on zero-values
# 2. Filters out the garbage (accept only lists where len(e) > 1)
# 3. Gets the length of the remaining list == the duration of each flash
tmp = np.split(reconstructed_bin, np.where(reconstructed_bin == 0)[0][1:])
flashes = list(map(len, filter(lambda e: len(e) > 1, tmp)))

我们现在可以看看闪烁需要多长时间:

代码语言:javascript
运行
复制
print(flashes)

给了我们

代码语言:javascript
运行
复制
[5, 5, 5, 10, 9, 9, 5, 5, 5]

所以..。“短”闪光灯似乎需要5帧,“长”闪光灯大约需要10帧。通过将合理阈值定义为7,我们可以将每个闪光灯分类为“长”或“短”,如下所示:

代码语言:javascript
运行
复制
# Classify each flash-duration
flashes_classified = list(map(lambda f: 'long' if f > 7 else 'short', flashes))

让我们重复一下停顿

代码语言:javascript
运行
复制
# Repeat for pauses
tmp = np.split(reconstructed_bin, np.where(reconstructed_bin != False)[0][1:])
pauses = list(map(len, filter(lambda e: len(e) > 1, tmp)))
pauses_classified = np.asarray(list(map(lambda f: 'w' if f > 6 else 'c', pauses)))
pauses_indices, = np.where(np.asarray(pauses_classified) == 'w') 

现在我们可以可视化结果了。

代码语言:javascript
运行
复制
fig = plt.figure()
ax = fig.gca()
ax.bar(range(len(flashes)), flashes, label='Flash duration')
ax.set_xticks(list(range(len(flashes_classified))))
ax.set_xticklabels(flashes_classified)
[ax.axvline(idx-0.5, ls='--', c='r', label='Pause' if i == 0 else None) for i, idx in enumerate(pauses_indices)]
plt.legend()
plt.show()

票数 3
EN

Stack Overflow用户

发布于 2021-08-20 09:35:39

这在一定程度上取决于您的环境。您可以尝试廉价的树莓派零(£9),甚至Pico (£4)或阿杜伊诺和连接的LDR -光依赖电阻为£1,而不是一个£100USB相机。

然后,你的程序将归结为重复测量电阻(这取决于光的强度),并使其成为长脉冲和短脉冲。

这样做的好处是很便宜,而且不需要你学习OpenCV,但Stefan的想法要有趣得多,并得到了我的支持!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68589312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档