OpenCV是一個(gè)開源的計(jì)算機(jī)視覺庫,可以處理圖像和視頻數(shù)據(jù)。它包含了超過2500個(gè)優(yōu)化過的算法,用于對圖像和視頻進(jìn)行處理,包括目標(biāo)識別、面部識別、運(yùn)動(dòng)跟蹤、立體視覺等。OpenCV支持多種編程語言,包括C++、Python、Java等,可以在Windows、Linux、Mac OS X、Android等多個(gè)平臺上使用。
圖像
圖像和視頻數(shù)是指數(shù)字圖像和數(shù)字視頻中包含的像素或幀數(shù)。在數(shù)字圖像中,圖像數(shù)指的是圖像中包含的像素?cái)?shù)量,通常用寬度和高度的乘積來表示。在數(shù)字視頻中,視頻數(shù)指的是視頻中包含的幀數(shù),即視頻中連續(xù)的靜止圖像序列數(shù)量。圖像和視頻數(shù)是指數(shù)字圖像和數(shù)字視頻中包含的像素或幀數(shù)。在數(shù)字圖像中,圖像數(shù)指的是圖像中包含的像素?cái)?shù)量,通常用寬度和高度的乘積來表示。在數(shù)字視頻中,視頻數(shù)指的是視頻中包含的幀數(shù),即視頻中連續(xù)的靜止圖像序列數(shù)量。
pip install opencv-contrib-python 直接安裝編譯好的 OpenCV 貢獻(xiàn)庫
如果遇到了cv2無法有智能提示的功能
就把你下載cv2的路徑下安裝包c(diǎn)v2的pyd復(fù)制到你現(xiàn)在使用的Python解釋器路徑的文件下面
一、圖像基本操作
導(dǎo)入所需要的庫(使用 pip install 完整路徑文件名完成安裝)
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
1.0 讀取像素
1.0.1 cv2中的方式
1) cv2返回值=圖像(位置參數(shù))
# 灰度
p=img[88,142]
print(p)
# 彩色的
b=img[12,13,14]
print(b)
xb=img[12.32]
print(xb)
2) cv2修改像素
img[1,2]=[213,12,12]
#通道的
img[1,2,1]=255
#跨行數(shù)的修改
img[100:150,100:150]=[255.0,255]
1.0.2 np中的方式進(jìn)行像素處理
第一種方式 x=imgx[1,2] 返回的是一個(gè)包含像素值的數(shù)組,其中包括了圖像的所有通道。而第二種方式 y=imgx.item(1,2) 返回的是指定位置的像素值,對于彩色圖像,這個(gè)值是該位置的第一個(gè)通道的像素值。如果你想獲取其他通道的像素值,你需要使用索引來訪問。
1)np方式讀取像素 :返回值=圖像.item(位置參數(shù))
y=imgx.item(1,2,1)
print(y)
print(type(y))
2)修改 itemset((1,2,0),12)
imgx.itemset((1,2,0),12)
print(imgx.item(1,2,0))
print(y)
3)數(shù)據(jù)類型
img.dtype
1.1 讀取圖像
img = cv2.imread(filename, flags=None)
- img是返回值,其值是讀取到的圖像。如果未讀取到圖像,則返回“None”。
- filename 表示要讀取的圖像的完整文件名。
- flags 是讀取標(biāo)記。該標(biāo)記用來控制讀取文件的類型
1.1.1 演示:
使用的照片:
# 圖像IO操作
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1.讀取圖像
img = cv.imread("Pic/f2e919585490afd1bebd313257e7ad9.jpg")
# 2、顯示圖像
## 2.1 OpenCV中的方法
cv.imshow("THIS Pi", img)
cv.waitKey(0)
# 按照窗口顯示的
cv.destroyAllWindows()
1.1.2 支持
1.1.3 flag
cv2.IMREAD_UNCHANGED和cv2.IMREAD_GRAYSCALE是OpenCV庫中用于讀取圖像的兩種不同的模式。
-
cv2.IMREAD_UNCHANGED:這個(gè)模式會讀取圖像的原始數(shù)據(jù),包括alpha通道(如果存在的話)。也就是說,如果圖像是彩色的,那么它會保持彩色,如果圖像有alpha通道,那么alpha通道也會被保留。
-
cv2.IMREAD_GRAYSCALE:這個(gè)模式會將圖像轉(zhuǎn)換為灰度圖像。也就是說,無論原始圖像是彩色的還是帶有alpha通道的,讀取后的圖像都會是灰度的。加粗樣式
- IMREAD_UNCHANGED = -1:返回原始圖像,包括alpha通道(如果存在)在內(nèi)的所有信息,即原始圖像。
- IMREAD_GRAYSCALE = 0:將圖像轉(zhuǎn)換為灰度圖像。
- IMREAD_COLOR = 1:返回BGR順序的彩色圖像,忽略alpha通道。
- IMREAD_ANYDEPTH = 2:如果圖像具有深度信息,保留這些信息(,則返回16位/32位圖像),否則將圖像轉(zhuǎn)換為8位。
- IMREAD_ANYCOLOR = 4:嘗試以最可能的顏色格式讀取圖像。
- IMREAD_LOAD_GDAL = 8:使用GDAL驅(qū)動(dòng)來讀取圖像。
- IMREAD_REDUCED_GRAYSCALE_2 = 16, IMREAD_REDUCED_GRAYSCALE_4 = 32, IMREAD_REDUCED_GRAYSCALE_8 = 64:將圖像轉(zhuǎn)換為單通道灰度圖像,并減少圖像的大?。ǚ謩e減少1/2、1/4、1/8)。
- IMREAD_REDUCED_COLOR_2 = 17, IMREAD_REDUCED_COLOR_4 = 33, IMREAD_REDUCED_COLOR_8 = 65:轉(zhuǎn)換圖像為3通道BGR彩色圖像,并減少圖像的大小(分別減少1/2、1/4、1/8)。
- IMREAD_IGNORE_ORIENTATION = 128:忽略EXIF元數(shù)據(jù)中的定位信息,不旋轉(zhuǎn)圖像。
這些標(biāo)志可以根據(jù)你的需求進(jìn)行組合使用,例如,你可以同時(shí)使用IMREAD_GRAYSCALE和IMREAD_REDUCED_GRAYSCALE_2,這樣OpenCV會讀取灰度圖像,并將其大小減少一半。
部分解釋:
1.*.1_ 什么是alpha通道
Alpha通道是圖像中的一個(gè)通道,它表示圖像的透明度信息。在一個(gè)RGBA顏色模型中,R代表紅色,G代表綠色,B代表藍(lán)色,A代表Alpha,即透明度。
Alpha通道的值通常在0到255之間,其中0表示完全透明,255表示完全不透明。通過改變Alpha通道的值,我們可以改變圖像的透明度。例如,如果我們將一個(gè)像素的Alpha值設(shè)置為127,那么這個(gè)像素將會是半透明的。
Alpha通道在圖像處理中有很多應(yīng)用,例如在合成兩個(gè)圖像時(shí),我們可以通過調(diào)整Alpha通道的值來控制每個(gè)圖像的可見度。
常見的色彩深度有:
- 1位:二值圖像,只有黑和白兩種顏色。
- 8位:灰度圖像,可以表示256種不同的灰度級別。
- 24位:真彩色圖像,每個(gè)顏色通道(紅、綠、藍(lán))使用8位,可以表示約1670萬種顏色。
- 32位:包含alpha通道的真彩色圖像,每個(gè)顏色通道(紅、綠、藍(lán)和alpha)使用8位。
所以,如果你問的是像素可以表示的顏色數(shù)量,那么:
- 1位色彩深度可以表示2種顏色。
- 8位色彩深度可以表示256種顏色。
- 24位色彩深度可以表示約1670萬種顏色。
- 32位色彩深度理論上可以表示約429億種顏色,但實(shí)際上由于alpha通道表示的是透明度而非顏色,所以可表示的顏色數(shù)量仍然是約1670萬種。
彩色深度標(biāo)準(zhǔn)通常有以下幾種:
- 8位色,每個(gè)像素所能顯示的彩色數(shù)為2的8次方,即256種顏色。
- 16位增強(qiáng)色,16位彩色,每個(gè)像素所能顯示的彩色數(shù)為2的16次方,即65536種顏色。
- 24位真彩色,每個(gè)像素所能顯示的彩色數(shù)為24位,即2的24次方,約1680萬種顏色。
- 32位真彩色,即在24位真彩色圖像的基礎(chǔ)上再增加一個(gè)表示圖像透明度信息的Alpha通道。
1.*.2_ 灰度圖后使用 print 語句打印讀取的圖像數(shù)據(jù)。
輸出圖像的部分像素值
256個(gè)灰度等級,255代表全白,0表示全黑。
灰度圖的顯示的print
原格式的print
1.2 顯示圖像
在讀取圖像前判斷圖像文件是否存在,并在顯示圖像前判斷圖像是否存在
1.2.1 imshow函數(shù)__在一個(gè)窗口內(nèi)顯示讀取的圖像。
img = cv2.imshow( winname, mat )
winname 是窗口名稱、mat 是要顯示的圖像。
cv2.imshow("THIS Pi", img)
cv2.imshow("THIS Pi", img)
如果是兩個(gè)同名的,只會顯示一個(gè)窗口
cv2.namedWindow("lesson")
cv2.imshow("THIS Pi", img)
cv2.imshow("lesson", img) 引用一個(gè)并不存在的窗口,并在其中顯示指定圖像
可以用cv2.imshow()來創(chuàng)建一個(gè)新窗口并顯示圖像。如果指定的窗口名稱已存在,則會在該窗口中顯示圖像。如果指定的窗口名稱不存在,則會創(chuàng)建一個(gè)新的窗口并顯示圖像。實(shí)際上,cv2.imshow()函數(shù)會完成窗口的創(chuàng)建和圖像的顯示兩個(gè)步驟。
1.2.2 namedWindow__創(chuàng)建指定名稱的窗口
img = cv2.namedWindow( winname )
1.2.3 waitKey函數(shù)
cv2.waitKey( [delay] )
retval表示函數(shù)cv2.waitKey()的返回值。如果沒有按鍵被按下,則返回-1;如果有按鍵被按下,則返回該按鍵的ASCII碼。
delay表示等待鍵盤觸發(fā)的時(shí)間,單位是毫秒。當(dāng)該值設(shè)置為負(fù)數(shù)或零時(shí),表示無限等待,即函數(shù)會一直等待鍵盤的觸發(fā)。該值默認(rèn)為0。
1.2.3.1 要實(shí)現(xiàn)交互,可以使用cv2.waitKey函數(shù)來等待鍵盤輸入
import cv2
# 讀取圖像
image = cv2.imread("image.jpg")
while True:
# 在窗口中顯示圖像
cv2.imshow("Image", image)
# 等待鍵盤輸入,等待時(shí)間為0毫秒
key = cv2.waitKey(0)
# 如果按下鍵盤上的 "q" 鍵,退出循環(huán)
if key == ord("q"):
break
# 關(guān)閉窗口
cv2.destroyAllWindows()
delay>0 等待delay毫秒
delay<0 等待鍵盤單擊
delay=0 無限等待
窗口會顯示讀取的圖像,然后等待鍵盤輸入。如果按下的是 “q” 鍵,程序?qū)⑼顺鲅h(huán)并關(guān)閉窗口。如果按下其他鍵,則會繼續(xù)等待鍵盤輸入。這樣就實(shí)現(xiàn)了交互式地顯示圖像。
1.2.4 destroyWindow函數(shù)
cv2.destroyWindow( winname #winname 是窗口的名稱。
1.2.5 destroyAllWindows
cv2.destroyAllWindows()#用來釋放(銷毀)所有窗口
1.3 保存圖像 cv2.imwrite()
retval cv2.imwrite( filename, img[, params] )#文件地址,文件名
retval 是返回值。如果保存成功,則返回 True;如果保存不成功,則返回 False。
filename 是要保存的目標(biāo)文件的完整路徑名,包含文件擴(kuò)展名。
img 是被保存的圖像。
params 是保存類型參數(shù),是可選的
import cv2
# 讀取圖像
image = cv2.imread("image.jpg")
# 保存圖像
retval = cv2.imwrite("saved_image.jpg", image)
# 判斷是否保存成功
if retval:
print("圖像保存成功")
else:
print("圖像保存失敗")
保存灰度圖
對比一下先:
plt.imshow(img,cmap=plt.cm.gray)
為了直觀用Pycharm
二、繪制幾何圖形
import numpy as np
import cv2
# 創(chuàng)建一個(gè)黑色的圖像
img = np.zeros((512, 512, 3), dtype=np.uint8)
# 畫線
cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
# 畫矩形
cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)
# 畫圓
cv2.circle(img, (447, 63), 63, (0, 0, 255), -1)
# 畫橢圓
cv2.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1)
# 畫多邊形
pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, (0, 255, 255))
# 顯示圖像
cv2.imshow('Image with Shapes', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.1 畫直線
def line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None):
2.2 畫矩形
def rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None):
文章來源:http://www.zghlxwxcb.cn/news/detail-715618.html
2.3 畫圓
def circle(img, center, radius, color, thickness=None, lineType=None, shift=None):
文章來源地址http://www.zghlxwxcb.cn/news/detail-715618.html
2.4 畫橢圓
def ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=None, lineType=None, shift=None)
2.5 畫多邊形
到了這里,關(guān)于我在Vscode學(xué)OpenCV 初步接觸的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!