2014-11-21 34 views
0

下面顯示了具有QR碼的圖像的輪廓:Opencv:在黑色背景下查找特定圖案的程序是什麼?

enter image description here

從這個圖象我要提取QR碼這是我的投資回報率。要獲得這些輪廓我用

findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

我得出這三個黃線手動只是爲了顯示我需要確定這些模式。一旦我知道這三點的位置,我將更容易找到QR碼。

另一種顏色: enter image description here

所有的QR碼有這樣的三盒。像這樣的例子:

enter image description here

請幫我繼續。

備註:這張圖片還有另外一個問題,那就是它被徑向扭曲,我暫時忽略它。目前我只需要具有完整QR碼的ROI。

更新

至於建議的Micka,我應該尋找有2個不同的輪廓,所有這些輪廓包括(層次)。結果將是所有的垃圾輪廓將被刪除,只有這三個框將被留下。

所以現在我的問題是我怎麼得到contours這樣的輪廓,我已經通過調用以下函數得到:

findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
+0

我猜QR碼在顏色紋理圖像上比在輪廓圖像上更容易。如果您可以訪問openCV輪廓(而不僅僅是輪廓圖像),則可以首先選擇包含2個不同輪廓(分層)的所有輪廓。這應該減少輪廓的數量,並且仍然包含QR碼的角落立方體 – Micka 2014-11-21 09:38:17

+0

是的,我確實有輪廓。那麼你能告訴我如何選擇帽子有兩種不同的輪廓(分層)的所有輪廓? – gpuguy 2014-11-21 09:47:53

+0

openCV爲您提供層次結構,因此您可以查看輪廓具有多少個外輪廓。但我從來沒有使用過這些信息,所以沒有直接的幫助,抱歉。 – Micka 2014-11-21 09:51:17

回答

0

如果你想上的輪廓,包括在感興趣的輪廓數過濾,你應該使用層次結構變量。一個可能的代碼做這將是:

void updateInclusionScores(std::vector< std::vector<int> > const& hierarchy, 
          std::vector<int>& scores) 
{ 
    for (size_t i = 0; i < hierarchy.size(); ++i) 
    { 
     scores[i] = 0; 
     if (hierarchy[i][3] >= 0) 
     { 
      int current = i; 
      while (hierarchy[current][3] >= 0) 
      { 
       current = hierarchy[current][3]; 
      } 
     } 
    } 
} 

然後,您可以根據存儲在scores其列入計數過濾你的輪廓。 (我有意忽略了分配scores並優化分數計算的問題,另外,應該有一種使用函數式編程來表達這種過濾操作的好方法,特別是在使用C++ 11時,但您會看到想法)。

作爲替代方案,我還建議使用Hough變換計算線的方向,然後根據Hough例程中找到的線構建方塊。這種方法幾年前被用來檢測校準圖案的平方,因爲它對某些線交叉點的遮擋(即,圖像中缺失的方形角)是魯棒的。