1. 程式人生 > >OpenCV學習筆記(五十九)——marker檢測識別"Master OpenCV"chp.2

OpenCV學習筆記(五十九)——marker檢測識別"Master OpenCV"chp.2

第二章原本是講如何將基於標定的增強現實在ios平臺實現,包括以下4個方面:

1、在ios平臺建立opencv工程

2、Marker檢測識別

3、攝像機標定及Marker姿態估計

4、在Marker基礎上渲染一個3維虛擬物體

這裡面第一部分是IOS平臺的開發,我不是太關注,略去;第四部分是基於OpenGL的3維虛擬物體建立,也是基於IOS平臺,因為第三章裡還要用到OpenGL,這裡留著第三章再解剖。所以這裡主要分析第二部分和第三部分。這一篇介紹第二部分。感覺這個東西有點像二維碼識別。不知道2維碼是怎麼做的哦

MarkerDetection類任務processFrame:圖1


轉為灰度圖、2值化(固定閾值法threshold

:受光照等影響明顯;自適應閾值法adaptiveThreshold:更好)(我這裡用OpenCV243裡的adaptiveThreshold函式未能實現自適應濾波的效果,效果像邊緣檢測的演算法,很困惑。。最後用threshold函式代替,這個問題未能解決,希望高手指點,ps:網上高手多啊,這個問題已經解決了),檢測後的結果如圖threshold(圖1左上)

findMarkerContours函式進行輪廓檢測findContours(用多邊形的頂點最好,去掉小於閾值的點(對小的輪廓不感興趣),把每個輪廓的點按照逆時針排序,並去掉距離太近的輪廓),結果如圖contours(圖1中上)

接下來findMarkerCandidates函式對輪廓進行篩選,先用approxPolyDP

得到輪廓近似的多邊形。進行篩選,為凸多邊形且頂點為4的才有可能是marker,並檢測這個4邊形的邊長,最小邊長如果小於10pixel,也不認為是一個marker。然後把得到的可能的marker的輪廓點按照逆時針排序。並且檢測是否檢測到重複的marker,如果檢測到重複的marker,去掉周長更短的那個。這步之後效果如下markerCandidate(圖1左下)

detectMarkers函式有3個任務,去除投影變換的影響(getPerspectiveTransform得到投影矩陣,warpPerspective得到正面的視角的影象),得到marker正面的檢視。

然後對這個marker的正面圖進行解碼,threshold對marker使用THRESH_OTSU

進行2值化。效果圖:


接下來對這個marker進行識別marker.decode。檢測編碼marker(對marker解碼,marker編碼為7*7的柵格,中心5*5為ID,周圍一圈為黑色邊界,檢測的時候先檢測周圍一圈是否為黑色邊界,然後再對中心5*5解碼(注意,只有5*5具有旋轉不變形才能得到唯一的碼),是5bit*5word,每個word中的5bit,2位為id(2位4位),3位為校驗碼(用來保證旋轉),所以5word一共有2^10=1024個不同id,而且第一位要置反,目的是要防止一個word全黑,不易檢測。舉例,我這裡使用的marker的5個word的id分別為10、01、11、11、11。那麼如何從剛剛得到的marker圖提取出7*7的2值柵格呢,這裡用個Mat(Rect)取marker中的小方塊,用countNonZero來判斷這個方塊為0or1。因為marker有4個方向,哪個方向才是我對應的marker的id的,這裡用id和我驗證用的id的hamming距離來做依據,漢明距最小的即marker的方向。

確認為一個marker後再得到輪廓的細緻的corner,使用cornerSubPix,這時才進行細化,是因為這個函式相對耗時,如果之前就對各corner細化,由於候選目標很多,會加重計算負擔。)效果圖marker(圖1右下)。

最後我試了其他的marker編碼,都能正確解碼出id資訊,效果圖如下:第一幅圖的id為0011010101,第二幅圖為第一圖的旋轉,id相同,第三圖id為0011000110,第四圖不是一個marker,故沒有檢測出來。


在下一篇裡,將介紹如何用這個marker的輪廓位置,和輪廓(紅色)的方向(黃點)來在marker上建立一個3維的虛擬物體。

相關推薦

OpenCV學習筆記——marker檢測識別"Master OpenCV"chp.2

第二章原本是講如何將基於標定的增強現實在ios平臺實現,包括以下4個方面: 1、在ios平臺建立opencv工程 2、Marker檢測識別 3、攝像機標定及Marker姿態估計 4、在Marker基礎上渲染一個3維虛擬物體 這裡面第一部分是IOS平臺的開發,我不是太關注,略

OpenCV學習筆記——讀《Master OpenCV》初感

好久沒更新這個系列了。去年12月初的時候就知道出了一本OpenCV的新書《Master OpenCV with Practical Computer Vision Projects》,一直沒來得及看,春節前也不想做什麼任務,就把這書讀一讀吧。大概看了一下,和OpenCV的其

OpenCV學習筆記——imge stitching影象拼接stitching

stitching是OpenCV2.4.0一個新模組,功能是實現影象拼接,所有的相關函式都被封裝在Stitcher類當中。這個類當中我們可能用到的成員函式有createDefault、estimateTransform、composePanorama、stitch。其內部實

OpenCV學習筆記——建立支援OpenGL的OpenCV工程“Master OpenCVchp.3

從OpenCV2.4beta版本,OpenGL就可以有介面到highgui的模組中了。結合Master OpenCV第三章的閱讀,這裡說說如何在OpenCV的顯示中嵌入OpenGL的虛擬物體。 要注意的一點:如果想使OpenCV支援OpenGL,不能使用預編譯好的libra

OpenCV學習筆記——小試SVM演算法ml OpenCV學習筆記——基於級聯分類器的目標檢測objdect OpenCV學習筆記——光流法對運動目標跟蹤Video Ope

OpenCV學習筆記(二十六)——小試SVM演算法ml  總感覺自己停留在碼農的初級階段,要想更上一層,就得靜下心來,好好研究一下演算法的東西。OpenCV作為一個計算機視覺的開源庫,肯定不會只停留在數字影象處理的初級階段,我也得加油,深入研究它的演算法庫。就從ml入手

OpenCV學習筆記——用OpenCV做人臉識別和性別識別contrib

人臉識別的故事說也說不完,調研的事還是交給大家吧。這裡說的是用OpenCV做人臉識別。 因為是真正的人臉識別,不是搞笑娛樂的東西,所以資料庫一定要強大的,推薦個網站http://www.face-rec.org/databases/。這裡有最全的人臉庫的概述,希望大家能找到

Linux學習筆記日常運維一

日常運維一、查看系統負載w/uptime 查看系統負載 load average後指系統在一分鐘,五分鐘,十五分鐘內的運行狀態,平均有多少服務在運行負載值大於邏輯cpu數就說明超負荷了,數值小於cpu數是理想狀態 cat /proc/cpuinfo 查看cpu核數processor 後的數字就是cpu數量減一

Linux學習總結shell 腳本3-for while 循環

shell 循環 for while 1 for 循環 語法: for 變量名 in 條件;do ...; done舉例1 #!/bin/bash sum=0 for i in `seq 1 100`;do sum=$[$sum+$i] done echo $sum 舉例2找到/123 目錄

Effective_STL 學習筆記 需要一個一個字元輸入時考慮使用 istreambuf_iterator

  使用 istreambuf_iterator : 1   ifstream inputFile( "interestingData.txt" ); 2   string fileData( (ifstreambuf_iterator<char>(inputFile)), i

Effective_STL 學習筆記 用純函數做判斷式

函數類 effect false 函數 轉換 bsp 對象 stl 排序 1. 判斷式是返回 bool (或者其他隱式轉換為 bool 的東西)。判斷式在 STL 中廣泛使用。標準關聯容器的比較函數是判斷式,判斷式函數常常作為參數傳給算法,比如 find_if 和多種排

OpenCV學習筆記——實用函式、系統函式、巨集core

如果你想在OpenCV的基礎上自己開發一些演算法,我覺得core這部分內容不得不精啊,能熟練使用OpenCV的資料結構是開發的基礎,又是重中之重。最近就又拌在這上頭了,所以再重溫一下。這次分析一下Utility and System Functions and Macros

OpenCV學習筆記——Kalman濾波做運動目標跟蹤

kalman濾波大家都很熟悉,其基本思想就是先不考慮輸入訊號和觀測噪聲的影響,得到狀態變數和輸出訊號的估計值,再用輸出訊號的估計誤差加權後校正狀態變數的估計值,使狀態變數估計誤差的均方差最小。具體它的原理和實現,我想也不用我在這裡費口舌,但這個理論基礎必須的有,必須得知道想

OpenCV學習筆記——再看基礎資料結構core

記得我在OpenCV學習筆記(四)——新版本的資料結構core裡面講過新版本的資料結構了,可是我再看這部分的時候,我發現我當時實在是看得太馬虎了。對於新版本的資料結構,我再說說。 Point_類不用多言,裡面兩個成員變數x,y。Point_<int>就是Poin

OpenCV學習筆記——簡單的單目視覺測距嘗試

    前言:         視覺測距作為機器視覺領域內基礎技術之一而受到廣泛的關注,其在機器人領域內佔有重要的地位,廣泛應用於機器視覺定位、目標跟蹤、視覺避障等。機器視覺測量主要分為:單目視覺測量、雙目視覺測量、結構光視覺測量等。結構光由於光源的限制,應用的場合比較固定;

OpenCV學習筆記——小試SVM演算法ml

總感覺自己停留在碼農的初級階段,要想更上一層,就得靜下心來,好好研究一下演算法的東西。OpenCV作為一個計算機視覺的開源庫,肯定不會只停留在數字影象處理的初級階段,我也得加油,深入研究它的演算法庫。就從ml入手吧,最近做東西遇到隨機森林,被搞的頭大,深深感覺自己肚子裡貨太

OpenCV學習筆記——車輛識別和跟蹤

     今天在GitHub上看到一個對車輛訓練好的模型,即xml檔案,於是拿來測試了一個效果。我用這個xml檔案對視訊中的每一幀畫面進行簡單的車輛識別定位,演示程式碼如下:import cv2 import numpy as np camera = cv2.VideoCa

VB.net學習筆記認識STA與MTA

一、應用程式中的多執行緒     VB5/6支援多執行緒,但支援的執行緒模式都是STA(單執行緒單元,Single Threaded Apartments)。     .NET Framework中沒有單元的概念,它是在應用程式域中管理所有執行緒的。預設情況下,所有的.N

python OpenCV學習筆記:Hough線變換

Hough變換是一種很流行的技術,可以檢測任何可以用數學的形式來表示的形狀。即使它被破壞或變形,它也能檢測出它的形狀。我們將會看到它是如何工作的。 一條線可以表示成y = mx + c或引數形式,像ρ=xcosθ+ysinθ,其中ρ是從原點到直線的垂直

OpenCV學習筆記——初探GPU

好久沒有更新啦,感覺最近沒有什麼特別的收穫值得和大家分享,還是有些懶,TLD結束了也沒有寫個blog做總結。還是和大家分享一下OpenCV的一個大家很少接觸的模組吧——GPU。這個部分我接觸的也是很少,只是根據教程和大家簡單交流一下,如果有高手有使用心得,歡迎多多批評。 O

OpenCV學習筆記——《OpenCV Computer Version with Python》閱讀摘要

現在python火啊,每次OpenCV自帶的ml模組都讓我直呼坑爹,索性準備用python來做OpenCV後期的機器學習演算法的處理。於是趕緊拿起這本書讀讀。 適合OpenCV和python都有一定基礎的。。。。由於都比較熟悉這兩個東西,我閱讀之前比較關心的只有幾個問題,具