2010-10-24 36 views
7

我想使用網絡攝像頭跟蹤激光點(位於牆上),並且我正在使用openCV來完成此任務。任何人都可以建議我用C++來做到這一點。使用OpenCV和C++進行激光檢測

謝謝!

+0

是否有可能使用某種相比,註冊配色網絡攝像頭前面的過濾器,如果有的話,這些過濾器是什麼? – Keshan 2010-10-24 19:40:25

+0

事實上,光源對你來說真的很重要,或者你只是使用一種光源,因爲這是一種製造亮點的便捷方式?也就是說,你是否有理由關心源是單色和相位匹配?如果是這樣,點投影表面的光學特性是什麼(平坦度等)? – dmckee 2010-10-24 20:11:03

+0

你可以掃描圖像的小區域,與鄰近區域相比,紅色分量顯着增強嗎? – Dialecticus 2010-10-24 20:13:51

回答

7

根據背景的穩定性以及想要對圖像執行的操作,您有三個選項。

你可以使你的圖像如此黑暗,你唯一能看到的就是激光點。您可以通過關閉光圈和/或縮短快門時間來完成此操作。即使使用便宜的攝像頭,通常也可以在驅動程序中完成。一旦你完成了這個工作,找到激光點的工作非常簡單。您儘可能使圖像變暗,因爲通常激光照射的位置太亮而不適合相機拾取。這意味着(正如你所經歷的那樣),你不能辨別圖像中的光激光點和其他光物體。通過變黑,你現在可以做到這一點。

如果您對圖像有其他用途(顯示給人)並且背景穩定,您還可以將最後幾幅視頻圖像的平均值用作「背景」,然後找到大的地方該背景與最新圖像之間的差異。這通常是激光指向的地方(同樣,如果你的背景足夠穩定)。最後,如果你的背景不穩定,並且你不想讓圖像變得非常黑暗,那麼最後的選擇是尋找所有像素都非常亮,紅色通道比綠色更亮和藍色(如果您使用的是紅色激光)。這個系統仍然會被白點分散注意力,但不像找到明亮的像素那樣多。如果您的激光指示器點的中心確實顯示爲亮白色,而不考慮激光顏色,則此技術將允許您在該亮點周圍找到「環」(點的外部,其中激光器不像它位於圖像中心,以便與圖像中激光的實際顏色一起顯示)。然後你可以使用簡單的morphological operations,(可能是closing已經足夠)來填充這些圈子。

+0

我想我最好嘗試前兩個選項,似乎可能:)。非常感謝你。 – Keshan 2010-10-25 17:14:11

4

假設您使用這些顏色之一的激光:紅色,綠色,藍色。 如果激光點顯得非常亮(至少在一個通道中,例如紅色),那麼簡單地對圖像/通道進行閾值處理,比如灰度值爲200,將會爲您提供幾個候選激光。如果其他通道在這個區域內很暗(呃),那麼你知道這是一個正確顏色的明亮光線。按尺寸過濾一下,你很有可能找到這個位置。

+0

感謝您的回覆,我有一面牆,它正在投影,因此,當我限定圖像並尋找紅色通道時,投影表面上的紅色有時可能會造成一些麻煩。 – Keshan 2010-10-25 02:45:38

3

如果你在你的攝像頭上貼一個紅外濾鏡,你的投影將不會被拾取,使激光點的檢測更容易(使用簡單的背景扣除等)。假設激光指示器發出紅外光...

0

嘗試模板Maching。 首先你將「指針」指向一個特定的地方,這樣就可以完成聖殿了。然後你只需要尋找它。

或者,正如jilles de wit所言,你可以把最後2幀的差異,可能差異會顯示你的指針。

將最後2幀轉換爲灰度,然後應用SUB功能。

1

正如其他答案中所建議的那樣,搜索顏色可能是一個好主意。 你應該考慮尋找一個特定的顏色範圍。最好的方法是將圖片轉換爲HSL或HSV色彩空間。

cv::cvtColor(src, hsv, COLOR_BGR2HSV); 

有關Wikipedia的更多信息。

然後你有三個通道: 色調(=顏色),飽和度和亮度(或值)。

使用cv::inRange(hsv, cv::Scalar(159, 135, 165), cv::Scalar(179, 255, 200), inRange);您現在可以生成黑白圖像,該圖像顯示顏色範圍內的像素。 標量是每個通道的低值和高值。

在這個例子中,你將獲得像素,135和255和值165和200

之間也許這可以提高您的跟蹤之間的159和179(色調)之間的顏色,飽和度。