1. 程式人生 > >【目標檢測】目標檢測原理與實現(一)

【目標檢測】目標檢測原理與實現(一)

轉載:http://blog.csdn.net/marvin521/article/details/9058735

基於閾值影象處理的目標檢測    

      從今天起開始要寫一些關於目標檢測的文章,涵蓋從簡單的閾值影象處理檢測、霍夫變換(hough transform)檢測、模版匹配檢測(剛體匹配)、AAM+ASM+ACM(非剛體)匹配檢測到近代機器學習方法檢測,儘量貼一些程式碼,這些很實用。本篇就從閾值影象處理檢測開始。閾值顧名思義就是一個分界值,做影象處理的都明白閾值的用途,但是考慮到各種觀眾,乾脆把OpenCV中的各種閾值識別符號和對應程式碼示意都貼出來,如(圖一)所示:


(圖一)

       仔細閱讀下(圖一)中的各種虛擬碼,就很容易明白閾值函式的工作機制,其中src(x,y)是影象畫素點值。下面就給出一個處理答題卡的例子,(圖二)是從網上找到的一個答題卡樣圖,我們的目標是檢測到哪些選項被塗黑了,然後根據座標判定是哪個數字,其實根據座標是有依據的,因為答題卡四個角有一些對準線,對齊後用掃描器掃描後緊跟著經過演算法處理就可以判斷出考生選項,本篇文章就簡化流程,考慮到塗的選項是黑色的,因此我們使用第二個閾值方法,經過處理後如(圖三)所示。

    

(圖二)                                         (圖三)

幾乎perfect,嘿嘿大笑

,下面把程式碼也貼出來,Python版本的。

  1. import numpy as np  
  2. import cv2  
  3. img=cv2.imread('anwser_sheet.jpg')  
  4. grey=cv2.cvtColor(img,cv2.cv.CV_BGR2GRAY)  
  5. retval,grey=cv2.threshold(grey,90,255,cv2.cv.CV_THRESH_BINARY_INV)  
  6. grey=cv2.erode(grey,None)  
  7. grey=cv2.dilate(grey,None)  
  8. contours,hierarchy=cv2.findContours(grey.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)  
  9. newimg=np.zeros_like(grey)   
  10. cv2.drawContours(newimg, contours, -1255)  
  11. cv2.imshow('test',newimg)  
  12. cv2.imwrite("processed.jpg",newimg)  
  13. cv2.waitKey()  
程式碼流程先是讀取影象檔案,接著轉成灰度圖,接著做個開運算(腐蝕後再膨脹),接著閾值處理,最後把目標輪廓畫出,根據目標塊的座標可以大概的推算出對應的數字,接著秀一下打印出某個塗項,比如最後一個,那麼只需要把

cv2.drawContours(newimg, contours, -1, 255) 改成 cv2.drawContours(newimg, contours, 0, 255)

第三個引數為負數表示列印所有輪廓,0表示列印最後一個選項,列印是倒著數的。如(圖四)所示:


(圖四)

      基於閾值影象處理的目標檢測一般只適應於自己能控制顏色和亮度的專案中,這也為什麼規定答題卡要儘量使用黑色的(同一顏色方便閾值處理),另外這種方法也可以用在目標的三維重建上,如(圖五)所示,用閾值的方法找到汽車上的標定點對後續點雲的獲取很有幫助,進而完成整個汽車模型的三位重建,此方法雖然簡單,但對這幾種場景很實用,通過簡單的影象處理(各個階段去噪)後,然後簡單的查詢下各種閉合小輪廓就OK了,好了,今天就說到這,比較簡單,後續會越來越複雜些,用到的數學知識也越來越多。


(圖五)