日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv图像识别

發(fā)布時間:2025/4/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv图像识别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


利用OpenCV檢測圖像中的長方形畫布或紙張并提取圖像內(nèi)容



?
問題如下:




也就是在一張照片里,已知有個長方形的物體,但是經(jīng)過了透視投影,已經(jīng)不再是規(guī)則的長方形,那么如何提取這個圖形里的內(nèi)容呢?這是個很常見的場景,比如在博物館里看到一幅很喜歡的畫,用手機找了下來,可是回家一看歪歪斜斜,腦補原畫內(nèi)容又覺得不對,那么就需要算法輔助來從原圖里提取原來的內(nèi)容了。不妨把應用的場景分為以下:
紙張四角的坐標(圖中紅點)已知的情況


也就是上面的左圖中4個紅點是可以準確獲取,比如手動標注,那么就簡單了:用OpenCV的Perspective Transform就可以。具體步驟如下:
1) 將標注好的四個點坐標存入一個叫corner的變量里,比如上面的例子中,原圖的分辨率是300x400,定義x和y的方向如下:


那么紙張的四角對應的坐標分別是:
左上:157.6, 71.5
右上:295.6, 118.4 ? 右下:172.4, 311.3 ? 左下:2.4, 202.4
?
把這四個坐標按如上順序放到一個叫corner的變量里。如果我們打算把這幅圖案恢復到一個300x400的圖像里,那么按照對應的順序把下面四個坐標放到一個叫canvas的變量里:
左上:0, 0
右上:300, 0
右下:300, 400 ? 左下:0, 400
?
假設(shè)原圖已經(jīng)用OpenCV讀取到一個叫image的變量里,那么提取紙張圖案的代碼如下:
1 M = cv2.getPerspectiveTransform(corners, canvas)
2 result = cv2.warpPerspective(image, M, (0, 0))
把左圖剪裁出來,去掉紅點后試了試,結(jié)果如下:


當然,其實這一步用Photoshop就可以了。。
紙張四角的坐標未知或難以準確標注的情況


這種場景可能是小屏幕應用,或是原始圖像就很小,比如我這里用的這個300x400例子,點坐標很難精確標注。這種情況下一個思路是,用邊緣檢測提取紙張四邊,然后求出四角坐標,再做Perspective Transform。
?
1) 圖像預處理
一般而言即使做普通的邊緣檢測也需要提前對圖像進行降噪避免誤測,比如最常見的辦法是先對圖像進行高斯濾波,然而這樣也會導致圖像變得模糊,當待檢測圖形邊緣不明顯,或是圖像本身分辨率不高的情況下(比如本文用的例子),會在降噪的同時把待檢測的邊緣強度也給犧牲了。具體到本文的例子,紙張是白色,背景是淺黃帶紋路,如果進行高斯濾波是顯然不行的,這時候一個替代方案是可以考慮使用Mean Shift,Mean Shift的優(yōu)點就在于如果是像背景桌面的淺色紋理,圖像分割的過程中相當于將這些小的浮動過濾掉,并且保留相對明顯的紙張邊緣,結(jié)果如下:
原圖


處理后


Meanshift的代碼:
1 image = cv2.pyrMeanShiftFiltering(image, 25, 10)
因為主要目的是預處理降噪,windows size和color distance都不用太大,避免浪費計算時間還有過度降噪。降噪后可以看到桌面上的紋理都被抹去了,紙張邊緣附近干凈了很多。然而這還遠遠不夠,圖案本身,和圖像里的其他物體都有很多明顯的邊緣,而且都是直線邊緣。


2) 紙張邊緣檢測


雖然降噪了,可是圖像里還是有很多邊緣明顯的元素。怎么盡量只保留紙張的邊緣呢,這時候可以考慮用分割算法,把圖像分為紙張部分和其他部分,這樣分割的mask邊緣就和紙張邊緣應該是差不多重合的。在這里可以考慮用GrabCut,這樣對于簡單的情況,比如紙張或畫布和背景對比強烈的,直接把圖像邊緣的像素作為bounding box就可以實現(xiàn)自動分割。當自動分割不精確的情況下再引入手動輔助分割,具體到我這里用的例子,背景和畫面接近,所以需要手動輔助:


結(jié)果如下:


可以看到,分割后的結(jié)果雖然能基本區(qū)分紙張形狀了,可是邊緣并不準確,另外鍵盤和部分桌面沒能區(qū)分開來。這時可以繼續(xù)用GrabCut+手動標注得到只有紙張的分割。或者為了用戶友好的話,盡量少引入手動輔助,那么可以考慮先繼續(xù)到下一步檢測邊緣,再做后期處理。假設(shè)我們考慮后者,那么我們得到的是如下的mask:


這個mask并不精確,所以不能直接用于邊緣檢測,但是它大致標出了圖片里最明顯的邊緣位置所在,所以可以考慮下面的思路:保留降噪后位于mask邊緣附近的信息用于真正的邊緣檢測,而把其他部分都模糊處理,也就是說基于上面得到的mask做出下面的mask用于模糊處理:


基于這個mask得到的用于邊緣檢測的圖像如下:


用canny算子檢測出邊緣如下:


3) 直線檢測


對檢測到的邊緣使用Hough變換檢測直線,我例子里用的是cv2.HoughLinesP,分辨率1像素和1°,可以根據(jù)圖像大小設(shè)置檢測的閾值和minLineLength去除大部分誤檢測。特別提一下的是如果使用OpenCV的Python binding,OpenCV 2和OpenCV 3的結(jié)果結(jié)構(gòu)是不一樣的,如果進行代碼移植需要相應的修改。檢測到的結(jié)果如下:


可以看到,有些線幾乎重合在一起了,這是難以避免的,上圖中一共檢測到9條線,其中兩對(下、右邊緣)重合。可以通過距離判斷和直線相對角度來判斷并把重合線段合為一條:


剩下的都是沒有重合的線了。
4) 判斷紙張邊緣


那么如何選取紙張邊緣的四條線呢(即使圖像分割步驟非常好得分開了紙張和其他部分,這在有些情況下還是難以避免的,比如圖案里有和邊緣平行的線條),可以沿著提取線段的兩邊采樣像素的灰度:


在線段的兩個端點之間平均采樣左右兩邊像素的值,因為一般來說如果是紙張或者畫布,邊緣和背景的顏色在四邊上應該都是類似的。然而這樣做的話引入另外一個問題是需要區(qū)分線段的“左”和“右”,對于線段本身而言就是要區(qū)分前后。所以需要對畫面里所有的線段端點進行排序,而這個排序的基準就是相對畫布。


具體到本文的例子就是把圖像中心定義為所有線段的“左”邊,如上圖。而決定線段端點“前”和“后”可以用如下辦法:


先假設(shè)線段的前后端點,將兩個端點坐標分別減去中心點(紅點)的坐標,然后將得到的兩個向量a和b求叉積,如果叉積大于0則說明假設(shè)正確,如果<0則交換假設(shè)的前后端點。線段端點的順序確定后就可以進行采樣了,簡單起見可以分別采樣左右兩側(cè)的像素灰度值,如果希望更準確可以采樣RGB通道的值進行綜合比較,下面是7條線段對應的兩側(cè)像素灰度的中值分布:


可以看到其中有4個點距離非常近(紅色),說明他們的像素灰度分布也很接近,把這4條選出來,結(jié)果如下:


正是要的結(jié)果。


5) 計算四角的坐標


接下來計算四條線的交點,方法點這里。因為有4條線,會得到6個結(jié)果,因為在這種應用場景中,方形的物體在透視變換下不會出現(xiàn)凹角,所以直接舍棄離紙張中心最遠的兩個交點就得到了四個角的坐標,結(jié)果如下:






這樣就回到了一開始四角坐標已經(jīng)得到的情況,直接進行透視變換就行了。


Camera Calibration?


寫了這么多,其實有一條至關(guān)重要的假設(shè),甚至可以說是最關(guān)鍵的步驟之一我一直沒提,那就是Camera Calibration,如果有相機的情況下,meta data都知道,那么需要先坐Camera Calibration才能知道紙張或者畫布的原始尺寸。我這里試的例子當然是沒有的,也可以有,相應的算法OpenCV里也有現(xiàn)成的,不過即便如此還是非常麻煩,所以我的所有流程都是默認原始尺寸已經(jīng)獲得了。再說了,就算沒有,變換回方形之后使用者憑感覺進行簡單軸縮放都比Camera Calibration方便得多。。


========


用 Python 和 OpenCV 檢測圖片上的條形碼



?
這篇博文的目的是應用計算機視覺和圖像處理技術(shù),展示一個條形碼檢測的基本實現(xiàn)。我所實現(xiàn)的算法本質(zhì)上基于StackOverflow 上的這個問題,瀏覽代碼之后,我提供了一些對原始算法的更新和改進。


首先需要留意的是,這個算法并不是對所有條形碼有效,但會給你基本的關(guān)于應用什么類型的技術(shù)的直覺。


假設(shè)我們要檢測下圖中的條形碼:






圖1:包含條形碼的示例圖片


現(xiàn)在讓我們開始寫點代碼,新建一個文件,命名為detect_barcode.py,打開并編碼:


1 # import the necessary packages
2 import numpy as np
3 import argparse
4 import cv2
5
6 # construct the argument parse and parse the arguments
7 ap = argparse.ArgumentParser()
8 ap.add_argument("-i", "--image", required = True, help = "path to the image file")
9 args = vars(ap.parse_args())
我們首先做的是導入所需的軟件包,我們將使用NumPy做數(shù)值計算,argparse用來解析命令行參數(shù),cv2是OpenCV的綁定。


然后我們設(shè)置命令行參數(shù),我們這里需要一個簡單的選擇,–image是指包含條形碼的待檢測圖像文件的路徑。


現(xiàn)在開始真正的圖像處理:


11 # load the image and convert it to grayscale
12 image = cv2.imread(args["image"])
13 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
14
15 # compute the Scharr gradient magnitude representation of the images
16 # in both the x and y direction
17 gradX = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 1, dy = 0, ksize = -1)
18 gradY = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 0, dy = 1, ksize = -1)
19
20 # subtract the y-gradient from the x-gradient
21 gradient = cv2.subtract(gradX, gradY)
22 gradient = cv2.convertScaleAbs(gradient)
12~13行:從磁盤載入圖像并轉(zhuǎn)換為灰度圖。


17~18行:使用Scharr操作(指定使用ksize = -1)構(gòu)造灰度圖在水平和豎直方向上的梯度幅值表示。


21~22行:Scharr操作之后,我們從x-gradient中減去y-gradient,通過這一步減法操作,最終得到包含高水平梯度和低豎直梯度的圖像區(qū)域。


上面的gradient表示的原始圖像看起來是這樣的:






圖:2:條形碼圖像的梯度表示


注意條形碼區(qū)域是怎樣通過梯度操作檢測出來的。下一步將通過去噪僅關(guān)注條形碼區(qū)域。


?
24 # blur and threshold the image
25 blurred = cv2.blur(gradient, (9, 9))
26 (_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)
25行:我們要做的第一件事是使用9*9的內(nèi)核對梯度圖進行平均模糊,這將有助于平滑梯度表征的圖形中的高頻噪聲。


26行:然后我們將模糊化后的圖形進行二值化,梯度圖中任何小于等于255的像素設(shè)為0(黑色),其余設(shè)為255(白色)。


模糊并二值化后的輸出看起來是這個樣子:






圖3:二值化梯度圖以此獲得長方形條形碼區(qū)域的粗略近似


然而,如你所見,在上面的二值化圖像中,條形碼的豎杠之間存在縫隙,為了消除這些縫隙,并使我們的算法更容易檢測到條形碼中的“斑點”狀區(qū)域,我們需要進行一些基本的形態(tài)學操作:


28 # construct a closing kernel and apply it to the thresholded image
29 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
30 closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
29行:我們首先使用cv2.getStructuringElement構(gòu)造一個長方形內(nèi)核。這個內(nèi)核的寬度大于長度,因此我們可以消除條形碼中垂直條之間的縫隙。


30行:這里進行形態(tài)學操作,將上一步得到的內(nèi)核應用到我們的二值圖中,以此來消除豎杠間的縫隙。


現(xiàn)在,你可以看到這些縫隙相比上面的二值化圖像基本已經(jīng)消除:






圖4:使用形態(tài)學中的閉運算消除條形碼豎條之間的縫隙


當然,現(xiàn)在圖像中還有一些小斑點,不屬于真正條形碼的一部分,但是可能影響我們的輪廓檢測。


讓我們來消除這些小斑點:


32 # perform a series of erosions and dilations
33 closed = cv2.erode(closed, None, iterations = 4)
34 closed = cv2.dilate(closed, None, iterations = 4)
我們這里所做的是首先進行4次腐蝕(erosion),然后進行4次膨脹(dilation)。腐蝕操作將會腐蝕圖像中白色像素,以此來消除小斑點,而膨脹操作將使剩余的白色像素擴張并重新增長回去。


如果小斑點在腐蝕操作中被移除,那么在膨脹操作中就不會再出現(xiàn)。


經(jīng)過我們這一系列的腐蝕和膨脹操作,可以看到我們已經(jīng)成功地移除小斑點并得到條形碼區(qū)域。






圖5:應用一系列的腐蝕和膨脹來移除不相關(guān)的小斑點


最后,讓我們找到圖像中條形碼的輪廓:


36 # find the contours in the thresholded image, then sort the contours
37 # by their area, keeping only the largest one
38 (cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,
39 ?cv2.CHAIN_APPROX_SIMPLE)
40 c = sorted(cnts, key = cv2.contourArea, reverse = True)[0]
41
42 # compute the rotated bounding box of the largest contour
43 rect = cv2.minAreaRect(c)
44 box = np.int0(cv2.cv.BoxPoints(rect))
45
46 # draw a bounding box arounded the detected barcode and display the
47 # image
48 cv2.drawContours(image, [box], -1, (0, 255, 0), 3)
49 cv2.imshow("Image", image)
50 cv2.waitKey(0)
38~40行:幸運的是這一部分比較容易,我們簡單地找到圖像中的最大輪廓,如果我們正確完成了圖像處理步驟,這里應該對應于條形碼區(qū)域。


43~44行:然后我們?yōu)樽畲筝喞_定最小邊框


48~50行:最后顯示檢測到的條形碼


正如你在下面的圖片中所見,我們已經(jīng)成功檢測到了條形碼:






圖6:成功檢測到示例圖像中的條形碼


下一部分,我們將嘗試更多圖像。


成功的條形碼檢測


要跟隨這些結(jié)果,請使用文章下面的表單去下載本文的源碼以及隨帶的圖片。


一旦有了代碼和圖像,打開一個終端來執(zhí)行下面的命令:


$ python detect_barcode.py --image images/barcode_02.jpg




圖7:使用OpenCV檢測圖像中的一個條形碼


檢測椰油瓶子上的條形碼沒有問題。


讓我們試下另外一張圖片:


$ python detect_barcode.py --image images/barcode_03.jpg




圖8:使用計算機視覺檢測圖像中的一個條形碼


我們同樣能夠在上面的圖片中找到條形碼。


關(guān)于食品的條形碼檢測已經(jīng)足夠了,書本上的條形碼怎么樣呢:


$ python detect_barcode.py --image images/barcode_04.jpg




圖9:使用Python和OpenCV檢測書本上的條形碼


沒問題,再次通過。


那包裹上的跟蹤碼呢?


$ python detect_barcode.py --image images/barcode_05.jpg




圖10:使用計算機視覺和圖像處理檢測包裹上的條形碼


我們的算法再次成功檢測到條形碼。


最后,我們再嘗試一張圖片,這個是我最愛的意大利面醬—饒氏自制伏特加醬(Rao’s Homemade Vodka Sauce):


$ python detect_barcode.py --image images/barcode_06.jpg




圖11:使用Python和Opencv很容易檢測條形碼


我們的算法又一次檢測到條形碼!


總結(jié)


這篇博文中,我們回顧了使用計算機視覺技術(shù)檢測圖像中條形碼的必要步驟,使用Python編程語言和OpenCV庫實現(xiàn)了我們的算法。


算法概要如下:


計算x方向和y方向上的Scharr梯度幅值表示
將x-gradient減去y-gradient來顯示條形碼區(qū)域
模糊并二值化圖像
對二值化圖像應用閉運算內(nèi)核
進行系列的腐蝕、膨脹
找到圖像中的最大輪廓,大概便是條形碼
需要注意的是,該方法做了關(guān)于圖像梯度表示的假設(shè),因此只對水平條形碼有效。


如果你想實現(xiàn)一個更加魯棒的條形碼檢測算法,你需要考慮圖像的方向,或者更好的,應用機器學習技術(shù)如Haar級聯(lián)或者HOG + Linear SVM去掃描圖像條形碼區(qū)域。


========


數(shù)字萬用表(七段數(shù)碼管)的圖像識別(opencv實現(xiàn))



版權(quán)聲明:歡迎轉(zhuǎn)載,但請保留文章原始出處:)http://blog.csdn.net/xgbing
? ? ? ? 最近接觸圖像處理,要實現(xiàn)數(shù)字萬用表數(shù)據(jù)的自動讀取。我使用opencv+VC2005環(huán)境開發(fā),OpenCV是Intel 開源計算機視覺庫,它提供了強大的圖像處理函數(shù)庫。Opencv的介紹在這里太不多說,可以看看百度百科了解一下:http://baike.baidu.com/view/1343775.htm。
? ? ? ? 萬用表的識別過程是先提取攝像頭的一幀數(shù)據(jù),然后對這幅圖像做處理:


(1)提取攝像頭的一幀數(shù)據(jù)
[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片
//讀取攝像頭一幀數(shù)據(jù) ?
img0=cvQueryFrame(m_Video); ?


(2)對圖像進行平滑處理
[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片
cvSmooth(src_img, src_img,CV_GAUSSIAN, 5, 0); ?


(3)圖像的灰度處理
[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片
? ? cvCvtColor(src_img, gray_img, CV_BGR2GRAY); ?
??
? ? //灰度圖像 ?
#ifdef SHOW_PROC_IMG ?
? ? cvNamedWindow(PIC_GLAY_WINDOW_NAME, CV_WINDOW_AUTOSIZE); ?
? ? cvShowImage(PIC_GLAY_WINDOW_NAME, gray_img); ?
#endif ?


(4)對圖像進行直方圖均衡化處理
[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片
? ? IplImage* img_zf = cvCreateImage( img_size, IPL_DEPTH_8U, 1 ); ?
? ? cvEqualizeHist(gray_img, img_zf); ?
??
? ? cvReleaseImage(&gray_img); ?
??
#ifdef SHOW_PROC_IMG ?
? ? cvNamedWindow("直方圖均衡化", CV_WINDOW_AUTOSIZE); ?
? ? cvShowImage("直方圖均衡化", img_zf); ?
#endif ?


(5)對圖像進行二值化處理
[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片
? ? //二值化圖像 ?
? ? IplImage* pic2_img = cvCreateImage( img_size, IPL_DEPTH_8U, 1 ); ?
??
? ? cvThreshold(img_zf, pic2_img, 50, 255, CV_THRESH_BINARY_INV); ?
? ? cvReleaseImage(&img_zf); ?
#ifdef SHOW_PROC_IMG ?
? ? cvNamedWindow(PIC_2_WINDOW_NAME, CV_WINDOW_AUTOSIZE); ?
? ? cvShowImage(PIC_2_WINDOW_NAME, pic2_img); ?
#endif ?


(6)細化處理
[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片
? ? IplImage* img3 = cvCreateImage( img_size, IPL_DEPTH_8U, 1 ); ?
? ? cvZero(img3); ?
??
? ? cvThin(pic2_img, img3, 5);//細化,通過修改iterations參數(shù)進一步細化 ?
? ? cvReleaseImage(&pic2_img); ?
#ifdef SHOW_PROC_IMG ?
? ? cvNamedWindow("細化", CV_WINDOW_AUTOSIZE); ?
? ? cvShowImage("細化", img3); ?
#endif ?


(7)圖像腐蝕
[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片
? ? IplImage* img4 = cvCreateImage( img_size, IPL_DEPTH_8U, 1 ); ?
? ? ??
??
? ? /圖像腐蝕 ?
#if 1 ?
? ? cvErode(img3, img4, NULL, 1); ?
? ? cvReleaseImage(&img3); ?
??
#ifdef SHOW_PROC_IMG ?
? ? cvNamedWindow("圖像腐蝕", CV_WINDOW_AUTOSIZE); ?
? ? cvShowImage("圖像腐蝕", img4); ? ?
#endif ?


{8}圖像膨脹
[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片
? ? ///圖像膨脹 ?
? ? IplConvKernel *iplele = cvCreateStructuringElementEx(3, 3, 0, 0, CV_SHAPE_RECT); ? ? ?
??
? ? cvDilate(img4, img4, iplele, 1); ?
??
? ? cvReleaseStructuringElement(&iplele); ?
? ? ??
#ifdef SHOW_PROC_IMG ?
? ? cvNamedWindow("圖像膨脹", CV_WINDOW_AUTOSIZE); ?
? ? cvShowImage("圖像膨脹", img4); ?
#endif ?


(9)進一步細化處理
[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片
IplImage* img3_2 = cvCreateImage( img_size, IPL_DEPTH_8U, 1 ); ?
cvZero(img3_2); ?
??
cvThin(img4, img3_2, 5);//細化,通過修改iterations參數(shù)進一步細化 ?
cvCopy(img3_2, img4); ?
cvReleaseImage(&img3_2); ?


(10)查找輪廓,進行數(shù)字分割
[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片
IplImage* img5 = cvCreateImage( img_size, IPL_DEPTH_8U, 1 ); ?
cvCopy(img4, img5); ?
??
CvSeq *contour = NULL; ?
CvMemStorage* storage = cvCreateMemStorage(0); ?
cvFindContours( img5, storage, &contour, sizeof(CvContour),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); ?
??
cvReleaseImage(&img5); ?


(11)消除雜點并進行數(shù)字的識別


========


opencv 幾種圖像識別方法的速度和準確率比較



最近需要使用 opencv 做一個項目,比較了幾種算法,貌似都不能滿足我的需求,下面看一下試驗結(jié)果。git 地址 https://github.com/fredjiang/yutianDetect.git


接著上一篇博客 http://fred.easymorse.com/?p=1358,這里比較一下幾種不同算法的優(yōu)缺點


Screen Shot 2013 04 30 at 3 47 18 PM


如上圖,我這里組合使用了不同的 featureDetector、descriptorExtractor、matcher,分別對速度和準確率做了比較。


輸入框中的數(shù)字對應上圖中的 -detectImage_x,右上角的數(shù)字是時間(毫秒),X 和 V 表示是否識別到了對象


速度:


Screenshot 2013 04 30 15 26 44 Screenshot 2013 04 30 15 26 54


Screenshot 2013 04 30 15 27 06 Screenshot 2013 04 30 15 27 22


準確率:


Screenshot 2013 04 30 15 28 01 Screenshot 2013 04 30 15 28 17


Screenshot 2013 04 30 15 28 39 Screenshot 2013 04 30 15 28 54


根據(jù)以上結(jié)果,我想在 1 秒以內(nèi)正確識別不同的圖像,要么是速度不夠,要么是準確率不夠。


看來只能看看還有不有其它的算法了,或者使用 haartraining 了。


再補充一個


Screen Shot 2013 04 30 at 5 02 06 PM


-detectImage_4(時間3544,又快了 200 毫秒左右)


========


圖像處理和圖像識別中常用的OpenCV函數(shù) ?





1、cvLoadImage:將圖像文件加載至內(nèi)存;


2、cvNamedWindow:在屏幕上創(chuàng)建一個窗口;


3、cvShowImage:在一個已創(chuàng)建好的窗口中顯示圖像;


4、cvWaitKey:使程序暫停,等待用戶觸發(fā)一個按鍵操作;


5、cvReleaseImage:釋放圖像文件所分配的內(nèi)存;


6、cvDestroyWindow:銷毀顯示圖像文件的窗口;


7、cvCreateFileCapture:通過參數(shù)設(shè)置確定要讀入的AVI文件;


8、cvQueryFrame:用來將下一幀視頻文件載入內(nèi)存;


9、cvReleaseCapture:釋放CvCapture結(jié)構(gòu)開辟的內(nèi)存空間;


10、cvCreateTrackbar:創(chuàng)建一個滾動條;


?


11、cvSetCaptureProperty:設(shè)置CvCapture對象的各種屬性;


12、cvGetCaptureProperty:查詢CvCapture對象的各種屬性;


13、cvGetSize:當前圖像結(jié)構(gòu)的大小;


14、cvSmooth:對圖像進行平滑處理;


15、cvPyrDown:圖像金字塔,降采樣,圖像縮小為原來四分之一;


16、cvCanny:Canny邊緣檢測;


17、cvCreateCameraCapture:從攝像設(shè)備中讀入數(shù)據(jù);


18、cvCreateVideoWriter:創(chuàng)建一個寫入設(shè)備以便逐幀將視頻流寫入視頻文件;


19、cvWriteFrame:逐幀將視頻流寫入文件;


20、cvReleaseVideoWriter:釋放CvVideoWriter結(jié)構(gòu)開辟的內(nèi)存空間;


?


21、CV_MAT_ELEM:從矩陣中得到一個元素;


22、cvAbs:計算數(shù)組中所有元素的絕對值;


23、cvAbsDiff:計算兩個數(shù)組差值的絕對值;


24、cvAbsDiffS:計算數(shù)組和標量差值的絕對值;


25、cvAdd:兩個數(shù)組的元素級的加運算;


26、cvAddS:一個數(shù)組和一個標量的元素級的相加運算;


27、cvAddWeighted:兩個數(shù)組的元素級的加權(quán)相加運算(alpha運算);


28、cvAvg:計算數(shù)組中所有元素的平均值;


29、cvAvgSdv:計算數(shù)組中所有元素的絕對值和標準差;


30、cvCalcCovarMatrix:計算一組n維空間向量的協(xié)方差;


?


31、cvCmp:對兩個數(shù)組中的所有元素運用設(shè)置的比較操作;


32、cvCmpS:對數(shù)組和標量運用設(shè)置的比較操作;


33、cvConvertScale:用可選的縮放值轉(zhuǎn)換數(shù)組元素類型;


34、cvCopy:把數(shù)組中的值復制到另一個數(shù)組中;


35、cvCountNonZero:計算數(shù)組中非0值的個數(shù);


36、cvCrossProduct:計算兩個三維向量的向量積(叉積);


37、cvCvtColor:將數(shù)組的通道從一個顏色空間轉(zhuǎn)換另外一個顏色空間;


38、cvDet:計算方陣的行列式;


39、cvDiv:用另外一個數(shù)組對一個數(shù)組進行元素級的除法運算;


40、cvDotProduct:計算兩個向量的點積;


?


41、cvEigenVV:計算方陣的特征值和特征向量;


42、cvFlip:圍繞選定軸翻轉(zhuǎn);


43、cvGEMM:矩陣乘法;


44、cvGetCol:從一個數(shù)組的列中復制元素;


45、cvGetCols:從數(shù)據(jù)的相鄰的多列中復制元素;


46、cvGetDiag:復制數(shù)組中對角線上的所有元素;


47、cvGetDims:返回數(shù)組的維數(shù);


48、cvGetDimSize:返回一個數(shù)組的所有維的大小;


49、cvGetRow:從一個數(shù)組的行中復制元素值;


50、cvGetRows:從一個數(shù)組的多個相鄰的行中復制元素值;


?


51、cvGetSize:得到二維的數(shù)組的尺寸,以CvSize返回;


52、cvGetSubRect:從一個數(shù)組的子區(qū)域復制元素值;


53、cvInRange:檢查一個數(shù)組的元素是否在另外兩個數(shù)組中的值的范圍內(nèi);


54、cvInRangeS:檢查一個數(shù)組的元素的值是否在另外兩個標量的范圍內(nèi);


55、cvInvert:求矩陣的逆;


56、cvMahalonobis:計算兩個向量間的馬氏距離;


57、cvMax:在兩個數(shù)組中進行元素級的取最大值操作;


58、cvMaxS:在一個數(shù)組和一個標量中進行元素級的取最大值操作;


59、cvMerge:把幾個單通道圖像合并為一個多通道圖像;


60、cvMin:在兩個數(shù)組中進行元素級的取最小值操作;


?


61、cvMinS:在一個數(shù)組和一個標量中進行元素級的取最小值操作;


62、cvMinMaxLoc:尋找數(shù)組中的最大最小值;


63、cvMul:計算兩個數(shù)組的元素級的乘積(點乘);


64、cvNot:按位對數(shù)組中的每一個元素求反;


65、cvNormalize:將數(shù)組中元素進行歸一化;


66、cvOr:對兩個數(shù)組進行按位或操作;


67、cvOrs:在數(shù)組與標量之間進行按位或操作;


68、cvReduce:通過給定的操作符將二維數(shù)組簡為向量;


69、cvRepeat:以平鋪的方式進行數(shù)組復制;


70、cvSet:用給定值初始化數(shù)組;


?


71、cvSetZero:將數(shù)組中所有元素初始化為0;


72、cvSetIdentity:將數(shù)組中對角線上的元素設(shè)為1,其他置0;


73、cvSolve:求出線性方程組的解;


74、cvSplit:將多通道數(shù)組分割成多個單通道數(shù)組;


75、cvSub:兩個數(shù)組元素級的相減;


76、cvSubS:元素級的從數(shù)組中減去標量;


77、cvSubRS:元素級的從標量中減去數(shù)組;


78、cvSum:對數(shù)組中的所有元素求和;


79、cvSVD:二維矩陣的奇異值分解;


80、cvSVBkSb:奇異值回代計算;


?


81、cvTrace:計算矩陣跡;


82、cvTranspose:矩陣的轉(zhuǎn)置運算;


83、cvXor:對兩個數(shù)組進行按位異或操作;


84、cvXorS:在數(shù)組和標量之間進行按位異或操作;


85、cvZero:將所有數(shù)組中的元素置為0;


86、cvConvertScaleAbs:計算可選的縮放值的絕對值之后再轉(zhuǎn)換數(shù)組元素的類型;


87、cvNorm:計算數(shù)組的絕對范數(shù), 絕對差分范數(shù)或者相對差分范數(shù);


88、cvAnd:對兩個數(shù)組進行按位與操作;


89、cvAndS:在數(shù)組和標量之間進行按位與操作;?


90、cvScale:是cvConvertScale的一個宏,可以用來重新調(diào)整數(shù)組的內(nèi)容,并且可以將參數(shù)從一種數(shù)


? ? ? ? ? ? ? ? ? 據(jù)類型轉(zhuǎn)換為另一種;


?


91、cvT:是函數(shù)cvTranspose的縮寫;


92、cvLine:畫直線;


93、cvRectangle:畫矩形;


94、cvCircle:畫圓;


95、cvEllipse:畫橢圓;


96、cvEllipseBox:使用外接矩形描述橢圓;


97、cvFillPoly、cvFillConvexPoly、cvPolyLine:畫多邊形;


98、cvPutText:在圖像上輸出一些文本;


99、cvInitFont:采用一組參數(shù)配置一些用于屏幕輸出的基本個特定字體;


100、cvSave:矩陣保存;


?


101、cvLoad:矩陣讀取;


102、cvOpenFileStorage:為讀/寫打開存儲文件;


103、cvReleaseFileStorage:釋放存儲的數(shù)據(jù);


104、cvStartWriteStruct:開始寫入新的數(shù)據(jù)結(jié)構(gòu);


105、cvEndWriteStruct:結(jié)束寫入數(shù)據(jù)結(jié)構(gòu);


106、cvWriteInt:寫入整數(shù)型;


107、cvWriteReal:寫入浮點型;


108、cvWriteString:寫入字符型;


109、cvWriteComment:寫一個XML或YAML的注釋字串;


110、cvWrite:寫一個對象;


?


111、cvWriteRawData:寫入多個數(shù)值;


112、cvWriteFileNode:將文件節(jié)點寫入另一個文件存儲器;


113、cvGetRootFileNode:獲取存儲器最頂層的節(jié)點;


114、cvGetFileNodeByName:在映圖或存儲器中找到相應節(jié)點;


115、cvGetHashedKey:為名稱返回一個惟一的指針;


116、cvGetFileNode:在映圖或文件存儲器中找到節(jié)點;


117、cvGetFileNodeName:返回文件的節(jié)點名;


118、cvReadInt:讀取一個無名稱的整數(shù)型;


119、cvReadIntByName:讀取一個有名稱的整數(shù)型;


120、cvReadReal:讀取一個無名稱的浮點型;


?


121、cvReadRealByName:讀取一個有名稱的浮點型;


122、cvReadString:從文件節(jié)點中尋找字符串;


123、cvReadStringByName:找到一個有名稱的文件節(jié)點并返回它;


124、cvRead:將對象解碼并返回它的指針;


125、cvReadByName:找到對象并解碼;


126、cvReadRawData:讀取多個數(shù)值;


127、cvStartReadRawData:初始化文件節(jié)點序列的讀取;


128、cvReadRawDataSlice:讀取文件節(jié)點的內(nèi)容;


129、cvGetModuleInfo:檢查IPP庫是否已經(jīng)正常安裝并且檢驗運行是否正常;


130、cvResizeWindow:用來調(diào)整窗口的大小;


?


131、cvSaveImage:保存圖像;


132、cvMoveWindow:將窗口移動到其左上角為x,y的位置;


133、cvDestroyAllWindow:用來關(guān)閉所有窗口并釋放窗口相關(guān)的內(nèi)存空間;


134、cvGetTrackbarPos:讀取滑動條的值;


135、cvSetTrackbarPos:設(shè)置滑動條的值;


136、cvGrabFrame:用于快速將視頻幀讀入內(nèi)存;


137、cvRetrieveFrame:對讀入幀做所有必須的處理;


138、cvConvertImage:用于在常用的不同圖像格式之間轉(zhuǎn)換;


139、cvErode:形態(tài)腐蝕;


140、cvDilate:形態(tài)學膨脹;


?


141、cvMorphologyEx:更通用的形態(tài)學函數(shù);


142、cvFloodFill:漫水填充算法,用來進一步控制哪些區(qū)域?qū)⒈惶畛漕伾?#xff1b;


143、cvResize:放大或縮小圖像;


144、cvPyrUp:圖像金字塔,將現(xiàn)有的圖像在每個維度上都放大兩倍;


145、cvPyrSegmentation:利用金字塔實現(xiàn)圖像分割;


146、cvThreshold:圖像閾值化;


147、cvAcc:可以將8位整數(shù)類型圖像累加為浮點圖像;


148、cvAdaptiveThreshold:圖像自適應閾值;


149、cvFilter2D:圖像卷積;


150、cvCopyMakeBorder:將特定的圖像輕微變大,然后以各種方式自動填充圖像邊界;


151、cvSobel:圖像邊緣檢測,Sobel算子;


152、cvLaplace:拉普拉斯變換、圖像邊緣檢測;


153、cvHoughLines2:霍夫直線變換;


154、cvHoughCircles:霍夫圓變換;


155、cvRemap:圖像重映射,校正標定圖像,圖像插值;


156、cvWarpAffine:稠密仿射變換;


157、cvGetQuadrangleSubPix:仿射變換;


158、cvGetAffineTransform:仿射映射矩陣的計算;


159、cvCloneImage:將整個IplImage結(jié)構(gòu)復制到新的IplImage中;


160、cv2DRotationMatrix:仿射映射矩陣的計算;


161、cvTransform:稀疏仿射變換;


162、cvWarpPerspective:密集透視變換(單應性);


163、cvGetPerspectiveTransform:計算透視映射矩陣;


164、cvPerspectiveTransform:稀疏透視變換;


165、cvCartToPolar:將數(shù)值從笛卡爾空間到極坐標(極性空間)進行映射;


166、cvPolarToCart:將數(shù)值從極性空間到笛卡爾空間進行映射;


167、cvLogPolar:對數(shù)極坐標變換;


168、cvDFT:離散傅里葉變換;


169、cvMulSpectrums:頻譜乘法;


170、cvDCT:離散余弦變換;


171、cvIntegral:計算積分圖像;


172、cvDistTransform:圖像的距離變換;


173、cvEqualizeHist:直方圖均衡化;


174、cvCreateHist:創(chuàng)建一新直方圖;


175、cvMakeHistHeaderForArray:根據(jù)已給出的數(shù)據(jù)創(chuàng)建直方圖;


176、cvNormalizeHist:歸一化直方圖;


177、cvThreshHist:直方圖閾值函數(shù);


178、cvCalcHist:從圖像中自動計算直方圖;


179、cvCompareHist:用于對比兩個直方圖的相似度;


180、cvCalcEMD2:陸地移動距離(EMD)算法;


181、cvCalcBackProject:反向投影;


182、cvCalcBackProjectPatch:圖塊的方向投影;


183、cvMatchTemplate:模板匹配;


184、cvCreateMemStorage:用于創(chuàng)建一個內(nèi)存存儲器;


185、cvCreateSeq:創(chuàng)建序列;


186、cvSeqInvert:將序列進行逆序操作;


187、cvCvtSeqToArray:復制序列的全部或部分到一個連續(xù)內(nèi)存數(shù)組中;


188、cvFindContours:從二值圖像中尋找輪廓;


189、cvDrawContours:繪制輪廓;


190、cvApproxPoly:使用多邊形逼近一個輪廓;


191、cvContourPerimeter:輪廓長度;


192、cvContoursMoments:計算輪廓矩;


193、cvMoments:計算Hu不變矩;


194、cvMatchShapes:使用矩進行匹配;


195、cvInitLineIterator:對任意直線上的像素進行采樣;


196、cvSampleLine:對直線采樣;


197、cvAbsDiff:幀差;


198、cvWatershed:分水嶺算法;


199、cvInpaint:修補圖像;


200、cvGoodFeaturesToTrack:尋找角點;


201、cvFindCornerSubPix:用于發(fā)現(xiàn)亞像素精度的角點位置;


202、cvCalcOpticalFlowLK:實現(xiàn)非金字塔的Lucas-Kanade稠密光流算法;


203、cvMeanShift:mean-shift跟蹤算法;


204、cvCamShift:camshift跟蹤算法;


205、cvCreateKalman:創(chuàng)建Kalman濾波器;


206、cvCreateConDensation:創(chuàng)建condensation濾波器;


207、cvConvertPointsHomogenious:對齊次坐標進行轉(zhuǎn)換;


208、cvFindChessboardCorners:定位棋盤角點;


209、cvFindHomography:計算單應性矩陣;


210、cvRodrigues2:羅德里格斯變換;


211、cvFitLine:直線擬合算法;


212、cvCalcCovarMatrix:計算協(xié)方差矩陣;


213、cvInvert:計算協(xié)方差矩陣的逆矩陣;


214、cvMahalanobis:計算Mahalanobis距離;


215、cvKMeans2:K均值;


216、cvCloneMat:根據(jù)一個已有的矩陣創(chuàng)建一個新矩陣;


217、cvPreCornerDetect:計算用于角點檢測的特征圖;


218、cvGetImage:CvMat圖像數(shù)據(jù)格式轉(zhuǎn)換成IplImage圖像數(shù)據(jù)格式;


219、cvMatMul:兩矩陣相乘;
========

總結(jié)

以上是生活随笔為你收集整理的opencv图像识别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。