libdecodeqr庫不能識別大角度二維碼問題解決
首先宣告使用的是libdecodeqr-0.9.3版本的二維碼識別庫,其他版本有沒有這個問題不是很清楚,這個庫是基於OpenCV1寫的,但是比較輕量,專案使用挺方便的。但是使用中發現,二維碼旋轉角度超過15°,順著程式往下讀,發現問題出現在定位框的識別部分。下面詳細說明。
libdecodeqr只能識別QR碼,QR碼就是最常見的那種,它有三個定位框,這三個定位框在QR碼中比較重要,解碼程式要先識別到定位框,才能確定當前圖片中的有效區域,以及二維碼偏轉角度,然後才能提取出有效資訊再進行下一步的解碼操作。那麼這三個定位框是怎麼識別的呢,在libdecodeqr方法中,是先對二維碼影象進行預處理,預處理過程就不說了,然後對整個圖搜尋輪廓,把所有的輪廓存放在一個容器中,然後對每個輪廓,找到它的包圍矩形,再計算這個包圍矩形的面積和輪廓集的面積的比,以及外包圍矩形的長於寬之比,當這兩個比值都大於設定的閾值時,就說明這個輪廓滿足長寬比接近,且輪廓很規則,則說明這個輪廓是定位框上的白邊或者黑邊,然後在判斷如果這個圖發現有三套巢狀的白邊和黑邊,就說明這個三個定位框都找到了,否則就說明不完整,二維碼也就無法識別。那麼libdecodeqr查詢這個輪廓有什麼問題呢。
libdecodeqr中,查詢輪廓的外包圍矩形時,用的是cvRect這個結構,這個結構不帶角度,只有中心、長寬四個量,那麼用它去逼近輪廓時,如果輪廓是個旋轉的,這個外輪廓不會旋轉,那麼它就會很大,這就導致很有可能雖然輪廓是正方形,但是輪廓旋轉後外包圍的矩形不是正方形,這樣就不能判斷為定位框,也就無法識別,所以這裡把它改為cvBox結構,cvBox結構除了有中心座標、長寬之外,還有旋轉角度,也就是說這個輪廓是以合適的角度逼近輪廓的,那麼不管二維碼旋轉多少角度,都可以識別,改完以後,果然可以實現360°任意識別。