OpenCV专栏
文章平均质量分 78
OpenCV用法
黑不溜秋的
GPU全栈博主-程序哥。
展开
-
OpenCV Tutorial 配置Android上的OpenCV开发环境
一: 开发Android上的OpenCV程序概述 为Android开发OpenCV程序, 有两种方式, 第一种用java形式的OpenCV库, 第二种用C++形式的OpenCV库, 这两种库都在OpenCV官方提供的SDK中。 我们可以从官网下载 http://opencv.org/releases.html。 第一种形式呢, 需要在开发环境中导入 OpenCV原创 2017-07-06 19:30:23 · 817 阅读 · 0 评论 -
OpenCV Tutorial: 分水嶺算法(watershed)
分水嶺算法(watershed)分水嶺算法就是根據分水嶺的構成來考慮圖像的分割,我們可以想像一個有山有湖的景象,山水環繞,而區分高山與水的界線,以及不同湖之間的間隔,就是我們的分水嶺。分水嶺算法基本上是把影像看作是地貌,每一點像素的灰階值表示該點的海拔高度,每一個局部極小值及其影響區域稱為集水盆,我們從第0層填充影像,隨著水逐漸漲高,集水盆形成,這些盆地的尺寸緩緩增加,最終兩個不同的盆转载 2016-10-31 11:25:27 · 690 阅读 · 0 评论 -
OpenCV Tutorial: 區域生長(floodFill)
區域生長(floodFill)區域生長是將像素,或是子區域合併成更大區域的過程,基本上是從一組生長點開始,生長點可以是單個像素,也可以是某個小區域,把和生長點性質相似的相鄰像素或是區域合併,成為一個新的生長點,重複此過程直到不能生長為止,生長點和相鄰區域的相似性判斷,可以依據強度、顏色、紋理等多種影像訊息,OpenCV提供floodFill()函式進行區域生長,用顏色來進行相似性判斷,可選转载 2016-10-31 11:24:37 · 1004 阅读 · 0 评论 -
OpenCV Tutorial: 霍夫找圓(HoughCircles)
霍夫找圓(HoughCircles)我們用和霍夫直線偵測同樣的概念,進行霍夫圓形偵測,圓方程式為(x-a)2 + (y-b)2 = r2,其中(a,b)為圓心座標,r為圓的半徑,用這個三維數據組,讓(a,b)在影像座標內不斷改變位置,找出所有可能的半徑r,最後當這三維數據組的點數,超過我們定的閾值時就判斷為圓。因為傳統的霍夫圓偵測是三維空間上的計數,基於效率上的考量,而且維度變多,转载 2016-10-31 11:17:50 · 7063 阅读 · 0 评论 -
OpenCV Tutorial: 霍夫找線(HoughLines、HoughLinesP)
霍夫找線(HoughLines、HoughLinesP)計算機視覺中經常需要識別或者定位某些幾何圖形,像直線、圓、橢圓等,檢測直線的霍夫變換提供在圖像中尋找直線的一種算法,後來這概念發展到能檢測圓、橢圓等,不僅能夠識別出圖像中想要的圖形,而且能夠得到位置、角度等資訊,這邊解釋霍夫直線偵測的原理。核心思想是把圖像中某個點集映射到另一空間的一個點集上,這個點記錄了點集合的數目,通過搜索峰值转载 2016-10-31 11:01:30 · 8587 阅读 · 0 评论 -
OpenCV Tutorial: 找邊緣(Canny)
找邊緣(Canny)Sobel或Laplace都是基於微分的邊緣檢測算法,只有當雜訊極少,或者先用平滑濾波抑制雜訊後,才能得到理想結果。在邊緣檢測中,抑制雜訊和邊緣精確定位很難同時滿足,當我們通過平滑濾波去除噪音的同時,也增加了邊緣定位的不確定性,而提高邊緣檢算子對邊緣敏感度的同時,也增加了對雜訊的敏感度,這邊介紹Canny邊緣檢測算子,Canny在抗雜訊和精確定位間有不錯的效果,Open转载 2016-10-31 10:58:34 · 1095 阅读 · 0 评论 -
OpenCV Tutorial: 找邊緣(Laplacian)
找邊緣(Laplacian)影像銳化有分一階微分或是二階微分,兩者的核心參數都是基於數學算式推導而成,這邊介紹基於二階微分的拉普拉斯算子,在影像銳化方面有很廣泛的運用,使用時通常對原始圖進行拉普拉斯運後取絕對值得到輸出圖,再將輸出圖和原始圖進行混和相加,得到一個和原始圖類似,但是細節被強調的圖。二階微分定義為:從上面兩式相加,我們可得到:我們以模板表示計算結果,上式的結转载 2016-10-31 10:54:52 · 425 阅读 · 0 评论 -
OpenCV Tutorial: 找邊緣(Sobel、Scharr)
找邊緣(Sobel、Scharr)Sobel是一種獲得影像一階梯度的手法,常見應用於邊緣檢測,有分成水平和垂直方向的模板,就像以下的Gx和Gy模板,Gx用來檢測垂直邊緣,Gy用來檢查水平邊緣,通常會分別對影像進行水平和垂直模板的運算,得到像素的梯度,梯度是一個有距離和方向的二維向量,距離表示變化的幅度,方向表示強度變化最大的方向。在一般的數學計算上,通常使用歐拉距離(也稱為L2距離),转载 2016-10-31 10:50:03 · 756 阅读 · 0 评论 -
OpenCV Tutorial: 區域閾值(adaptiveThreshold)
區域閾值(adaptiveThreshold)有時候由於拍照時光線不均,所以影像每個區域的灰階值基準不同,這時很難找到一個閾值能適用整張影像,然後得到良好的二值化結果,這時我們可以將影像分成幾個區域,每個區域有各自的閾值,再分別將各個區域進行二值化,OpenCV用adaptiveThreshold()函式來進行此作法。OpenCV調整閾值void adaptiveThreshold转载 2016-10-31 10:18:57 · 1195 阅读 · 0 评论 -
OpenCV Tutorial: 自適應閾值(threshold、CV_THRESH_OTSU)
自適應閾值(threshold、CV_THRESH_OTSU)所謂的二值化是將影像進行區分,分成我們感興趣的部分(前景),以及不感興趣的部分(背景),通常將某個強度當作分割的標準,這個強度稱作閾值(threshold),通常以強度超過閾值的像素當作前景,反之則為背景。閾值的算法主要分兩類:固定閾值:程式或使用者直接給定一個灰階值當閾值,再用這個閾值進行二值化。自適應閾值:輸入影像,转载 2016-10-31 10:09:05 · 18489 阅读 · 2 评论 -
OpenCV Tutorial: 影像分割(grabCut)
影像分割(grabCut)OpenCV提供另一個grabCut影像分割演算法,計算方式較watershed更複雜,但結果比較精確,如果想要從靜態影像提取前景物體,像是將一幅影像中的物體剪貼到另一幅圖中,這是最佳算法。提取前景void grabCut(InputArray img, InputOutputArray mask, Rect rect, InputOutputArray转载 2016-10-31 11:26:10 · 1327 阅读 · 0 评论 -
OpenCV Tutorial: 開運算、閉運算(morphologyEx、MORPH_OPEN、MORPH_CLOSE)
開運算、閉運算(morphologyEx、MORPH_OPEN、MORPH_CLOSE)這邊介紹開運算和閉運算,這兩種都是侵蝕和膨脹複合而成,開運算是先侵蝕後膨脹,閉運算是先膨脹後侵蝕。對於集合I和H,假設使用H對I進行開運算,代表H對I進行侵蝕後膨脹,記作:開運算可以使物體輪廓變得光滑,還能使狹窄的連結斷開,以及消除外觀上的毛刺,但在物體大於結構元素的情況下,開運算與侵蝕並不相同转载 2016-10-31 11:28:56 · 9056 阅读 · 0 评论 -
OpenCV Tutorial: 侵蝕、膨脹(erode、dilate)
侵蝕、膨脹(erode、dilate)形態學主要用於二值化後的影像,根據使用者的目的,用來凸顯影像的形狀特徵,像邊界和連通區域等,同時像細化、像素化、修剪毛刺等技術也常用於圖像的預處理和後處理,形態學操作的結果除了影像本身,也和結構元素的形狀有關,結構元素和空間域操作的濾波概念類似,如以下即為一個3×3的結構元素,我們可以自行決定大小和形狀,在實際的使用上,是以奇數的矩形如3×3、5×5、7×转载 2016-10-31 11:30:09 · 34892 阅读 · 3 评论 -
OpenCV Tutorial: Harris 角點
Harris 角點在影像中檢測特徵點時,角點可以做為一個重要的參考,因為角點是兩條邊緣的交點處,可以被精確定位,這和位於相同強度的區域不同,與物體輪廓的點也不同,輪廓點難以在其他影像的相同物體進行精確定位。Harris特徵檢測器是一個經典的角點檢測方法,OpenCV使用cornerHarris()實現Harris角點偵測演算法,輸出結果為浮點數類型的影像,每個像素值為相對位置的角點強度转载 2016-10-31 13:41:32 · 592 阅读 · 0 评论 -
OpenCV Tutorial: 輪廓和點距離(pointPolygonTest、distanceTransform)
輪廓和點距離(pointPolygonTest、distanceTransform)當我們有一個物體的輪廓後,我們可以從OpenCV的pointPolygonTest()函式,得到輸入點和這個輪廓的關係,比如這個點在輪廓的內側、線上或外側,以及和這輪廓的距離。OpenCV輪廓距離double pointPolygonTest(InputArray contour, Point2转载 2016-10-31 11:45:12 · 1682 阅读 · 0 评论 -
OpenCV Tutorial: 特徵(moment、contourArea、arcLength)
特徵(moment、contourArea、arcLength)找出物體輪廓後,我們可以根據這個輪廓,找出這個物體的一些特徵,這邊用OpenCV的moment()、contourArea()、arcLength()函式,來找輪廓的質心、周長、面積,而這些特徵可以作為物件辨識的資訊。OpenCV計算矩Moments moments(InputArray array, bool b转载 2016-10-31 11:41:04 · 1962 阅读 · 0 评论 -
OpenCV Tutorial: 輪廓(findContours、drawContours)
當我們做物件辨識時,透過輪廓可得到特定物件的資訊,協助我們做判斷,OpenCV的findContours()函式可找到影像的輪廓,依實際需求調整參數輸入,而這邊的輪廓和Sobel這些找邊緣的處理不同,Sobel是將物件內部消除,只保留物件邊緣,findContours是在經過Sobel處理之後,將這個只有邊緣的影像,把各個邊緣點做分類,連結的邊緣點儲存在同個容器內,當我們找到輪廓後,可用drawC转载 2016-10-31 11:39:39 · 1383 阅读 · 0 评论 -
OpenCV Tutorial: 凸殼(convexHull)
凸殼(convexHull)凸殼(Convex Hull)是一個計算幾何中的概念,簡單的說,在給定二維平面上的點集合,凸殼就是將最外層的點連接起來的凸多邊型,它能包含點集合中的所有點,在影像處理中,通常是找到某個物件後,用來填補空隙,或者是進一步的進行物件辨識。OpenCV凸殼void convexHull(InputArray points, OutputArray hull,转载 2016-10-31 11:38:14 · 813 阅读 · 0 评论 -
OpenCV Tutorial: 固定閾值(threshold)
固定閾值(threshold)所謂的二值化是將影像進行區分,分成我們感興趣的部分(前景),以及不感興趣的部分(背景),通常將某個強度當作分割的標準,這個強度稱作閾值(threshold),通常以強度超過閾值的像素當作前景,反之則為背景。閾值的算法主要分兩類:固定閾值:程式或使用者直接給定一個灰階值當閾值,再用這個閾值進行二值化。自適應閾值:輸入影像,程式依這影像計算出較合適的閾值,转载 2016-10-31 10:05:08 · 858 阅读 · 0 评论 -
OpenCV Tutorial: 直方圖等化(equalizeHist)
直方圖等化(equalizeHist)我們可透過拉伸直方圖,使直方圖覆蓋所有強度範圍,這種方法的確能提高影像對比度,但是在多數情況,影像模糊不是因為過窄的強度範圍,而是某區間的像素強度比例過高,這時可以製作一個映射表,使得調整之後的影像,能平均使用所有的強度,進而增加影像的整體對比度。這就是直方圖等化的概念,以一個8位元強度範圍0~255的影像來說,意味著調整之後的影像,50%的像素強度低转载 2016-10-31 08:34:13 · 1502 阅读 · 0 评论 -
OpenCV Tutorial: 卷積邊界處理(copyMakeBorder)
卷積邊界處理(copyMakeBorder)進行卷積處理影像時,在影像的邊界,核心沒有足夠元素納入計算,OpenCV裡用copyMakeBorder()函式將原圖稍微放大,再開始進行卷積,OpenCV在空間濾波的相關函式內部已包含copyMakeBorder()了,所以實際上使用空間濾波時,不需要呼叫copyMakeBorder()。在OpenCV裡進行卷積時,處理邊界問題通常分以下3個步驟:先將原转载 2016-10-28 14:41:29 · 730 阅读 · 0 评论 -
OpenCV Tutorial: 線性內插(Interpolation)
線性內插(Interpolation)當我們圖像進行幾何轉換時,假使輸出像素映射的地方,不是輸入圖像某個整數像素位置,這時要用整數座標的灰度值進行推斷,這就是插值,這邊介紹幾種插值方式,通常較好的結果也導致較大的計算量。最近插值法(Nearest Neighbor Interpolation):這是一種最簡單的插值算法,輸出像素的值為輸入圖像離映射點最近的像素值,如下圖假使(x0,y0)為映射點,則转载 2016-10-28 14:26:45 · 1921 阅读 · 0 评论 -
OpenCV Tutorial: 縮寫(uchar、ushort、Vec)
縮寫(uchar、ushort、Vec)這邊介紹OpenCV常見的三種縮寫,分別是uchar、ushort、Vec。typedef unsigned char uchartypedef unsigned short ushortOpenCV使用Vec簡化vector,數字表示這個vector有幾個元素,英文字母表示元素的資料結構,通常用於影像像素。以最常見的8位元無負號3通道圖來說,我們可用Ve转载 2016-10-28 14:22:42 · 1967 阅读 · 0 评论 -
OpenCV Tutorial: OpenCV基本結構(Point、Size、Rect等)
OpenCV基本結構(Point、Size、Rect等)OpenCV有定義一些基本結構,像Point、Point2f、Size、Size2f、Rect、RotatedRect、Scalar等,方便我們進行影像處理,這些結構通常都當參數輸入,或是函式內部計算之用。Point:2維整數點類別,通常用於影像的座標點,成員有x和y,要是輸入浮點數的話,則四捨五入取整數,以下為建構式和最基本的兩種賦值方法:P转载 2016-10-28 11:56:37 · 2519 阅读 · 0 评论 -
OpenCV Tutorial: 影像格式(Mat)
影像格式(Mat)Mat是OpenCV訂定的資料型態,代表的是矩陣(Matrix)前三個字母,影像其實也可以看成是某個二維陣列,所以在OpenCV 2.0裡,不論矩陣計算,或是影像處裡的格式,都是以Mat類別進行處理,並有相關的成員變數和函式方便使用,使用時不用考慮記憶體管理,這也是OpenCV 1.0和2.0不同之處,這邊介紹常用的Mat類別成員和成員函式,包括如何得到影像資訊、創建影像、複製影像转载 2016-10-28 11:50:42 · 2502 阅读 · 0 评论 -
OpenCV Tutorial: OpenCV介紹
OpenCV全名是Open Source Computer Vision Library,是一個影像處理函式庫,由Intel發起並參與開發,以BSD授權條款發行,可在商業和研究領域中免費使用,目前是非營利的基金組織OpenCV.org在維護,關於授權可參考:幾種開源授權介紹。OpenCV 1.0版於2006年釋出,以C語言作為開發主體,當使用OpenCV函式庫時,程式設計師要自行注意記憶體管理,因此转载 2016-10-28 11:47:06 · 909 阅读 · 0 评论 -
OpenCV Tutorial: 影像讀取儲存(imread、imshow、imwrite)
影像讀取儲存(imread、imshow、imwrite)這邊示範一個簡短的OpenCV的程式,用imread()讀取圖片,並將資料寫入Mat,imwrite()將Mat儲存在硬碟中,imshow()將Mat展示在螢幕上。內文索引 [隱藏]1 標頭檔2 命名空間3 影像讀取4 創建視窗5 秀出影像6 等待按鍵輸入7 圖片儲存8 程式範例19 程式範例2標頭檔當我們使转载 2016-10-28 15:02:21 · 3604 阅读 · 0 评论 -
OpenCV Tutorial: 影像相加(add、addWeighted)
影像相加(add、addWeighted)影像可以用不同的方式組合,就像是矩陣運算,各個相對像素做加減乘除,這邊介紹如何使用addWeighted()和add()函式,將輸入影像進行混和,addWeighted()和add()只能處理相同大小的輸入圖,這邊另外介紹如何合併大小不同的影像,類似把一個小Logo加到原本影像上。OpenCV影像相加:void add(InputArray src转载 2016-10-28 15:30:37 · 1636 阅读 · 0 评论 -
OpenCV Tutorial: 像素巡訪(at、ptr)
像素巡訪(at、ptr) 當我們進行影像處理時,可能有操作是要查訪所有像素,比如說我們想要改變一張影像的灰階值,讓所有的像素值加20,這時我們就需掃過影像所有的像素,這邊介紹OpenCV的at()和ptr()函式以及迭代器,來查訪Mat所有像素。at()可用來讀取和修改某個像素值,通常用來對隨機位置的像素進行讀寫,就效率考量,並不適合用在循序查訪影像所有像素,以下用at()來讀取img的所有像素,转载 2016-10-28 15:58:55 · 2729 阅读 · 1 评论 -
OpenCV Tutorial: 直方圖(calcHist)
直方圖(calcHist)直方圖是一個影像像素的統計表,橫軸為影像中所有可能的像素值,假使為8位元圖,範圍即為0到255,縱軸為此橫軸強度的像素個數,直方圖可以被歸一化,歸一化後所有項和為一,在這種情況下,縱軸值表示此強度的像素佔影像的比例。直方圖是影像的一個重要特性,我們可以從這看出強度分布狀況,像是否太暗或過曝,或者分布太過集中,進而評估影像的品質。在影像檢索時,直方圖可以當成是一转载 2016-10-29 11:57:04 · 881 阅读 · 0 评论 -
OpenCV Tutorial: 找邊緣(Laplacian)
找邊緣(Laplacian)影像銳化有分一階微分或是二階微分,兩者的核心參數都是基於數學算式推導而成,這邊介紹基於二階微分的拉普拉斯算子,在影像銳化方面有很廣泛的運用,使用時通常對原始圖進行拉普拉斯運後取絕對值得到輸出圖,再將輸出圖和原始圖進行混和相加,得到一個和原始圖類似,但是細節被強調的圖。二階微分定義為:從上面兩式相加,我們可得到:我們以模板表示計算結果,上式的結转载 2016-10-29 11:47:03 · 743 阅读 · 0 评论 -
OpenCV Tutorial: 銳化
銳化影像銳化是讓模糊的影像變得清晰,讓細節更明顯,可以直接使用讓我們的輸出圖像銳化,或者在後續的邊緣偵測時,能得到較佳的結果,銳化主要用於增強影像的強度變化,目的和平滑對於強度的跳變抑制相反,這兩者的運算子也能看出這點,線性平滑基於鄰域的加權求和,而銳化則用微分的概念來實現。銳化大致上可以劃分為兩類:基於一階微分:較知名的有Prewitt算子、Sobel算子等基於二階微分:有拉普拉转载 2016-10-29 11:38:05 · 946 阅读 · 0 评论 -
OpenCV Tutorial: 影像平滑(medianBlur、bilateralFilter)
影像平滑(medianBlur、bilateralFilter)平滑濾波主要分兩種,線性濾波和非線性濾波:線性濾波:有一個有固定參數的核心,常見的有平均平滑和高斯平滑。非線性濾波:沒有一個有固定的核心,常見的有中值濾波和雙邊濾波。這邊我們介紹中值濾波和雙邊濾波。中值濾波作法為統計排序的濾波器,對於影像某個像素,中值濾波會將濾波範圍內的所有像素排序,並用中值替換當前的像素值,转载 2016-10-29 10:40:14 · 2056 阅读 · 0 评论 -
OpenCV Tutorial: 影像平滑(blur、GaussianBlur)
影像平滑(blur、GaussianBlur)有時我們收到的影像雜訊過多,這時需要進行平滑化去除雜訊,不過為了去除雜訊,可能造成影像對比度下降,好的品質可能需要大量的處理時間,所以通常根據實際需求,選擇一個適合的手法,常見的有四種平滑方式,分別是平均平滑、高斯平滑、中值濾波、雙邊濾波,OpenCV對於這四種平滑方式皆有支援,只要呼叫即可使用。由濾波方式可分兩種,線性濾波和非線性濾波:转载 2016-10-29 10:36:47 · 1184 阅读 · 0 评论 -
OpenCV Tutorial: 色彩空間轉換(cvtColor)
色彩空間轉換(cvtColor)OpenCV的cvtColor()讓影像在不同色彩空間之中轉換,由於OpenCV從外界讀入圖檔時,比如使用imread()讀取JPEG檔時,Mat內存為BGR而不是RGB格式,所以輸入參數通常使用CV_BGR2XXX、CV_XXX2BGR,代表從BGR色彩空間轉到其他色彩空間,或從其他色彩空間轉到BGR色彩空間,依此類推,CV_RGB2XXX代表從RGB色彩空間转载 2016-10-29 10:13:47 · 653 阅读 · 0 评论 -
OpenCV Tutorial: 繪圖(line、rectangle、circle、ellipse、polylines、putText)
繪圖(line、rectangle、circle、ellipse、polylines、putText)OpenCV有函式方便我們繪圖,這邊依序介紹如何繪製線、矩形、圓、橢圓、多角形、文字在影像上,其他圖形請參考OpenCV文件。內文索引 [隱藏]1 連通類型2 OpenCV 畫線3 OpenCV 畫矩形4 OpenCV 畫圓5 OpenCV 畫橢圓6 OpenCV 畫多角形7转载 2016-10-29 09:48:51 · 17413 阅读 · 0 评论 -
OpenCV Tutorial: 影像卷積(Convolution)
影像卷積(Convolution)濾波(filtering)是影像處理的一個基本操作,目的在選擇性的提取重要訊息,用在影像銳化、去除雜訊或提取感興趣的視覺特徵,這類處理需尋訪影像每個像素,從此像素和相鄰像素得到新的像素值。核心(kernel):基本上核心是一個固定大小,其中心為錨點(anchor point)的二維矩陣,以下為一高斯濾波的核心,大小和矩陣數值依需求而變。卷積转载 2016-10-28 16:37:29 · 2179 阅读 · 0 评论 -
OpenCV Tutorial: 像素強度變換(convertTo)
像素強度變換(convertTo)這邊介紹影像的強度變換,指的是對每個像素依序進行同樣的運算,假設r和s分別為輸入和輸出影像任一點的灰階值,可以定義為:s = T(r),其中T為強度變換,表示輸入和輸出圖間強度的某種映射關係,強度變換可分為線性變換和非線性變換。最基本的線性變換就是一維線性變換:x’=a*x+b其中a為斜率,b為在y軸上的截距,x表示輸入影像的灰階值,x’為輸出影像转载 2016-10-28 16:12:57 · 1219 阅读 · 0 评论