我正在寻找一个例子或只是一个起点来实现以下目标:
使用 Python openCV我想检测闪烁灯的顺序。即 on off on off = 匹配
这可能吗?有人可以先给我看一个简单的例子。我希望我能从中学到东西。我通过示例学习得更好,找不到任何实现排序此功能的方法。
我正在寻找一个例子或只是一个起点来实现以下目标:
使用 Python openCV我想检测闪烁灯的顺序。即 on off on off = 匹配
这可能吗?有人可以先给我看一个简单的例子。我希望我能从中学到东西。我通过示例学习得更好,找不到任何实现排序此功能的方法。
如果光源在您的图像中非常突出,您可以使用图像的平均强度来检测变化。
这是一个非常简单的例子。我用这个视频进行测试。您可能需要调整视频的阈值。
如果您的视频不像我用于测试的视频那么简单,您可能需要进行一些调整。例如,如果图像的其他部分有太多干扰,您可以先尝试分割光源。或者,如果连续图像之间的强度变化不够大,您可能需要查看多张图像的变化。
编辑:
我刚刚看到这个问题是用 python 标记的,但我的源代码是 C++。但我暂时离开它。也许它可以帮助您了解总体思路,以便您可以自己将其移植到 python。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture capture(argv[1]);
Mat frame;
if( !capture.isOpened() )
throw "Error when reading video";
double lastNorm = 0.0;
int lastCounter = 0;
int counter = 0;
int currentState = 0;
namedWindow( "w", 1);
for( ; ; )
{
capture >> frame;
imshow("w", frame);
double currentNorm = norm(frame);
double diffNorm = currentNorm - lastNorm;
if (diffNorm > 20000 && currentState == 0)
{
currentState = 1;
std::cout << "on - was off for " << counter - lastCounter << " frames" << std::endl;
lastCounter = counter;
}
if (diffNorm < -20000 && currentState == 1)
{
currentState = 0;
std::cout << "off - was on for " << counter - lastCounter << " frames" << std::endl;
lastCounter = counter;
}
waitKey(20); // waits to display frame
lastNorm = currentNorm;
counter++;
}
waitKey(0); // key press to close window
// releases and window destroy are automatic in C++ interface
}