opencv图像识别
生活随笔
收集整理的這篇文章主要介紹了
opencv图像识别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用OpenCV檢測圖像中的長方形畫布或紙張并提取圖像內容
?
問題如下:
也就是在一張照片里,已知有個長方形的物體,但是經過了透視投影,已經不再是規則的長方形,那么如何提取這個圖形里的內容呢?這是個很常見的場景,比如在博物館里看到一幅很喜歡的畫,用手機找了下來,可是回家一看歪歪斜斜,腦補原畫內容又覺得不對,那么就需要算法輔助來從原圖里提取原來的內容了。不妨把應用的場景分為以下:
紙張四角的坐標(圖中紅點)已知的情況
也就是上面的左圖中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
?
假設原圖已經用OpenCV讀取到一個叫image的變量里,那么提取紙張圖案的代碼如下:
1 M = cv2.getPerspectiveTransform(corners, canvas)
2 result = cv2.warpPerspective(image, M, (0, 0))
把左圖剪裁出來,去掉紅點后試了試,結果如下:
當然,其實這一步用Photoshop就可以了。。
紙張四角的坐標未知或難以準確標注的情況
這種場景可能是小屏幕應用,或是原始圖像就很小,比如我這里用的這個300x400例子,點坐標很難精確標注。這種情況下一個思路是,用邊緣檢測提取紙張四邊,然后求出四角坐標,再做Perspective Transform。
?
1) 圖像預處理
一般而言即使做普通的邊緣檢測也需要提前對圖像進行降噪避免誤測,比如最常見的辦法是先對圖像進行高斯濾波,然而這樣也會導致圖像變得模糊,當待檢測圖形邊緣不明顯,或是圖像本身分辨率不高的情況下(比如本文用的例子),會在降噪的同時把待檢測的邊緣強度也給犧牲了。具體到本文的例子,紙張是白色,背景是淺黃帶紋路,如果進行高斯濾波是顯然不行的,這時候一個替代方案是可以考慮使用Mean Shift,Mean Shift的優點就在于如果是像背景桌面的淺色紋理,圖像分割的過程中相當于將這些小的浮動過濾掉,并且保留相對明顯的紙張邊緣,結果如下:
原圖
處理后
Meanshift的代碼:
1 image = cv2.pyrMeanShiftFiltering(image, 25, 10)
因為主要目的是預處理降噪,windows size和color distance都不用太大,避免浪費計算時間還有過度降噪。降噪后可以看到桌面上的紋理都被抹去了,紙張邊緣附近干凈了很多。然而這還遠遠不夠,圖案本身,和圖像里的其他物體都有很多明顯的邊緣,而且都是直線邊緣。
2) 紙張邊緣檢測
雖然降噪了,可是圖像里還是有很多邊緣明顯的元素。怎么盡量只保留紙張的邊緣呢,這時候可以考慮用分割算法,把圖像分為紙張部分和其他部分,這樣分割的mask邊緣就和紙張邊緣應該是差不多重合的。在這里可以考慮用GrabCut,這樣對于簡單的情況,比如紙張或畫布和背景對比強烈的,直接把圖像邊緣的像素作為bounding box就可以實現自動分割。當自動分割不精確的情況下再引入手動輔助分割,具體到我這里用的例子,背景和畫面接近,所以需要手動輔助:
結果如下:
可以看到,分割后的結果雖然能基本區分紙張形狀了,可是邊緣并不準確,另外鍵盤和部分桌面沒能區分開來。這時可以繼續用GrabCut+手動標注得到只有紙張的分割?;蛘邽榱擞脩粲押玫脑?#xff0c;盡量少引入手動輔助,那么可以考慮先繼續到下一步檢測邊緣,再做后期處理。假設我們考慮后者,那么我們得到的是如下的mask:
這個mask并不精確,所以不能直接用于邊緣檢測,但是它大致標出了圖片里最明顯的邊緣位置所在,所以可以考慮下面的思路:保留降噪后位于mask邊緣附近的信息用于真正的邊緣檢測,而把其他部分都模糊處理,也就是說基于上面得到的mask做出下面的mask用于模糊處理:
基于這個mask得到的用于邊緣檢測的圖像如下:
用canny算子檢測出邊緣如下:
3) 直線檢測
對檢測到的邊緣使用Hough變換檢測直線,我例子里用的是cv2.HoughLinesP,分辨率1像素和1°,可以根據圖像大小設置檢測的閾值和minLineLength去除大部分誤檢測。特別提一下的是如果使用OpenCV的Python binding,OpenCV 2和OpenCV 3的結果結構是不一樣的,如果進行代碼移植需要相應的修改。檢測到的結果如下:
可以看到,有些線幾乎重合在一起了,這是難以避免的,上圖中一共檢測到9條線,其中兩對(下、右邊緣)重合??梢酝ㄟ^距離判斷和直線相對角度來判斷并把重合線段合為一條:
剩下的都是沒有重合的線了。
4) 判斷紙張邊緣
那么如何選取紙張邊緣的四條線呢(即使圖像分割步驟非常好得分開了紙張和其他部分,這在有些情況下還是難以避免的,比如圖案里有和邊緣平行的線條),可以沿著提取線段的兩邊采樣像素的灰度:
在線段的兩個端點之間平均采樣左右兩邊像素的值,因為一般來說如果是紙張或者畫布,邊緣和背景的顏色在四邊上應該都是類似的。然而這樣做的話引入另外一個問題是需要區分線段的“左”和“右”,對于線段本身而言就是要區分前后。所以需要對畫面里所有的線段端點進行排序,而這個排序的基準就是相對畫布。
具體到本文的例子就是把圖像中心定義為所有線段的“左”邊,如上圖。而決定線段端點“前”和“后”可以用如下辦法:
先假設線段的前后端點,將兩個端點坐標分別減去中心點(紅點)的坐標,然后將得到的兩個向量a和b求叉積,如果叉積大于0則說明假設正確,如果<0則交換假設的前后端點。線段端點的順序確定后就可以進行采樣了,簡單起見可以分別采樣左右兩側的像素灰度值,如果希望更準確可以采樣RGB通道的值進行綜合比較,下面是7條線段對應的兩側像素灰度的中值分布:
可以看到其中有4個點距離非常近(紅色),說明他們的像素灰度分布也很接近,把這4條選出來,結果如下:
正是要的結果。
5) 計算四角的坐標
接下來計算四條線的交點,方法點這里。因為有4條線,會得到6個結果,因為在這種應用場景中,方形的物體在透視變換下不會出現凹角,所以直接舍棄離紙張中心最遠的兩個交點就得到了四個角的坐標,結果如下:
這樣就回到了一開始四角坐標已經得到的情況,直接進行透視變換就行了。
Camera Calibration?
寫了這么多,其實有一條至關重要的假設,甚至可以說是最關鍵的步驟之一我一直沒提,那就是Camera Calibration,如果有相機的情況下,meta data都知道,那么需要先坐Camera Calibration才能知道紙張或者畫布的原始尺寸。我這里試的例子當然是沒有的,也可以有,相應的算法OpenCV里也有現成的,不過即便如此還是非常麻煩,所以我的所有流程都是默認原始尺寸已經獲得了。再說了,就算沒有,變換回方形之后使用者憑感覺進行簡單軸縮放都比Camera Calibration方便得多。。
========
用 Python 和 OpenCV 檢測圖片上的條形碼
?
這篇博文的目的是應用計算機視覺和圖像處理技術,展示一個條形碼檢測的基本實現。我所實現的算法本質上基于StackOverflow 上的這個問題,瀏覽代碼之后,我提供了一些對原始算法的更新和改進。
首先需要留意的是,這個算法并不是對所有條形碼有效,但會給你基本的關于應用什么類型的技術的直覺。
假設我們要檢測下圖中的條形碼:
圖1:包含條形碼的示例圖片
現在讓我們開始寫點代碼,新建一個文件,命名為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做數值計算,argparse用來解析命令行參數,cv2是OpenCV的綁定。
然后我們設置命令行參數,我們這里需要一個簡單的選擇,–image是指包含條形碼的待檢測圖像文件的路徑。
現在開始真正的圖像處理:
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行:從磁盤載入圖像并轉換為灰度圖。
17~18行:使用Scharr操作(指定使用ksize = -1)構造灰度圖在水平和豎直方向上的梯度幅值表示。
21~22行:Scharr操作之后,我們從x-gradient中減去y-gradient,通過這一步減法操作,最終得到包含高水平梯度和低豎直梯度的圖像區域。
上面的gradient表示的原始圖像看起來是這樣的:
圖:2:條形碼圖像的梯度表示
注意條形碼區域是怎樣通過梯度操作檢測出來的。下一步將通過去噪僅關注條形碼區域。
?
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的內核對梯度圖進行平均模糊,這將有助于平滑梯度表征的圖形中的高頻噪聲。
26行:然后我們將模糊化后的圖形進行二值化,梯度圖中任何小于等于255的像素設為0(黑色),其余設為255(白色)。
模糊并二值化后的輸出看起來是這個樣子:
圖3:二值化梯度圖以此獲得長方形條形碼區域的粗略近似
然而,如你所見,在上面的二值化圖像中,條形碼的豎杠之間存在縫隙,為了消除這些縫隙,并使我們的算法更容易檢測到條形碼中的“斑點”狀區域,我們需要進行一些基本的形態學操作:
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構造一個長方形內核。這個內核的寬度大于長度,因此我們可以消除條形碼中垂直條之間的縫隙。
30行:這里進行形態學操作,將上一步得到的內核應用到我們的二值圖中,以此來消除豎杠間的縫隙。
現在,你可以看到這些縫隙相比上面的二值化圖像基本已經消除:
圖4:使用形態學中的閉運算消除條形碼豎條之間的縫隙
當然,現在圖像中還有一些小斑點,不屬于真正條形碼的一部分,但是可能影響我們的輪廓檢測。
讓我們來消除這些小斑點:
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)。腐蝕操作將會腐蝕圖像中白色像素,以此來消除小斑點,而膨脹操作將使剩余的白色像素擴張并重新增長回去。
如果小斑點在腐蝕操作中被移除,那么在膨脹操作中就不會再出現。
經過我們這一系列的腐蝕和膨脹操作,可以看到我們已經成功地移除小斑點并得到條形碼區域。
圖5:應用一系列的腐蝕和膨脹來移除不相關的小斑點
最后,讓我們找到圖像中條形碼的輪廓:
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行:幸運的是這一部分比較容易,我們簡單地找到圖像中的最大輪廓,如果我們正確完成了圖像處理步驟,這里應該對應于條形碼區域。
43~44行:然后我們為最大輪廓確定最小邊框
48~50行:最后顯示檢測到的條形碼
正如你在下面的圖片中所見,我們已經成功檢測到了條形碼:
圖6:成功檢測到示例圖像中的條形碼
下一部分,我們將嘗試更多圖像。
成功的條形碼檢測
要跟隨這些結果,請使用文章下面的表單去下載本文的源碼以及隨帶的圖片。
一旦有了代碼和圖像,打開一個終端來執行下面的命令:
$ python detect_barcode.py --image images/barcode_02.jpg
圖7:使用OpenCV檢測圖像中的一個條形碼
檢測椰油瓶子上的條形碼沒有問題。
讓我們試下另外一張圖片:
$ python detect_barcode.py --image images/barcode_03.jpg
圖8:使用計算機視覺檢測圖像中的一個條形碼
我們同樣能夠在上面的圖片中找到條形碼。
關于食品的條形碼檢測已經足夠了,書本上的條形碼怎么樣呢:
$ 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很容易檢測條形碼
我們的算法又一次檢測到條形碼!
總結
這篇博文中,我們回顧了使用計算機視覺技術檢測圖像中條形碼的必要步驟,使用Python編程語言和OpenCV庫實現了我們的算法。
算法概要如下:
計算x方向和y方向上的Scharr梯度幅值表示
將x-gradient減去y-gradient來顯示條形碼區域
模糊并二值化圖像
對二值化圖像應用閉運算內核
進行系列的腐蝕、膨脹
找到圖像中的最大輪廓,大概便是條形碼
需要注意的是,該方法做了關于圖像梯度表示的假設,因此只對水平條形碼有效。
如果你想實現一個更加魯棒的條形碼檢測算法,你需要考慮圖像的方向,或者更好的,應用機器學習技術如Haar級聯或者HOG + Linear SVM去掃描圖像條形碼區域。
========
數字萬用表(七段數碼管)的圖像識別(opencv實現)
版權聲明:歡迎轉載,但請保留文章原始出處:)http://blog.csdn.net/xgbing
? ? ? ? 最近接觸圖像處理,要實現數字萬用表數據的自動讀取。我使用opencv+VC2005環境開發,OpenCV是Intel 開源計算機視覺庫,它提供了強大的圖像處理函數庫。Opencv的介紹在這里太不多說,可以看看百度百科了解一下:http://baike.baidu.com/view/1343775.htm。
? ? ? ? 萬用表的識別過程是先提取攝像頭的一幀數據,然后對這幅圖像做處理:
(1)提取攝像頭的一幀數據
[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片
//讀取攝像頭一幀數據 ?
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參數進一步細化 ?
? ? 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參數進一步細化 ?
cvCopy(img3_2, img4); ?
cvReleaseImage(&img3_2); ?
(10)查找輪廓,進行數字分割
[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)消除雜點并進行數字的識別
========
opencv 幾種圖像識別方法的速度和準確率比較
最近需要使用 opencv 做一個項目,比較了幾種算法,貌似都不能滿足我的需求,下面看一下試驗結果。git 地址 https://github.com/fredjiang/yutianDetect.git
接著上一篇博客 http://fred.easymorse.com/?p=1358,這里比較一下幾種不同算法的優缺點
Screen Shot 2013 04 30 at 3 47 18 PM
如上圖,我這里組合使用了不同的 featureDetector、descriptorExtractor、matcher,分別對速度和準確率做了比較。
輸入框中的數字對應上圖中的 -detectImage_x,右上角的數字是時間(毫秒),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
根據以上結果,我想在 1 秒以內正確識別不同的圖像,要么是速度不夠,要么是準確率不夠。
看來只能看看還有不有其它的算法了,或者使用 haartraining 了。
再補充一個
Screen Shot 2013 04 30 at 5 02 06 PM
-detectImage_4(時間3544,又快了 200 毫秒左右)
========
圖像處理和圖像識別中常用的OpenCV函數 ?
1、cvLoadImage:將圖像文件加載至內存;
2、cvNamedWindow:在屏幕上創建一個窗口;
3、cvShowImage:在一個已創建好的窗口中顯示圖像;
4、cvWaitKey:使程序暫停,等待用戶觸發一個按鍵操作;
5、cvReleaseImage:釋放圖像文件所分配的內存;
6、cvDestroyWindow:銷毀顯示圖像文件的窗口;
7、cvCreateFileCapture:通過參數設置確定要讀入的AVI文件;
8、cvQueryFrame:用來將下一幀視頻文件載入內存;
9、cvReleaseCapture:釋放CvCapture結構開辟的內存空間;
10、cvCreateTrackbar:創建一個滾動條;
?
11、cvSetCaptureProperty:設置CvCapture對象的各種屬性;
12、cvGetCaptureProperty:查詢CvCapture對象的各種屬性;
13、cvGetSize:當前圖像結構的大小;
14、cvSmooth:對圖像進行平滑處理;
15、cvPyrDown:圖像金字塔,降采樣,圖像縮小為原來四分之一;
16、cvCanny:Canny邊緣檢測;
17、cvCreateCameraCapture:從攝像設備中讀入數據;
18、cvCreateVideoWriter:創建一個寫入設備以便逐幀將視頻流寫入視頻文件;
19、cvWriteFrame:逐幀將視頻流寫入文件;
20、cvReleaseVideoWriter:釋放CvVideoWriter結構開辟的內存空間;
?
21、CV_MAT_ELEM:從矩陣中得到一個元素;
22、cvAbs:計算數組中所有元素的絕對值;
23、cvAbsDiff:計算兩個數組差值的絕對值;
24、cvAbsDiffS:計算數組和標量差值的絕對值;
25、cvAdd:兩個數組的元素級的加運算;
26、cvAddS:一個數組和一個標量的元素級的相加運算;
27、cvAddWeighted:兩個數組的元素級的加權相加運算(alpha運算);
28、cvAvg:計算數組中所有元素的平均值;
29、cvAvgSdv:計算數組中所有元素的絕對值和標準差;
30、cvCalcCovarMatrix:計算一組n維空間向量的協方差;
?
31、cvCmp:對兩個數組中的所有元素運用設置的比較操作;
32、cvCmpS:對數組和標量運用設置的比較操作;
33、cvConvertScale:用可選的縮放值轉換數組元素類型;
34、cvCopy:把數組中的值復制到另一個數組中;
35、cvCountNonZero:計算數組中非0值的個數;
36、cvCrossProduct:計算兩個三維向量的向量積(叉積);
37、cvCvtColor:將數組的通道從一個顏色空間轉換另外一個顏色空間;
38、cvDet:計算方陣的行列式;
39、cvDiv:用另外一個數組對一個數組進行元素級的除法運算;
40、cvDotProduct:計算兩個向量的點積;
?
41、cvEigenVV:計算方陣的特征值和特征向量;
42、cvFlip:圍繞選定軸翻轉;
43、cvGEMM:矩陣乘法;
44、cvGetCol:從一個數組的列中復制元素;
45、cvGetCols:從數據的相鄰的多列中復制元素;
46、cvGetDiag:復制數組中對角線上的所有元素;
47、cvGetDims:返回數組的維數;
48、cvGetDimSize:返回一個數組的所有維的大小;
49、cvGetRow:從一個數組的行中復制元素值;
50、cvGetRows:從一個數組的多個相鄰的行中復制元素值;
?
51、cvGetSize:得到二維的數組的尺寸,以CvSize返回;
52、cvGetSubRect:從一個數組的子區域復制元素值;
53、cvInRange:檢查一個數組的元素是否在另外兩個數組中的值的范圍內;
54、cvInRangeS:檢查一個數組的元素的值是否在另外兩個標量的范圍內;
55、cvInvert:求矩陣的逆;
56、cvMahalonobis:計算兩個向量間的馬氏距離;
57、cvMax:在兩個數組中進行元素級的取最大值操作;
58、cvMaxS:在一個數組和一個標量中進行元素級的取最大值操作;
59、cvMerge:把幾個單通道圖像合并為一個多通道圖像;
60、cvMin:在兩個數組中進行元素級的取最小值操作;
?
61、cvMinS:在一個數組和一個標量中進行元素級的取最小值操作;
62、cvMinMaxLoc:尋找數組中的最大最小值;
63、cvMul:計算兩個數組的元素級的乘積(點乘);
64、cvNot:按位對數組中的每一個元素求反;
65、cvNormalize:將數組中元素進行歸一化;
66、cvOr:對兩個數組進行按位或操作;
67、cvOrs:在數組與標量之間進行按位或操作;
68、cvReduce:通過給定的操作符將二維數組簡為向量;
69、cvRepeat:以平鋪的方式進行數組復制;
70、cvSet:用給定值初始化數組;
?
71、cvSetZero:將數組中所有元素初始化為0;
72、cvSetIdentity:將數組中對角線上的元素設為1,其他置0;
73、cvSolve:求出線性方程組的解;
74、cvSplit:將多通道數組分割成多個單通道數組;
75、cvSub:兩個數組元素級的相減;
76、cvSubS:元素級的從數組中減去標量;
77、cvSubRS:元素級的從標量中減去數組;
78、cvSum:對數組中的所有元素求和;
79、cvSVD:二維矩陣的奇異值分解;
80、cvSVBkSb:奇異值回代計算;
?
81、cvTrace:計算矩陣跡;
82、cvTranspose:矩陣的轉置運算;
83、cvXor:對兩個數組進行按位異或操作;
84、cvXorS:在數組和標量之間進行按位異或操作;
85、cvZero:將所有數組中的元素置為0;
86、cvConvertScaleAbs:計算可選的縮放值的絕對值之后再轉換數組元素的類型;
87、cvNorm:計算數組的絕對范數, 絕對差分范數或者相對差分范數;
88、cvAnd:對兩個數組進行按位與操作;
89、cvAndS:在數組和標量之間進行按位與操作;?
90、cvScale:是cvConvertScale的一個宏,可以用來重新調整數組的內容,并且可以將參數從一種數
? ? ? ? ? ? ? ? ? 據類型轉換為另一種;
?
91、cvT:是函數cvTranspose的縮寫;
92、cvLine:畫直線;
93、cvRectangle:畫矩形;
94、cvCircle:畫圓;
95、cvEllipse:畫橢圓;
96、cvEllipseBox:使用外接矩形描述橢圓;
97、cvFillPoly、cvFillConvexPoly、cvPolyLine:畫多邊形;
98、cvPutText:在圖像上輸出一些文本;
99、cvInitFont:采用一組參數配置一些用于屏幕輸出的基本個特定字體;
100、cvSave:矩陣保存;
?
101、cvLoad:矩陣讀取;
102、cvOpenFileStorage:為讀/寫打開存儲文件;
103、cvReleaseFileStorage:釋放存儲的數據;
104、cvStartWriteStruct:開始寫入新的數據結構;
105、cvEndWriteStruct:結束寫入數據結構;
106、cvWriteInt:寫入整數型;
107、cvWriteReal:寫入浮點型;
108、cvWriteString:寫入字符型;
109、cvWriteComment:寫一個XML或YAML的注釋字串;
110、cvWrite:寫一個對象;
?
111、cvWriteRawData:寫入多個數值;
112、cvWriteFileNode:將文件節點寫入另一個文件存儲器;
113、cvGetRootFileNode:獲取存儲器最頂層的節點;
114、cvGetFileNodeByName:在映圖或存儲器中找到相應節點;
115、cvGetHashedKey:為名稱返回一個惟一的指針;
116、cvGetFileNode:在映圖或文件存儲器中找到節點;
117、cvGetFileNodeName:返回文件的節點名;
118、cvReadInt:讀取一個無名稱的整數型;
119、cvReadIntByName:讀取一個有名稱的整數型;
120、cvReadReal:讀取一個無名稱的浮點型;
?
121、cvReadRealByName:讀取一個有名稱的浮點型;
122、cvReadString:從文件節點中尋找字符串;
123、cvReadStringByName:找到一個有名稱的文件節點并返回它;
124、cvRead:將對象解碼并返回它的指針;
125、cvReadByName:找到對象并解碼;
126、cvReadRawData:讀取多個數值;
127、cvStartReadRawData:初始化文件節點序列的讀取;
128、cvReadRawDataSlice:讀取文件節點的內容;
129、cvGetModuleInfo:檢查IPP庫是否已經正常安裝并且檢驗運行是否正常;
130、cvResizeWindow:用來調整窗口的大小;
?
131、cvSaveImage:保存圖像;
132、cvMoveWindow:將窗口移動到其左上角為x,y的位置;
133、cvDestroyAllWindow:用來關閉所有窗口并釋放窗口相關的內存空間;
134、cvGetTrackbarPos:讀取滑動條的值;
135、cvSetTrackbarPos:設置滑動條的值;
136、cvGrabFrame:用于快速將視頻幀讀入內存;
137、cvRetrieveFrame:對讀入幀做所有必須的處理;
138、cvConvertImage:用于在常用的不同圖像格式之間轉換;
139、cvErode:形態腐蝕;
140、cvDilate:形態學膨脹;
?
141、cvMorphologyEx:更通用的形態學函數;
142、cvFloodFill:漫水填充算法,用來進一步控制哪些區域將被填充顏色;
143、cvResize:放大或縮小圖像;
144、cvPyrUp:圖像金字塔,將現有的圖像在每個維度上都放大兩倍;
145、cvPyrSegmentation:利用金字塔實現圖像分割;
146、cvThreshold:圖像閾值化;
147、cvAcc:可以將8位整數類型圖像累加為浮點圖像;
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結構復制到新的IplImage中;
160、cv2DRotationMatrix:仿射映射矩陣的計算;
161、cvTransform:稀疏仿射變換;
162、cvWarpPerspective:密集透視變換(單應性);
163、cvGetPerspectiveTransform:計算透視映射矩陣;
164、cvPerspectiveTransform:稀疏透視變換;
165、cvCartToPolar:將數值從笛卡爾空間到極坐標(極性空間)進行映射;
166、cvPolarToCart:將數值從極性空間到笛卡爾空間進行映射;
167、cvLogPolar:對數極坐標變換;
168、cvDFT:離散傅里葉變換;
169、cvMulSpectrums:頻譜乘法;
170、cvDCT:離散余弦變換;
171、cvIntegral:計算積分圖像;
172、cvDistTransform:圖像的距離變換;
173、cvEqualizeHist:直方圖均衡化;
174、cvCreateHist:創建一新直方圖;
175、cvMakeHistHeaderForArray:根據已給出的數據創建直方圖;
176、cvNormalizeHist:歸一化直方圖;
177、cvThreshHist:直方圖閾值函數;
178、cvCalcHist:從圖像中自動計算直方圖;
179、cvCompareHist:用于對比兩個直方圖的相似度;
180、cvCalcEMD2:陸地移動距離(EMD)算法;
181、cvCalcBackProject:反向投影;
182、cvCalcBackProjectPatch:圖塊的方向投影;
183、cvMatchTemplate:模板匹配;
184、cvCreateMemStorage:用于創建一個內存存儲器;
185、cvCreateSeq:創建序列;
186、cvSeqInvert:將序列進行逆序操作;
187、cvCvtSeqToArray:復制序列的全部或部分到一個連續內存數組中;
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:用于發現亞像素精度的角點位置;
202、cvCalcOpticalFlowLK:實現非金字塔的Lucas-Kanade稠密光流算法;
203、cvMeanShift:mean-shift跟蹤算法;
204、cvCamShift:camshift跟蹤算法;
205、cvCreateKalman:創建Kalman濾波器;
206、cvCreateConDensation:創建condensation濾波器;
207、cvConvertPointsHomogenious:對齊次坐標進行轉換;
208、cvFindChessboardCorners:定位棋盤角點;
209、cvFindHomography:計算單應性矩陣;
210、cvRodrigues2:羅德里格斯變換;
211、cvFitLine:直線擬合算法;
212、cvCalcCovarMatrix:計算協方差矩陣;
213、cvInvert:計算協方差矩陣的逆矩陣;
214、cvMahalanobis:計算Mahalanobis距離;
215、cvKMeans2:K均值;
216、cvCloneMat:根據一個已有的矩陣創建一個新矩陣;
217、cvPreCornerDetect:計算用于角點檢測的特征圖;
218、cvGetImage:CvMat圖像數據格式轉換成IplImage圖像數據格式;
219、cvMatMul:兩矩陣相乘;
========
總結
以上是生活随笔為你收集整理的opencv图像识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript语句模版
- 下一篇: .Net Telerik Web UI