0

我正在寻找一个例子或只是一个起点来实现以下目标:

使用 Python openCV我想检测闪烁灯的顺序。即 on off on off = 匹配

这可能吗?有人可以先给我看一个简单的例子。我希望我能从中学到东西。我通过示例学习得更好,找不到任何实现排序此功能的方法。

4

1 回答 1

0

如果光源在您的图像中非常突出,您可以使用图像的平均强度来检测变化。

这是一个非常简单的例子。我用这个视频进行测试。您可能需要调整视频的阈值。

如果您的视频不像我用于测试的视频那么简单,您可能需要进行一些调整。例如,如果图像的其他部分有太多干扰,您可以先尝试分割光源。或者,如果连续图像之间的强度变化不够大,您可能需要查看多张图像的变化。

编辑:

我刚刚看到这个问题是用 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
}
于 2013-07-26T11:04:30.770 回答