OpenCV學習筆記
- 關于OpenCV
- Task1:Opencv基本了解、影像讀取、繪圖
- 學習地址
- 思考題
- 練習題:
- Task2:影像儲存、色彩空間、影像的算術運算
- 學習地址
- 練習題
- Task3:幾何變換
- 練習題
關于OpenCV
- ? OpenCV的全稱是Open Source Computer Vision Library,是一個跨平臺的計算機視覺庫,OpenCV是由英特爾公司發起并參與開發,以BSD許可證授權發行,可以在商業和研究領域中免費使用,OpenCV可用于開發實時的影像處理、計算機視覺以及模式識別程式-----wikipedia,
Task1:Opencv基本了解、影像讀取、繪圖
學習地址
- 點我
思考題
- 輸入本地地址時因為地址中含有
\推薦使用原始字串r'()'來輸入(單引號可替換為雙引號或三引號)
Q:Opencv庫與Matlab、Halcon的區別?
A:
Halcon:底層功能演算法多,運算性能快,功能齊全,容易上手,開發專案周期短,非開源專案,商用收費,價格較貴,
OpenCV:功能演算法相對較多(比Halcon少),開源,可用于商用,開發周期較長(比Halcon長),有些演算法要自己寫,輕量且高效,
Matlab:Matlab一般用于快速實作演算法和測驗,用于研究理論,OpenCV適合開發實際的影像處理或視覺的應用,
Q:為什么是import cv2?
A: 此處 ‘2’ 表示的并不是opencv的版本號,OpenCV是基于C/C++的,”cv”和”cv2”表示的是底層C API和C++API的區別,”cv2”表示使用的是C++API,
Q:在顯示完之后,用不用cv.destroyWindow()有什么區別?
A:cv.destroyWindow()用來一個特定的視窗
Q:png圖片格式和jpg圖片格式有什么區別?
A:PNG是無損壓縮的圖片,JPG是有損壓縮;PNG支持透明,JPG不支持,
練習題:
同時顯示兩張不同解析度的圖片,對比他們的大小;

使用Opencv,測驗一下你電腦攝像頭的解析度和幀率是多少;
import cv2 as cv
video = cv.VideoCapture(r"C:\Users\86152\Videos\3.mp4")#讀取用電腦攝像頭錄制好的視頻
while video.isOpened():
ret, frame = video.read()
if ret:
cv.imshow("frame", frame)
else:
print("視頻播放完成!")
break
# 退出播放
key = cv.waitKey(25)
if key == 27: # 按鍵esc
break
fps = video.get(cv.CAP_PROP_FPS) #讀取幀率
size = (int(video.get(cv.CAP_PROP_FRAME_WIDTH)),int(video.get(cv.CAP_PROP_FRAME_HEIGHT)))#讀取解析度
print(fps)
print(size)
# 3.釋放資源
video.release()
cv.destroyAllWindows()
#結果
#視頻播放完成!
#29.74641183907191
#(640, 480)
利用電腦攝像頭從外界拍攝一幅自己的影像,添加圓(或其他圖形)
給自己打碼,圖片右下角添加自己的網名和時間,

Task2:影像儲存、色彩空間、影像的算術運算
學習地址
- 影像儲存、色彩空間戳我
- 算數運算戳我
練習題
1、HSV和BGR三原色在圖片資訊存盤的差別在哪?
RGB:以R(Red:紅)、G(Green:綠)、B(Blue:藍)三種基本色為基礎,進行不同程度的疊加,產生豐富而廣泛的顏色,所以儲存的資訊為R\G\B三種顏色的數值
HSV:和RGB顏色模型相似,也是由三個屬性決定顏色,H、S、V分別是色彩、深度、明暗,所以儲存資訊為H\S\V三個屬性多對應數值,
2、代碼呼叫電腦攝像頭,尋找視野中任意顏色(自定)并具有一定大小的物體,并用矩形框處,最后顯示在影像上:
- 參考
- findContours()詳解
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0, cv.CAP_DSHOW)
while 1:
# 讀取每一幀
ret, frame = cap.read()
# 將 RGB 轉化為 HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# 設定橘色范圍
orange_low = np.array([5, 100, 46])
orange_up = np.array([20, 255, 255])
# 設定一個橘色的蒙版,找出圖片中的橘色區域
mask = cv.inRange(hsv, orange_low, orange_up)
# 對橘色區域所在的蒙版進行高斯模糊處理
mask = cv.GaussianBlur(mask, (3, 3), 0)
# 查找蒙版區域的邊界
(cnt_s, _) = cv.findContours(mask.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
# 如果找到了輪廓,即發現了橘色區域
if len(cnt_s) > 0:
# 找出面積最大的輪廓,按照面積逆序排列
cnt = sorted(cnt_s, key=cv.contourArea, reverse=True)
# # 只會標出最大的橙色區域
# # 尋找能包絡橘色區域的最小長方形
# rect = np.int32(cv.boxPoints(cv.minAreaRect(cnt[0])))
# # 用線潭訓制
# cv.drawContours(frame, [rect], -1, (0, 255, 0), 2)
# 標出多個橙色區域
for i in cnt:
if len(i) > 60:
rect = np.int32(cv.boxPoints(cv.minAreaRect(i)))
cv.drawContours(frame, [rect], -1, (0, 255, 0), 2)
# mask 和 原圖疊加
res = cv.bitwise_and(frame, frame, mask=mask)
cv.imshow('frame', frame)
cv.imshow('mask', mask)
cv.imshow('res', res)
k = cv.waitKey(5) & 0xFF
if k == 27: # 按下 esc 退出
break
cv.destroyAllWindows()

3、創建一個視頻用來演示一幅圖如何平滑的轉換成另一幅圖(使用函式cv.addWeighted)
import cv2 as cv
img1 = cv.imread(r'C:\Users\86152\Pictures\2.jpg', cv.IMREAD_COLOR)
img2 = cv.imread(r'C:\Users\86152\Pictures\3.jpg', cv.IMREAD_COLOR)
fps = 30
file_path = r"C:\Users\86152\Videos\add_res.avi" # 匯出路徑
fourcc = cv.VideoWriter_fourcc(*'XVID') # 設定編碼器
video = cv.VideoWriter(file_path, fourcc, fps, (1920, 1080))
for i in range(0, 101):
x = i / 100
y = 1 - x
dst = cv.addWeighted(img1, x, img2, y, 0) # 調整權重混合圖片,縱享絲滑
video.write(dst) # 將合成圖片寫入視頻
cv.namedWindow("dst", 0)
cv.imshow('dst', dst)
cv.waitKey(1)
cv.waitKey(0)
cv.destroyAllWindows()
- 成果視頻鏈接
Task3:幾何變換
- 戳我
- 注意:shape得到的是圖片的 高 寬 而
resize()引數的輸入順序應該為高 寬 - resize()插值方法:縮放時推薦使用
cv2.INTER_AREA, 在擴展時我們推薦使用cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR, 默認情況下所有改變影像尺寸大小的操作使用的插值方法都是cv2.INTER_LINEAR - cv2.getPerspectiveTransform 透視變換
練習題
- 將下面紙張通過變換調節至正中央水平豎直放置,最終呈現的圖片效果上要保留白紙外的區域:

import cv2 as cv
import numpy as np
img = cv.imread(r'C:\Users\86152\Pictures\task3_1.jpg')
cv.namedWindow('img', 0)
cv.imshow('img', img)
w, h, x = img.shape
print(w, h)
point1 = np.array([[2151, 489], [3499, 1033], [351, 1585], [1979, 2925]], dtype="float32") # 源影像中待測矩形的四點坐標
point2 = np.array([[0, 0], [476, 0], [0, 674], [476, 674]], dtype="float32") # 目標影像中矩形的四點坐標
M = cv.getPerspectiveTransform(point1, point2)
out_img = cv.warpPerspective(img, M, (476, 674)) # 這個大致是A4紙的比例
cv.imshow('out_img', out_img)
cv.waitKey(0)
cv.destroyAllWindows()
成果圖

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257721.html
標籤:其他
下一篇:win10亮度進度條不見了
