2013-07-26 239 views
0

我正在尋找一個例子,或只是一個起點上實現以下的序列:檢測閃爍的燈光

使用Python openCV我想檢測指示燈閃爍的順序。即打開關閉=匹配

這是可能的,可以有人開始給我看一個簡單的例子。我希望能從中學習。我通過示例更好地學習,找不到任何可以實現此功能的排序。

+0

你能否提供一個示例視頻來展示輸入是怎樣的? – sietschie

+0

@sietschie我還不能,但想象一下,看着大屏幕電視的相機,在電視屏幕上閃爍......白色,黑色,白色。我想打開簡歷來檢測,關閉,爲此。 – GrantU

+0

如果光線覆蓋足夠大的圖像區域,則可以使用圖像的平均強度。如果你得到這個圖像序列,你只需要尋找亮度的突然變化,這很可能意味着光線已經改變。 – sietschie

回答

0

如果光源在圖像中非常突出,您可以使用圖像的平均強度來檢測變化。

這是一個非常簡單的例子。我使用this視頻進行測試。 您可能需要調整視頻的閾值。

如果您的視頻不像我用於測試的視頻那麼簡單,則可能需要進行一些調整。例如,如果在圖像的其他部分有太多分心,可以嘗試先分割光源。或者,如果連續圖像之間的強度變化不夠大,則可能需要查看幾幅圖像的變化。

編輯:

我剛纔看到的問題是標記有蟒蛇,但我的源代碼是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 
}