2012-05-22 19 views
4
LED檢測對象狀態

我的問題是類似OpenCV: Detect blinking lights in a video feed openCV detect blinking lights從圖片

我要檢測從中將有LED對象的任何圖像的LED開/關狀態。 LED物體可以是任何尺寸(但大部分是圓形的)。雖然可以打開或關閉,但獲取該圖像中所有LED的位置非常重要。首先,我想知道只有ON的LED的狀態和位置。現在圖像源對於我的工作是靜態的,但它必須來自任何具有發光LED的產品的視頻。所以沒有模板圖像減去背景的機會。

我一直在使用帶閾值,輪廓和圓方法的OpenCV(新OpenCV的)嘗試,但沒有找到SUCESSFUL。如果有任何源代碼或解決方案,請分享。該解決方案可以是任何不僅使用OpenCV,這將給我的結果。這將不勝感激。

從另外兩個問題不同的是,我想要得到的LED數量的圖像中是否可以開啓或關閉,所有LED的狀態。我知道這非常複雜。首先,我試圖檢測圖像中發光的LED。我已經實施了我在下面分享的代碼。我有不同的實現,但下面的代碼能夠通過繪製輪廓向我展示發光的LED,但輪廓的數量比發光的LED多。所以我無法獲得至少發光的LED總數。請給我建議你的意見。

int main(int argc, char* argv[]) 
{ 

IplImage* newImg = NULL; 
IplImage* grayImg = NULL; 
IplImage* contourImg = NULL; 
float minAreaOfInterest = 180.0; 
float maxAreaOfInterest = 220.0; 
//parameters for the contour detection 
CvMemStorage * storage = cvCreateMemStorage(0); 
CvSeq * contours = 0; 
int mode = CV_RETR_EXTERNAL; 
mode = CV_RETR_CCOMP; //detect both outside and inside contour 
cvNamedWindow("src", 1); 
cvNamedWindow("Threshhold",1); 
//load original image 
newImg = cvLoadImage(argv[1], 1); 

IplImage* imgHSV = cvCreateImage(cvGetSize(newImg), 8, 3); 
cvCvtColor(newImg, imgHSV, CV_BGR2HSV); 

cvNamedWindow("HSV",1); 
cvShowImage("HSV", imgHSV); 
IplImage* imgThreshed = cvCreateImage(cvGetSize(newImg), 8, 1); 

cvInRangeS(newImg, cvScalar(20, 100, 100), cvScalar(30, 255, 255), imgThreshed); 
cvShowImage("src", newImg); 

cvShowImage("Threshhold", imgThreshed); 

//make a copy of the original image to draw the detected contour 
contourImg = cvCreateImage(cvGetSize(newImg), IPL_DEPTH_8U, 3); 
contourImg=cvCloneImage(newImg); 
cvNamedWindow("Contour",1); 
//find the contour 
cvFindContours(imgThreshed, storage, &contours, sizeof(CvContour), mode, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 
int i = 0; 
for (; contours != 0; contours = contours->h_next) 
{ 
    i++; 
    //ext_color = CV_RGB(rand()&255, rand()&255, rand()&255); //randomly coloring different contours  
    cvDrawContours(contourImg, contours, CV_RGB(0, 255, 0), CV_RGB(255, 0, 0), 2, 2, 8, cvPoint(0,0)); 
} 
printf("Total Contours:%d\n", i); 
cvShowImage("Contour", contourImg); 

cvWaitKey(0); 
cvDestroyWindow("src"); cvDestroyWindow("Threshhold"); 
cvDestroyWindow("HSV"); 
cvDestroyWindow("Contour"); 
cvReleaseImage(&newImg); cvReleaseImage(&imgThreshed); 
cvReleaseImage(&imgHSV); 
cvReleaseImage(&contourImg); 



} 
+0

什麼不適合你一些更多的食物?沒有工作比較模糊,解釋你是否有執行問題或爲什麼你的測試沒有成功(至少你對此有何看法)。另外,對於另外兩個問題,你有什麼不同? – jlengrand

+0

我編輯了我的問題並添加了代碼。 – Keerthi

+0

你可以把你正在使用什麼樣的圖像?幾個例子。 – maximus

回答

5

我昨天晚上有一段時間,這裏是一個非常簡單和部分的解決方案,適合我。 我創建了一個Git倉庫,你可以直接克隆:

的git://github.com/jlengrand/image_processing.git

,並使用運行Python

$ cd image_processing/LedDetector/ 
$ python leddetector/led_highlighter.py 

你可以看到代碼here

我的方法:

  • 轉換爲一個通道圖像
  • 搜索亮像素,假設我們至少有一個指示燈和一個黑暗的背景圖像上
  • 創建與圖像
  • 的最亮部分的二進制圖像中提取從該斑點圖像,檢索他們的中心和數量的LED。

的代碼只需要一個圖像考慮在這一點上,但你可以用一個循環增強其採取一批圖像(我已經提供了我的回購一些示例圖像。) 您只需打與發現LED的中心相距很近,因爲從一個圖像到另一個圖像的中心可能不是一個像素(中心可能稍微偏移)。

爲了得到算法更強大的(知道是否有LED或沒有,找到一個自動的,而不是硬編碼的邊距值),你可以逛了一下玩的直方圖(放置在extract_bright)。 我已經創建了該功能,您應該只需稍微增強它。

關於輸入數據的一些詳細信息: opencv的並只接受AVI文件現在,所以你必須將mp4文件轉換AVI(未壓縮在我的情況)。我用this,完美的工作。 由於某種原因,queryframe函數在我的計算機上導致了內存泄漏。這就是爲什麼我創建了grab_images函數,它將avi文件作爲輸入並創建一批可以更容易使用的jpg圖像。

下面是一個圖像的結果:

輸入圖像:

Input example

二進制圖像:

Binary result (brightest part of the image)

最終結果:

Final result (Bounding boxes surrounding the LEDs)

希望這會有所幫助。 。 。

編輯:

,如果你想使用this image你的問題稍微複雜一些。我發佈的方法仍然可以使用,但需要稍微複雜一點。

您想要檢測顯示「信息」(狀態,帶寬,...)的LED並放棄設計部分。

我看到這三個簡單的解決方案:

  • 你有LED的位置的以前的知識。在這種情況下,您可以應用完全相同的方法,但應用於整個圖像的精確部分(使用cv.SetImageROI)。
  • 你有一個關於LED顏色的預知知識(你可以在圖像上看到有兩種不同的顏色)。然後,您可以搜索整個圖像,然後應用濾色器來限制您的選擇。
  • 你沒有先前的知識。在這種情況下,情況會變得更復雜一些。我傾向於說,無用的LED應該都具有相同的顏色,並且狀態LED通常會閃爍。這意味着通過向該方法添加一個學習步驟,您可能能夠看到實際上必須選擇哪些leds有用。

希望這帶來了思想

+0

非常感謝。這幫助了我很多。當我檢查你的代碼時,我得到了一些問題。我在下面的[鏈接](http://www.google.co.in/imgres?imgurl=http://www.vpr.net/uploads/photos/original/router_340x255.jpg&imgrefurl=http: //www.vpr.net/news_detail/90049/&usg=__R3XQOcxJLXcywmaBSFEI2_v34C0=&h=253&w=340&sz=28&hl=en&start=87&sig2=eTgqrGXg_E5MztETrQM9OA&zoom=1&tbnid=r2FryHBDKx6e9M:&tbnh=89&tbnw=119&ei=l268T9aKC8uf6QHQ9-RI&um=1&itbs=1)結果圖像顯示不發光的LED物體和其他明亮的物體。我們如何消除這種只檢測發光LED的問題? – Keerthi

+0

嗨,很高興幫助。查看我的編輯 – jlengrand

+0

再次感謝您的回覆。第一種和第二種解決方案不適用於我的情況。在第三種情況下,你能否詳細解釋一下。我的意思是我不懂一些術語。例如,什麼是學習步驟?如果你能擴大你的想法,這將是非常好的。 – Keerthi