OpenCV概述與安裝
視覺概述
人類的視覺能夠很輕易地從圖像中識別出內(nèi)容。但是,計算機視覺不會像人類視覺那樣能夠?qū)D像進行感知和識別,更不會自動控制焦距和光圈,而是把圖像解析為按照柵格狀排列的數(shù)字。
這些按照柵格狀排列的數(shù)字包含大量的噪聲,噪聲在圖像上常表現(xiàn)為引起較強視覺效果的孤立像素點或像素塊,使得圖像模糊不清。因此,噪聲是計算機視覺面臨的一個難題。要想讓圖片變得清晰,就需要對抗噪聲。
計算機視覺使用統(tǒng)計的方法對抗噪聲,例如,計算機視覺雖然很難通過某個像素或者這個像素的相鄰像素判斷這個像素是否在圖像主體的邊緣上,但是如果對圖像某一區(qū)域內(nèi)的像素做統(tǒng)計,那么上述判斷就變得簡單了,即在指定區(qū)域內(nèi),圖像主體的邊緣應(yīng)該表現(xiàn)為一連串獨立的像素,而且這一連串像素的方向應(yīng)該是一致的。
OpenCV常用模塊
模塊 | 介紹 |
---|---|
Core | 包函OpenCV庫的基礎(chǔ)結(jié)構(gòu)以及基本操作 |
Improc | 包函基本的圖像轉(zhuǎn)換,包括濾波、卷積 |
Highgui | 輕量級的UI工具包 |
Video | 讀寫視頻流的方法 |
Calib3d | 校準單個、雙目以及多個相機的算法實現(xiàn) |
Feature2d | 檢測、描述、匹配特征點算法 |
Objecttect | 檢測待定目標的算法 |
ML | 包含大量機器學(xué)習(xí)算法 |
Flann | 多維空間的聚類和搜索 |
GPU | 包含在CUDA GPU上優(yōu)化實現(xiàn)的方法 |
Photo | 計算機攝影學(xué)的一些方法 |
Stitching | 圖像拼接流程的實現(xiàn) |
dnn | 深度神經(jīng)網(wǎng)絡(luò)模塊 |
安裝
安裝Python這里我使用的是Anaconda
-
創(chuàng)建虛擬環(huán)境
conda create --name 環(huán)境名稱 python=3.8
-
進入環(huán)境
activate 環(huán)境名稱
-
修改源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ -
查看源如下圖既可
conda config --show channels
-
安裝需要的依賴
pip install numpy pandas matplotlib opencv-python
-
查看是否安裝成功
pip list
-
測試一下是否安裝成功
準備一張圖片 這里我命名為image.jpg
import cv2 image = cv2.imread("image.jpg") print(image)
輸出類似如下:
OpenCV基礎(chǔ)-圖像數(shù)字化
讀取圖像:
# 獲取彩色圖像
image = cv2.imread("image.jpg")
方法 | 作用 |
---|---|
image.shape | (垂直像素,水平像素,通道數(shù)) |
image.size | 圖像包含的像素個數(shù) |
image.dtype | 數(shù)據(jù)類型 |
獲取某一像素的RGB值:
print(image[231, 128])
# B通道
print(image[231, 128, 0])
# G通道
print(image[231, 128, 1])
# R通道
print(image[231, 128, 2])
輸出:
[59 72 46]
59
72
46
即坐標[231, 128]上的像素的RGB值由[59 72 46]組成
拆分通道:
image = cv2.imread("image.jpg")
cv2.imshow("image", image)
b, g, r = cv2.split(image)
cv2.imshow("B", b) # 顯示B通道圖像
cv2.imshow("G", g) # 顯示G通道圖像
cv2.imshow("R", r) # 顯示R通道圖像
合并通道:
image = cv2.imread("image.jpg")
b, g, r = cv2.split(image)
rgb = cv2.merge([r, g, b]) # 按R→G→B順序合并
cv2.imshow("RGB", rgb)
創(chuàng)建純黑色的圖像:
width = 800
height = 600
img = np.zeros((height, width), np.uint8)
cv2.imshow("img", img)
拼接圖像:
image1 = cv2.imread("image1.jpg")
image2 = cv2.imread("image2.jpg")
# 水平拼接兩個圖像
img_h = np.hstack((image1, image2))
# 垂直拼接兩個圖像
img_v = np.vstack((image1, image2))
cv2.imshow("img_h", img_h)
cv2.imshow("img_v", img_v)
使用OpenCV繪制圖形
繪制黃色的線:
# 繪制一個黑色的背景畫布
canvas = np.zeros((300, 300, 3), np.uint8)
# 在畫布上,繪制一條起點坐標為(150, 50)、終點坐標為(150, 250),黃色的,線條寬度為20的線段
canvas = cv2.line(canvas, (150, 50), (150, 250), (0, 255, 255), 20)
繪制矩形:
# 在畫布上繪制一個左上角坐標為(65,65),右下角坐標為(180,150),青色的,線條寬度為20的矩形邊框
canvas = cv2.rectangle(canvas, (65, 65), (200, 150), (255, 255, 0), 20)
繪制圓形:
# 在畫布上,繪制一個圓心坐標為(150, 50),半徑為40,黃色的實心圓形
canvas = cv2.circle(canvas, (150, 50), 40, (0, 255, 255), -1)
繪制多邊形:
# 根據(jù)坐標[100, 50], [200, 50], [250, 250], [50, 250],繪制一個閉合的,紅色的,線條寬度為5的等腰梯形邊框
canvas = cv2.polylines(canvas, [np.array([[100, 50], [200, 50], [250, 250], [50, 250]], np.int32)], True, (0, 0, 255), 5)
繪制文字:
# 字體大小為2,線條顏色是綠色,線條寬度為5
cv2.putText(canvas, "Hello World", (20, 70), cv2.FONT_HERSHEY_TRIPLEX, 2, (0, 255, 0), 5)
OpenCV圖像變換
圖像縮放:
img = cv2.imread("image.png")
# 寬100像素、高100像素的大小進行縮放
dst = cv2.resize(img, (100, 100))
按比例縮放:
# 將寬縮小到原來的1/3、高縮小到原來的1/2
dst = cv2.resize(img, None, fx=1 / 3, fy=1 / 2)
# 將寬高擴大2倍
dst = cv2.resize(img, None, fx=2, fy=2)
圖像翻轉(zhuǎn):
沿X軸翻轉(zhuǎn):
dst1 = cv2.flip(img, 0)
沿Y軸翻轉(zhuǎn):
dst2 = cv2.flip(img, 1)
同時沿X軸、Y軸翻轉(zhuǎn):
dst3 = cv2.flip(img, -1)
圖像旋轉(zhuǎn):
# 圖像像素行數(shù)
rows = len(img)
# 圖像像素列數(shù)
cols = len(img[0])
# 圖像的中心點
center = (rows / 2, cols / 2)
# 以圖像為中心,逆時針旋轉(zhuǎn)30度,縮放0.8倍
M = cv2.getRotationMatrix2D(center, 30, 0.8)
dst = cv2.warpAffine(img, M, (cols, rows))
OpenCv圖形檢測
繪制圖像輪廓:
img = cv2.imread("image.png")
# 彩色圖像轉(zhuǎn)為變成單通道灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 灰度圖像轉(zhuǎn)為二值圖像
t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 檢測圖像中出現(xiàn)的所有輪廓,記錄輪廓的每一個點
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
# 繪制所有輪廓,寬度為5,顏色為紅色
cv2.drawContours(img, contours, -1, (0, 0, 255), 5)
為輪廓添加矩形框:
# 獲取第一個輪廓的最小矩形邊框,記錄坐標和寬高
x, y, w, h = cv2.boundingRect(contours[0])
# 繪制紅色矩形
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
為輪廓添加圓形框:
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
# 獲取最小圓形邊框的圓心點和半徑
center, radius = cv2.minEnclosingCircle(contours[0])
# 圓心點橫坐標轉(zhuǎn)為近似整數(shù)
x = int(round(center[0]))
# 圓心點縱坐標轉(zhuǎn)為近似整數(shù)
y = int(round(center[1]))
cv2.circle(img, (x, y), int(radius), (0, 0, 255), 2)
Canny邊緣檢測:
img = cv2.imread("image.png")
r1 = cv2.Canny(img, 10, 50)
直線檢測:
img = cv2.imread("image.jpg")
# 復(fù)制原圖
o = img.copy()
# 使用中值濾波進行降噪
o = cv2.medianBlur(o, 5)
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)
binary = cv2.Canny(o, 50, 150) # 繪制邊緣圖像
# 檢測直線,精度為1,全角度,閾值為15,線段最短100,最小間隔為18
lines = cv2.HoughLinesP(binary, 1, np.pi / 180, 15, minLineLength=100, maxLineGap=18)
for line in lines: # 遍歷所有直線
x1, y1, x2, y2 = line[0] # 讀取直線兩個端點的坐標
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2) # 在原始圖像上繪制直線
圓環(huán)檢測:
img = cv2.imread("image.jpg")
o = img.copy()
o = cv2.medianBlur(o, 5)
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY) # 從彩色圖像變成單通道灰度圖像
# 檢測圓環(huán),圓心最小間距為70,Canny最大閾值為100,投票數(shù)超過25。最小半徑為10,最大半徑為50
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 70, param1=100, param2=25, minRadius=10, maxRadius=50)
circles = np.uint(np.around(circles)) # 將數(shù)組元素四舍五入成整數(shù)
for c in circles[0]: # 遍歷圓環(huán)結(jié)果
x, y, r = c # 圓心橫坐標、縱坐標和圓半徑
# 繪制圓環(huán)
cv2.circle(img, (x, y), r, (0, 0, 255), 3)
# 繪制圓心
cv2.circle(img, (x, y), 2, (0, 0, 255), 3)
OpenCV處理視頻
開啟攝像頭:
import cv2
# 打開筆記本內(nèi)置攝像頭
capture = cv2.VideoCapture(0)
while (capture.isOpened()):
# 從攝像頭中實時讀取視頻
retval, image = capture.read()
# 在窗口中顯示讀取到的視頻
cv2.imshow("Video", image)
# 窗口的圖像刷新時間為1毫秒
key = cv2.waitKey(1)
# 按下空格就終止
if key == 32:
break
capture.release()
cv2.destroyAllWindows()
彩色視頻轉(zhuǎn)換為灰度視頻:
import cv2
capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)
while (capture.isOpened()):
retval, image = capture.read()
# 把彩色視頻轉(zhuǎn)換為灰度視頻
image_Gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
if retval == True:
cv2.imshow("Video", image)
cv2.imshow("Video_Gray", image_Gray)
key = cv2.waitKey(1)
if key == 32:
break
capture.release()
cv2.destroyAllWindows()
保存視頻圖像:
import cv2
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
while (cap.isOpened()):
ret, frame = cap.read()
cv2.imshow("Video", frame)
k = cv2.waitKey(1)
if k == 32:
cap.release()
cv2.destroyWindow("Video")
cv2.imwrite("路徑", frame) # 保存按下空格鍵時攝像頭視頻中的圖像
cv2.waitKey() # 刷新圖像
break
cv2.destroyAllWindows() # 銷毀顯示圖像的窗口
播放視頻文件:文章來源:http://www.zghlxwxcb.cn/news/detail-836442.html
import cv2
video = cv2.VideoCapture("視頻路徑")
while (video.isOpened()):
retval, image = video.read()
# 設(shè)置“Video”窗口的寬為800,高為600
cv2.namedWindow("Video", 0)
cv2.resizeWindow("Video", 800, 600)
if retval == True:
# 在窗口中顯示讀取到的視頻文件
cv2.imshow("Video", image)
else:
break
key = cv2.waitKey(1)
# 按下ESC退出
if key == 27:
break
video.release()
cv2.destroyAllWindows()
視頻文件轉(zhuǎn)換為灰度的:文章來源地址http://www.zghlxwxcb.cn/news/detail-836442.html
import cv2
video = cv2.VideoCapture("視頻路徑")
while (video.isOpened()):
retval, img_Color = video.read()
cv2.namedWindow("Gray", 0)
cv2.resizeWindow("Gray", 800, 600)
if retval == True:
img_Gray = cv2.cvtColor(img_Color, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray", img_Gray)
else:
break
key = cv2.waitKey(1)
if key == 27:
break
video.release()
cv2.destroyAllWindows()
到了這里,關(guān)于OpenCV使用基礎(chǔ)、技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!