Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 从闪烁的灯光解码莫尔斯电码_Opencv_Image Processing_C++ Cli_Emgucv - Fatal编程技术网

Opencv 从闪烁的灯光解码莫尔斯电码

Opencv 从闪烁的灯光解码莫尔斯电码,opencv,image-processing,c++-cli,emgucv,Opencv,Image Processing,C++ Cli,Emgucv,我正试图从闪烁的灯光中解码莫尔斯。 我有一个摄像头,它正看着一个光源,光源在闪烁着莫尔斯电码中的某个字母或信息 我试着数一数灯光打开的帧数,根据这个数字,它是一个点或破折号。当灯闪烁时,我将它是点还是破折号输出到用户界面上的文本框中,然后在我有一段时间没有收到任何闪烁后,可以安全地假设这是消息的结尾,这样我就可以将整个消息输出到文本框中 现在我只写信件,还没有复杂的信息,而且只在一些时候有效。 似乎随机出现的问题是 当它是一个破折号时,它说它是一个点, 将字母输出到文本框后,它将无法识别任何后续

我正试图从闪烁的灯光中解码莫尔斯。 我有一个摄像头,它正看着一个光源,光源在闪烁着莫尔斯电码中的某个字母或信息

我试着数一数灯光打开的帧数,根据这个数字,它是一个点或破折号。当灯闪烁时,我将它是点还是破折号输出到用户界面上的文本框中,然后在我有一段时间没有收到任何闪烁后,可以安全地假设这是消息的结尾,这样我就可以将整个消息输出到文本框中

现在我只写信件,还没有复杂的信息,而且只在一些时候有效。 似乎随机出现的问题是

当它是一个破折号时,它说它是一个点, 将字母输出到文本框后,它将无法识别任何后续点或破折号。 如何解决上述问题?我还想知道是否有人有一些如何使代码更高效的技巧

下面是我现在的代码。我使用的是60帧左右的VS2010相机,带有Emgu CV

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