合肥晨曦網(wǎng)站建設(shè)百度競價關(guān)鍵詞怎么優(yōu)化
?博主簡介
博主是一名大二學(xué)生,主攻人工智能研究。感謝讓我們在CSDN相遇,博主致力于在這里分享關(guān)于人工智能,c++,Python,爬蟲等方面知識的分享。 如果有需要的小伙伴可以關(guān)注博主,博主會繼續(xù)更新的,如果有錯誤之處,大家可以指正。
專欄簡介: ? 本專欄主要研究計(jì)算機(jī)視覺,涉及算法,案例實(shí)踐,網(wǎng)絡(luò)模型等知識。包括一些常用的數(shù)據(jù)處理算法,也會介紹很多的Python第三方庫。如果需要,點(diǎn)擊這里??訂閱專欄 。
給大家分享一個我很喜歡的一句話:“每天多努力一點(diǎn),不為別的,只為日后,能夠多一些選擇,選擇舒心的日子,選擇自己喜歡的人!”
目錄
計(jì)算機(jī)眼里的圖像
計(jì)算機(jī)視覺的起源
馬爾計(jì)算視覺
主動和目的視覺
多視幾何和分層三維重建
基于學(xué)習(xí)的視覺
計(jì)算及視覺的難點(diǎn)
專欄研究方向
傳統(tǒng)圖像處理之OpenCV的妙用
OpenCV安裝
OpenCV模塊
OpenCV的基本操作
OpenCV數(shù)據(jù)存取
?OpenCV圖像縮放
?OpenCV圖像裁剪
?OpenCV圖像旋轉(zhuǎn)
從攝像頭讀取
矩陣操作
計(jì)算機(jī)眼里的圖像
圖像一直以直觀著稱,一張圖像包含的信息很多,所謂一圖勝千言,對于人類來說,理解圖像很方便,幾乎是一眼就能理解圖像表達(dá)的意思,科學(xué)研究表明這是因?yàn)槿说拇竽X有一套注意力集中機(jī)制,對于圖像中的海量信息,人腦能快速地找到其中最重要的信息。但是,計(jì)算機(jī)該如何去理解?這就涉及到了計(jì)算機(jī)視覺的知識,本專欄就是來描述計(jì)算機(jī)視覺。
計(jì)算機(jī)視覺的起源
1982年《視覺》(Marr,1982)一書的問世,標(biāo)志著計(jì)算機(jī)視覺這門學(xué)科的誕生。此后,計(jì)算機(jī)視覺經(jīng)歷了四個階段,第一個階段,馬爾計(jì)算視覺;第二個階段,主動和目的視覺;第三階段,多視幾何和分層三維重建;第四個階段,基于學(xué)習(xí)的視覺。四個階段算然是依次進(jìn)行的,但不能說哪一個好,哪一個不好,只是后者比前者更加順應(yīng)當(dāng)時的時代。
馬爾計(jì)算視覺
馬爾計(jì)算視覺的主要思想是大腦可以快速完成三維重建,馬爾認(rèn)為,三維重建是可以完全靠計(jì)算來實(shí)現(xiàn)。他認(rèn)為圖象是物理實(shí)體在視網(wǎng)膜上的投影,所以理解了物理信息,就可以理解圖像信息。簡而言之,其計(jì)算機(jī)視覺計(jì)算理論就是要“挖掘物體的物理屬性來完成對應(yīng)的視覺問題”。其意義完在于,如果簡單地從數(shù)學(xué)角度出發(fā),很多圖像具有歧義性。
主動和目的視覺
馬爾視覺的泛化性不夠理性,很難在工業(yè)界實(shí)現(xiàn),可以想象,由計(jì)算機(jī)對任何物體做三維重建是多么困難。美國的R.Bajcsy教授,提出了主動視覺的概念,主要思想視覺要有目的性,例如在一張百人合影里面,人能輕松地找到自己的位置,或者自己好友的位置,而對其他人“視而不見”。三維重建并非視覺的目的,找到想看到的圖像才是根本目的。
多視幾何和分層三維重建
隨著主動視覺曇花一現(xiàn),多視幾何走向繁榮,多視幾何的代表性人物有法國的O.Faugeras、美國的R.Hartely和英國的A.Zisserman等。多視幾何的目的是增加三維重建算法的效率和精度,使其能真正落地。三維重建就是從圖像中選取合適的圖像集,然后對拍攝位置信息進(jìn)行標(biāo)定并重建出場景的三維結(jié)構(gòu)。
基于學(xué)習(xí)的視覺
基于學(xué)習(xí)的視覺是本書的主要內(nèi)容,以機(jī)器學(xué)習(xí)為主要手段,包括流形學(xué)習(xí)和深度學(xué)習(xí)兩大流派。
流形學(xué)習(xí)時域2000年,但是在后面的研究中發(fā)現(xiàn),多數(shù)情況下流形學(xué)習(xí)的結(jié)果還不如傳統(tǒng)的降維方法,如主成分分析和線性判別分析等。
深度學(xué)習(xí)雖然是近幾年才火起來的,但是其效果非常好,并且模型層出不窮。深度學(xué)習(xí)更像是實(shí)踐科學(xué),和前幾個階段不同,并非有很完善的理論支持。往往在不停的嘗試中,模型得到改善。在靜態(tài)物體識別中,卷積神經(jīng)網(wǎng)絡(luò)已經(jīng)超過人類的準(zhǔn)確度。
計(jì)算及視覺的難點(diǎn)
計(jì)算機(jī)視覺的難點(diǎn)有兩點(diǎn):三維重建和魯棒性。
三維重建之所以對人類來說非常簡單,主要是因?yàn)槿吮旧砭蜕钤谌S世界中,而計(jì)算機(jī)卻是一個二維“生物”。就像我們?nèi)?gòu)建四維世界的東西,就會覺得非常困難,根本無從下手。對于計(jì)算機(jī)來說,完成三維世界的圖像構(gòu)建,對于他來說,無疑是降維打擊。所以這才需要人類的幫助,讓計(jì)算機(jī)能夠識別圖像。
魯棒性的問題簡單地說就是先驗(yàn)知識和注意機(jī)制問題。對于人來說,即使只是輪廓,或者很模糊的照片,也能大致猜測出圖片的內(nèi)容。但是計(jì)算機(jī)就不行,他對圖像的識別都有很嚴(yán)格的限制,改變顏色,形狀。模糊程度等,都會讓計(jì)算機(jī)識別精度下降。這就是魯棒性問題。
專欄研究方向
在介紹這篇專欄前,我先解釋一下,博主之前一直在更新人工智能算法專欄,由于人工智能算法涉及到的面很廣,知識面太過復(fù)雜,其中,就包含了深度學(xué)習(xí),所以,博主打算出一期計(jì)算機(jī)視覺的專欄,先介紹一下,這樣學(xué)習(xí)人工智能算法會簡單很多。博主更新完計(jì)算機(jī)視覺專欄后,會繼續(xù)更新人工智能算法。在這里給大家說一聲抱歉!
計(jì)算機(jī)視覺主要研究方向有圖像識別,目標(biāo)檢測,圖像分割,目標(biāo)跟蹤等。
圖像識別,也叫圖像分類,可以分為i物種級分類,子類分類和實(shí)例級分類,主要模型有VGG,GoogleNet,RestNet等,常用的數(shù)據(jù)庫有Minist手寫數(shù)字,carfil10,cifar100,ImageNet等。
目標(biāo)檢測,擁有識別物體類別,還需要框出物體位置信息,例如智能相機(jī),還能標(biāo)注出人臉的位置。傳統(tǒng)的,我們可以用OpenCV來解決這類問題,但是召回率低。常用的模型有Fast R-CNN,YOLO和SSD等。
圖像分割,計(jì)算機(jī)視覺中最高層次的理解范疇。目標(biāo)就是把圖像分割成具有相似特性的若干個區(qū)域,并使他們對因物體的不同部分或不同的物體。常用的模型是全卷積神經(jīng)網(wǎng)絡(luò)。
目標(biāo)跟蹤也可以看成連續(xù)的目標(biāo)檢測,目的就是在視頻中對物體進(jìn)行連續(xù)跟蹤。目標(biāo)跟蹤常用在監(jiān)控系統(tǒng)中。跟蹤算法可以被分為生成式和判別式兩大類別。深度學(xué)習(xí)主要用在判別模式上,著名的模型有SO-DLT和FCNT等。不同于目標(biāo)檢測、物體識別等領(lǐng)域深度學(xué)習(xí)一家獨(dú)大的形式,深度學(xué)習(xí)在目標(biāo)跟蹤方向還未能達(dá)成壟斷地位,其主要難點(diǎn)在于數(shù)據(jù)缺失和物體快速移動。
提到深度學(xué)習(xí)相關(guān)的計(jì)算機(jī)視覺,不得不提到最近流行的風(fēng)格遷移,以及GAN生成式對抗網(wǎng)絡(luò)。例如現(xiàn)在使用的ZAO就是運(yùn)用了此技術(shù)。
傳統(tǒng)圖像處理之OpenCV的妙用
OpenCV(Open Source Computer Vision Library)顧名思義就是開源的計(jì)算機(jī)視覺庫,采用C,C++編寫,也提供了Python和Matlab等語言的接口,并且在各大操作平臺均可使用。OPenCV不只是一個簡單的提供了計(jì)算機(jī)視覺常用的操作,更對其中關(guān)鍵算法進(jìn)行了優(yōu)化和提速,從而可以進(jìn)行多線程處理。
OpenCV安裝
pip install opencv-python
如果下載速度太慢,可以考慮使用鏡像:
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
OpenCV模塊
CUDA-accelerated Computer Vision:CUDA加速模塊。
Core functionality:和興功能模塊,包含各種c++操作,接口,矩陣運(yùn)算。
Image Processing:圖像處理模塊,包含圖像處理四大任務(wù)。
Image file reading and writing:圖像讀取和保存模塊。
Video I/O:視頻讀取和保存模塊。
Video Analysis:視頻分析模塊。
Camera Calibration and 3D Reconstruction:相機(jī)校準(zhǔn)和3D重建模塊。
2D Features Framework:2D功能框架模塊。
Objecneural Dection: 目標(biāo)檢測模塊。
Deep? Network module:深度學(xué)習(xí)模塊
Machine Learning:機(jī)器學(xué)習(xí)模塊。
Clustering and Search in Multi-Dimensional Spaces::多維空間模塊。
Computational Photography:計(jì)算攝影模塊。
Images stitching:圖像拼接模塊。
G-API framework:圖論框架模塊。
ArUco?Marker Detection:ArUco表i==標(biāo)記檢測模塊。
Improved Background-Foreground Segmentation Methods:背景,前景分割模塊。
Biologically inspired vision models and derivated tools:基于生物的視覺模型和工具模塊。
Custom Calibration Pattern for 3D reconstruction:傳統(tǒng)模式三維重建模塊。
OpenCV的基本操作
OpenCV數(shù)據(jù)存取
opencv支持各種類型與格式的圖像數(shù)據(jù),讀取方式非常簡單,使用imread函數(shù)即可,該函數(shù)有兩個參數(shù),第一個參數(shù)path指圖片路徑,第二個參數(shù)flag表示讀取方式,默認(rèn)值為從v.IMREAD_COLOR,默認(rèn)讀取彩色圖片,可選值為cv2.IMREAD_GRAYSCALE和cv2.IMREAD_UNCHANGED默認(rèn)顏色空間是BGR而非常用的FGB。
import cv2 img=cv2.imread('F:\Image\\test1.jpg',cv2.IMREAD_COLOR) cv2.imshow('圖片名字',img) cv2.waitKey(0) #保存圖片 cv2.imwrite('圖片文件.png',img) #第一個參數(shù)是保存圖片文件的名字,第二個是后綴
?
?OpenCV圖像縮放
當(dāng)數(shù)據(jù)集的圖像大小不一樣時,我們就需要用到圖像縮放,使所有的圖片大小保持一致,函數(shù)時cv2.resize(),第一個參數(shù)是目標(biāo)圖像,第二個參數(shù)是縮減比例。
import cv2
import numpy as np
#讀取圖片
img=cv2.imread('F:\Image\\test2.jpg',cv2.IMREAD_COLOR)
cv2.imshow('原有的圖片',img)
#進(jìn)行縮放
img=cv2.resize(img,(1000,1000)) #比例放縮1000:1000
#顯示圖片
cv2.imshow('圖片縮放',img)
cv2.waitKey(0)
?OpenCV圖像裁剪
普通圖像的裁剪非常簡單,由于讀取的圖像存儲方式時矩陣,所以我們只需取矩陣的一部分就完成了裁剪。
import numpy as np
import cv2
img=cv2.imread('F:\Image\\test3.jpg',cv2.IMREAD_COLOR)
cv2.imshow('裁剪前',img)
patch=img[0:50,0:50]
#取左上角50x50小塊
cv2.imshow('裁剪過后的圖片',patch)
cv2.waitKey(0)
?當(dāng)然,雖然我們不知道圖片的大小,所以裁剪的時候很麻煩,這時我們就可以隨機(jī)裁剪,l利用random模塊:
import numpy as np
import cv2
import random
img=cv2.imread('F:\Image\\test3.jpg',cv2.IMREAD_COLOR)
#得到圖像形狀
w,h,d=img.shape
cv2.imshow('裁剪前',img)
x=random.randint(0,w)
y=random.randint(0,h)
patch=img[x:w,y:h]
#取左上角50x50小塊
cv2.imshow('裁剪過后的圖片',patch)
cv2.waitKey(0)
?OpenCV圖像旋轉(zhuǎn)
圖像旋轉(zhuǎn)也是重要的操作,當(dāng)圖像的方向?yàn)榉撬椒较驎r,就需要通過旋轉(zhuǎn)成水平方向。
在OpenCV中,圖像旋轉(zhuǎn)有兩種實(shí)現(xiàn)方式:
第一種主要通過仿射變換,所用函數(shù)為cv2.warpAffine(),此函數(shù)有三個參數(shù):分別為需要旋轉(zhuǎn)的圖像,仿射變換矩陣,以及輸出圖像的大小。
仿射變換,也稱仿射映射,是指一個向量空間通過一次線性變換后,變?yōu)榱硪粋€空間??梢杂萌缦鹿奖硎?#xff1a;
其中矩陣A表示旋轉(zhuǎn)與縮放,向量b表示平移。
(1)旋轉(zhuǎn)變換,順時針旋轉(zhuǎn)
(2)縮放變換,水平方向?yàn)閍倍,豎直方向變?yōu)閎倍。
?代碼展示:
import numpy as np import cv2 img=cv2.imread('F:\Image\\test4.jpg',cv2.IMREAD_COLOR) w,h,d=img.shape #放射變換矩陣 M=np.array([[0,0.5,-10],[0.5,0,0]]) #旋轉(zhuǎn)圖片 img1=cv2.warpAffine(img,M,(w,h)) #顯示圖片 cv2.imshow('圖片旋轉(zhuǎn)',img) cv2.waitKey(0)
第二種使用OpenCV內(nèi)置函數(shù),所用的函數(shù)為cv2.getRotationMatrix2D(),此函數(shù)共三個參數(shù),分別為圖片旋轉(zhuǎn)中心,逆時針旋轉(zhuǎn)角度,以及縮放的倍數(shù)。和裁剪一樣,這里也可以使用random()實(shí)現(xiàn)隨機(jī)選擇和平移功能。
import numpy as np import cv2 img=cv2.imread('F:\Image\\test4.jpg',cv2.IMREAD_COLOR) img1=cv2.getRotationMatrix2D((1,1),90,1) cv2.imshow('圖片旋轉(zhuǎn)',img1) cv2.waitKey(0)
從攝像頭讀取
OpenCV不僅能對圖像進(jìn)行處理,還能對視頻進(jìn)行處理,我們也可以直接調(diào)用攝像頭進(jìn)行計(jì)算機(jī)獲取視頻。函數(shù)是cv2.VideoCapture()函數(shù),此函數(shù)只有一個參數(shù),0為計(jì)算機(jī)攝像頭,1為其他來源。
import cv2
import numpy as np
capture=cv2.VideoCapture(0)
while(True):#讀取一幀ret,frame=capture.read()#顯示一幀
cv2.imshow('capture',frame)
#關(guān)閉攝像頭
capture.release()
?讀取視頻后,可以用cv2.VideoWriter()函數(shù)創(chuàng)建視頻保存器即可。和讀取的時候一樣,也需要一幀一幀的保存,使用從cv2.putText()函數(shù),可選參數(shù)為幀名稱,幀標(biāo)題,標(biāo)題位于左上角坐標(biāo),字體,字體大小,顏色,字體粗細(xì)。
#從攝像頭讀取并保存錄像
import cv2
import numpy as np
#創(chuàng)建攝像頭
capture=cv2.VideoCapture(0)
#幀率
fps=60
#保存格式(mp4)
fourcc=cv2.VideoWriter_fourcc(*'mp4v')
#創(chuàng)建保存器
vout=cv2.VideoWriter()
vout.open('F:\Image\\temp.mp4',fourcc,fps,(1280,720),True)
#讀取一幀并保存
for i in range(100):_,frame=capture.read()cv2.putText(frame,str(i),(10,20),cv2.FONT_HERSHEY_PLAIN,1,(0,255,0),1,cv2.LINE_AA)vout.write(frame)
#釋放資源
vout.release()
capture.release()
這樣,就可以實(shí)現(xiàn)對攝像頭的調(diào)用。你就可以知道誰打開了你的電腦。
矩陣操作
add 矩陣加法,A+B的更高級形式,支持mask
scaleAdd 矩陣加法,一個帶有縮放因子dst(I) = scale * src1(I) + src2(I)
addWeighted 矩陣加法,兩個帶有縮放因子dst(I) = saturate(src1(I) * alpha + src2(I) * beta + gamma)
subtract 矩陣減法,A-B的更高級形式,支持mask
multiply 矩陣逐元素乘法,同Mat::mul()函數(shù),與A*B區(qū)別,支持mask
gemm 一個廣義的矩陣乘法操作
divide 矩陣逐元素除法,與A/B區(qū)別,支持mask
abs 對每個元素求絕對值
absdiff 兩個矩陣的差的絕對值
exp 求每個矩陣元素 src(I) 的自然數(shù) e 的 src(I) 次冪 dst[I] = esrc(I)
pow 求每個矩陣元素 src(I) 的 p 次冪 dst[I] = src(I)p
log 求每個矩陣元素的自然數(shù)底 dst[I] = log|src(I)| (if src != 0)
sqrt 求每個矩陣元素的平方根
min, max 求每個元素的最小值或最大值返回這個矩陣 dst(I) = min(src1(I), src2(I)), max同
minMaxLoc 定位矩陣中最小值、最大值的位置
compare 返回逐個元素比較結(jié)果的矩陣
bitwise_and, bitwise_not, bitwise_or, bitwise_xor 每個元素進(jìn)行位運(yùn)算,分別是和、非、或、異或
cvarrToMat 舊版數(shù)據(jù)CvMat,IplImage,CvMatND轉(zhuǎn)換到新版數(shù)據(jù)Mat
extractImageCOI 從舊版數(shù)據(jù)中提取指定的通道矩陣給新版數(shù)據(jù)Mat
randu 以Uniform分布產(chǎn)生隨機(jī)數(shù)填充矩陣,同 RNG::fill(mat, RNG::UNIFORM)
randn 以Normal分布產(chǎn)生隨機(jī)數(shù)填充矩陣,同 RNG::fill(mat, RNG::NORMAL)
randShuffle 隨機(jī)打亂一個一維向量的元素順序
theRNG() 返回一個默認(rèn)構(gòu)造的RNG類的對象 theRNG()::fill(…)
reduce 矩陣縮成向量
repeat 矩陣拷貝的時候指定按x/y方向重復(fù)
split 多通道矩陣分解成多個單通道矩陣
merge 多個單通道矩陣合成一個多通道矩陣
mixChannels 矩陣間通道拷貝,如Rgba[]到Rgb[]和Alpha[]
sort, sortIdx 為矩陣的每行或每列元素排序
setIdentity 設(shè)置單元矩陣
completeSymm 矩陣上下三角拷貝
inRange 檢查元素的取值范圍是否在另兩個矩陣的元素取值之間,返回驗(yàn)證矩陣
checkRange 檢查矩陣的每個元素的取值是否在最小值與最大值之間,返回驗(yàn)證結(jié)果bool
sum 求矩陣的元素和
mean 求均值
meanStdDev 均值和標(biāo)準(zhǔn)差
countNonZero 統(tǒng)計(jì)非零值個數(shù)
cartToPolar, polarToCart 笛卡爾坐標(biāo)與極坐標(biāo)之間的轉(zhuǎn)換
flip 矩陣翻轉(zhuǎn)
transpose 矩陣轉(zhuǎn)置,比較 Mat::t() AT
trace 矩陣的跡
determinant 行列式 |A|, det(A)
eigen 矩陣的特征值和特征向量
invert 矩陣的逆或者偽逆,比較 Mat::inv()
magnitude 向量長度計(jì)算 dst(I) = sqrt(x(I)2 + y(I)2)
Mahalanobis Mahalanobis距離計(jì)算
phase 相位計(jì)算,即兩個向量之間的夾角
norm 求范數(shù),1-范數(shù)、2-范數(shù)、無窮范數(shù)
normalize 標(biāo)準(zhǔn)化
mulTransposed 矩陣和它自己的轉(zhuǎn)置相乘 AT * A, dst = scale(src - delta)T(src - delta)
convertScaleAbs 先縮放元素再取絕對值,最后轉(zhuǎn)換格式為8bit型
calcCovarMatrix 計(jì)算協(xié)方差陣
solve 求解1個或多個線性系統(tǒng)或者求解最小平方問題(least-squares problem)
solveCubic 求解三次方程的根
solvePoly 求解多項(xiàng)式的實(shí)根和重根
dct, idct 正、逆離散余弦變換,idct同dct(src, dst, flags | DCT_INVERSE)
dft, idft 正、逆離散傅立葉變換, idft同dft(src, dst, flags | DTF_INVERSE)
LUT 查表變換
getOptimalDFTSize 返回一個優(yōu)化過的DFT大小
mulSpecturms 兩個傅立葉頻譜間逐元素的乘法
?
好了,本節(jié)的內(nèi)容就到此結(jié)束了,簡單的解釋了一下opencv,后續(xù)內(nèi)容會繼續(xù)更新的,關(guān)注博主,持續(xù)更新不迷路。拜了個拜。?