image vb6 图片自适应_Python人工智能使用OpenCV进行图片形状的中心检测
我們都知道正方形(長方形)的中心是2條對(duì)角線的交點(diǎn),圓的中心是一個(gè)圓的圓心,如何在對(duì)象檢測(cè)以及圖片檢測(cè)與識(shí)別領(lǐng)域,判斷一個(gè)形狀的中心,便是計(jì)算機(jī)視覺領(lǐng)域中的一個(gè)基礎(chǔ)檢測(cè)
中心檢測(cè)
Opencv+python 實(shí)現(xiàn)物體形狀的質(zhì)心檢測(cè)
OpenCV(Open Source Computer Vision Library)是一個(gè)開源的計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫。OpenCV的建立是為了給計(jì)算機(jī)視覺應(yīng)用提供一個(gè)通用的基礎(chǔ)設(shè)施,并加速機(jī)器感知在商業(yè)產(chǎn)品中的應(yīng)用。作為BSD授權(quán)的產(chǎn)品,OpenCV使企業(yè)很容易利用和修改代碼。
它擁有C++、Python、Java和MATLAB接口,支持Windows、Linux、Android和Mac OS。OpenCV主要傾向于實(shí)時(shí)視覺應(yīng)用,并在可用時(shí)利用MMX和SSE指令。目前正在積極開發(fā)全功能的CUDAand OpenCL接口。有超過500種算法和大約10倍的函數(shù)組成或支持這些算法。OpenCV是用C++原生編寫的,有一個(gè)模板化的接口,可以與STL容器無縫對(duì)接。
Opencv在計(jì)算機(jī)視覺領(lǐng)域的發(fā)揮了很大的作用,大部分的計(jì)算機(jī)視覺領(lǐng)域的相關(guān)應(yīng)用都可以使用OpenCV來實(shí)現(xiàn),當(dāng)然很多神經(jīng)網(wǎng)絡(luò)訓(xùn)練的模型庫,OpenCV也可以進(jìn)行模型的調(diào)用,很大程度上方便了用戶的使用
中心檢測(cè)
import cv2import numpy as npimg = cv2.imread('13.jpg')gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret,thresh = cv2.threshold(gray_image,127,255,0)M = cv2.moments(thresh)cX = int(M["m10"] / M["m00"])cY = int(M["m01"] / M["m00"])cv2.circle(img, (cX, cY), 5, (255, 255, 255), -1)cv2.putText(img, "centroid", (cX - 25, cY - 25),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)cv2.imshow("Image", img)cv2.waitKey(0)代碼截圖
首先讀入一張我們需要尋找質(zhì)心的圖片,并轉(zhuǎn)換到灰度空間,然后使用OpenCV二值化函數(shù)進(jìn)行處理
opencv二值化的cv2.threshold簡單閾值函數(shù)
簡單閾值當(dāng)然是最簡單,選取一個(gè)全局閾值,然后就把整幅圖像分成了非黑即白的二值圖像了。
函數(shù)為cv2.threshold():
這個(gè)函數(shù)有四個(gè)參數(shù):第一個(gè)原圖像第二個(gè)進(jìn)行分類的閾值第三個(gè)是高于(低于)閾值時(shí)賦予的新值第四個(gè)是一個(gè)方法選擇參數(shù),常用的有:? cv2.THRESH_BINARY(黑白二值)? cv2.THRESH_BINARY_INV(黑白二值反轉(zhuǎn))? cv2.THRESH_TRUNC (得到的圖像為多像素值)? cv2.THRESH_TOZERO? cv2.THRESH_TOZERO_INV該函數(shù)有兩個(gè)返回值,第一個(gè)retVal(得到的閾值值)第二個(gè)就是閾值化后的圖像。當(dāng)然OpenCV除了簡單的二值化函數(shù)外,還提供了自適應(yīng)閾值函數(shù)
自適應(yīng)閾值可以看成一種局部性的閾值,通過規(guī)定一個(gè)區(qū)域大小,比較這個(gè)點(diǎn)與區(qū)域大小里面像素點(diǎn)的平均值(或者其他特征)的大小關(guān)系確定這個(gè)像素點(diǎn)是屬于黑或者白(如果是二值情況)。使用的函數(shù)為:cv2.adaptiveThreshold()該函數(shù)需要填6個(gè)參數(shù):
· 第一個(gè)原始圖像· 第二個(gè)像素值上限· 第三個(gè)自適應(yīng)方法Adaptive Method:— cv2.ADAPTIVE_THRESH_MEAN_C :領(lǐng)域內(nèi)均值—cv2.ADAPTIVE_THRESH_GAUSSIAN_C :領(lǐng)域內(nèi)像素點(diǎn)加權(quán)和,權(quán) 重為一個(gè)高斯窗口· 第四個(gè)值的賦值方法:只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV· 第五個(gè)Block size:規(guī)定領(lǐng)域大小(一個(gè)正方形的領(lǐng)域)· 第六個(gè)常數(shù)C,閾值等于均值或者加權(quán)值減去這個(gè)常數(shù)(為0相當(dāng)于閾值 就是求得領(lǐng)域內(nèi)均值或者加權(quán)值)這種方法理論上得到的效果更好,相當(dāng)于在動(dòng)態(tài)自適應(yīng)的調(diào)整屬于自己像素點(diǎn)的閾值,而不是整幅圖像都用一個(gè)閾值。使用中心距函數(shù)進(jìn)行圖片的中心檢測(cè)
opencv中提供了moments()來計(jì)算圖像中的中心矩(最高到三階),HuMoments()用于由中心矩計(jì)算Hu矩.同時(shí)配合函數(shù)contourArea函數(shù)計(jì)算輪廓面積和arcLength來計(jì)算輪廓或曲線長度moments()cv::moments ( InputArray array,bool binaryImage = false)array:輸入數(shù)組,可以是光柵圖像(單通道,8-bit或浮點(diǎn)型二維數(shù)組), 或者是一個(gè)二維數(shù)組(1 X N或N X 1),二維數(shù)組類型為Point或Point2fbinaryImage:默認(rèn)值是false,如果為true,則所有非零的像素都會(huì)按值1對(duì)待,也就是說相當(dāng)于對(duì)圖像進(jìn)行了二值化處理,閾值為1,此參數(shù)僅對(duì)圖像有效。通過以上步驟,便可以成功檢測(cè)到圖片的中心了
Opencv+python 實(shí)現(xiàn)多物體形狀的質(zhì)心檢測(cè)
絕大多數(shù)的時(shí)候,我們的圖片中包含了不僅一種形狀的物品,如何同時(shí)檢測(cè)多個(gè)物品的中心?
多形狀質(zhì)心檢測(cè)
import cv2import numpy as npimg = cv2.imread('11.png')gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret,thresh = cv2.threshold(gray_image,127,255,0)contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)for c in contours:M = cv2.moments(c)cX = int(M["m10"] / M["m00"])cY = int(M["m01"] / M["m00"])cv2.circle(img, (cX, cY), 5, (255, 255, 255), -1)cv2.putText(img, "centroid", (cX - 25, cY - 25),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)cv2.imshow("Image", img)cv2.waitKey(0)代碼截圖
跟單一圖形檢測(cè)中心對(duì)比,多圖形檢測(cè)中心增加了cv2.findContours函數(shù)
cv2.findContours()函數(shù)
cv2.findContours(image,?mode,?method[,?contours[,?hierarchy[,?offset?]]])??opencv2返回兩個(gè)值:contours:hierarchy。
opencv3會(huì)返回三個(gè)值,分別是img, countours, hierarchy
參數(shù):
第一個(gè)參數(shù)是尋找輪廓的圖像;
第二個(gè)參數(shù)表示輪廓的檢索模式,有四種(本文介紹的都是新的cv2接口): cv2.RETR_EXTERNAL表示只檢測(cè)外輪廓 cv2.RETR_LIST檢測(cè)的輪廓不建立等級(jí)關(guān)系 cv2.RETR_CCOMP建立兩個(gè)等級(jí)的輪廓,上面的一層為外邊界,里面的一層為內(nèi)孔的邊界信息。如果內(nèi)孔內(nèi)還有一個(gè)連通物體,這個(gè)物體的邊界也在頂層。 cv2.RETR_TREE建立一個(gè)等級(jí)樹結(jié)構(gòu)的輪廓。
第三個(gè)參數(shù)method為輪廓的近似辦法 cv2.CHAIN_APPROX_NONE存儲(chǔ)所有的輪廓點(diǎn),相鄰的兩個(gè)點(diǎn)的像素位置差不超過1,即max(abs(x1-x2),abs(y2-y1))==1 cv2.CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對(duì)角線方向的元素,只保留該方向的終點(diǎn)坐標(biāo),例如一個(gè)矩形輪廓只需4個(gè)點(diǎn)來保存輪廓信息 cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似
返回值
cv2.findContours()函數(shù)返回兩個(gè)值,一個(gè)是輪廓本身,還有一個(gè)是每條輪廓對(duì)應(yīng)的屬性。
contour返回值
cv2.findContours()函數(shù)首先返回一個(gè)list,list中每個(gè)元素都是圖像中的一個(gè)輪廓,用numpy中的ndarray表示。
通過cv2.findContours函數(shù)便可以成功找到圖形的外輪廓,如下圖
多形狀輪廓檢測(cè)
外輪廓檢測(cè)完成后,可以使用cv2.drawContours函數(shù)對(duì)圖片的輪廓進(jìn)行標(biāo)注出來
cv2.drawContours(img,contours,-1,(0,0,255),3)
cv2.drawContours()函數(shù)
1. cv2.drawContours(image,?contours,?contourIdx,?color [,?thickness[,?lineType[,?hierarchy[,?maxLevel[,?offset?]]]]])??· 第一個(gè)參數(shù)是指明在哪幅圖像上繪制輪廓;· 第二個(gè)參數(shù)是輪廓本身,在Python中是一個(gè)list。· 第三個(gè)參數(shù)指定繪制輪廓list中的哪條輪廓,如果是-1,則繪制其中的所有輪廓。后面的參數(shù)很簡單。其中thickness表明輪廓線的寬度,如果是-1(cv2.FILLED),則為填充模式當(dāng)檢測(cè)到多個(gè)輪廓后,便可以遍歷多個(gè)輪廓,對(duì)每個(gè)圖形進(jìn)行質(zhì)心的檢測(cè)通過以上的步驟,便可以檢測(cè)到形狀的外輪廓,并找到圖片的中心,這些技術(shù)在工業(yè)視覺領(lǐng)域應(yīng)用比較多,我們專欄中《打造屬于自己的天眼目標(biāo)檢測(cè)追蹤系統(tǒng)》中也用類似的介紹,哪里我們介紹了人臉的質(zhì)心檢測(cè)與 人臉質(zhì)心的目標(biāo)追蹤
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的image vb6 图片自适应_Python人工智能使用OpenCV进行图片形状的中心检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python高斯函数表达式_Python
- 下一篇: python中callable什么意思_