Opencv 从闪烁的灯光解码莫尔斯电码
我正试图从闪烁的灯光中解码莫尔斯。 我有一个摄像头,它正看着一个光源,光源在闪烁着莫尔斯电码中的某个字母或信息 我试着数一数灯光打开的帧数,根据这个数字,它是一个点或破折号。当灯闪烁时,我将它是点还是破折号输出到用户界面上的文本框中,然后在我有一段时间没有收到任何闪烁后,可以安全地假设这是消息的结尾,这样我就可以将整个消息输出到文本框中 现在我只写信件,还没有复杂的信息,而且只在一些时候有效。 似乎随机出现的问题是 当它是一个破折号时,它说它是一个点, 将字母输出到文本框后,它将无法识别任何后续点或破折号。 如何解决上述问题?我还想知道是否有人有一些如何使代码更高效的技巧 下面是我现在的代码。我使用的是60帧左右的VS2010相机,带有Emgu CVOpencv 从闪烁的灯光解码莫尔斯电码,opencv,image-processing,c++-cli,emgucv,Opencv,Image Processing,C++ Cli,Emgucv,我正试图从闪烁的灯光中解码莫尔斯。 我有一个摄像头,它正看着一个光源,光源在闪烁着莫尔斯电码中的某个字母或信息 我试着数一数灯光打开的帧数,根据这个数字,它是一个点或破折号。当灯闪烁时,我将它是点还是破折号输出到用户界面上的文本框中,然后在我有一段时间没有收到任何闪烁后,可以安全地假设这是消息的结尾,这样我就可以将整个消息输出到文本框中 现在我只写信件,还没有复杂的信息,而且只在一些时候有效。 似乎随机出现的问题是 当它是一个破折号时,它说它是一个点, 将字母输出到文本框后,它将无法识别任何后续
int led_on = 0;
for(int i = x; i < height; i+=pixeljump)
{
for(int j = y; j< width; j+=pixeljump)
{
byte a = frameColorDisplay->Data[i,j,0]; //once i find the first spot of light, I'm only concerned with the pixels in the i
if(a > 225){ //in the immediate vicinity because the camera and the light source are stationary
frameOn++;
frameOff = 0;
led_on = 1;
x = i;
y = j;
pixeljump = 1;
height = i + 10;
width = j + 10;
//tbMorse->Text = "I see the light";
break;
}
}
}
if(led_on == 0){
frameOff++;
}
if((frameOff > 15) && ((frameOn > 15) && (frameOn <=25))){ //if the number of frames the light is on is between 15 and 25, its a dot
tbMorse->Text = "That's a dot";
//tbMorse->Text=String::Format("{0:F}",frameOn);
Morse+= ".";
frameOn = 0;
frameOff = 0;
signalreceived = 1;
}else if((frameOff > 15) && (frameOn > 25)){ //if it's greater than 25, it's a dash
tbMorse->Text = "That's a dash";
//tbMorse->Text=String::Format("{0:F}",frameOn);
Morse+= "-";
frameOn = 0;
frameOff = 0;
signalreceived = 1;
}
if((frameOff > 60) && (signalreceived == 1)){ //if it's off for a full second, its safe to send the message
text += Morse2Text(Morse);
String ^managedString = marshal_as<String^>( text );
//String ^managedString = marshal_as<String^>( Morse );
tbMorse->Text = managedString;
text.clear();
Morse.clear();
signalreceived = 0;
frameOn = 0;
frameOff = 0;
}
高度和宽度最初初始化为框架的高度和宽度。
Morse2Text函数接收一串点和破折号,通过大量的if语句块查看点和破折号对应的内容,然后返回点和破折号的字母值。我的第一个建议是计算经过的时间毫秒,而不是帧数。我不确定这会有什么帮助,因为我只是在抓取帧时检查灯光,帧速率是60 fps,时间将每1/60秒更新一次。你能解释一下为什么计算时间是有利的吗@你确定你的程序能处理每秒60帧吗?也许当你处理第一帧的时候,你的摄像机已经在20号了。也许你错过了几帧,因为有很多。另一件事,按帧计数的检查只对那个摄像头有效,按时间流逝的检查对任何摄像头都有效。好的,我将尝试用你的方法检查时间,而不是帧,看看它是如何工作的。我将根据遇到的问题编辑此问题或生成新问题。谢谢你的帮助@迪马马利金
int frameOn = 0;
int frameOff = 0;
int x = 0;
int y = 0;
int pixeljump = 25;
int height;
int width;
int signalreceived = 0;
string Morse;
string text;
string Morse2Text(string morse);