公司網(wǎng)站打不開網(wǎng)頁(yè)搜索引擎大全
一、機(jī)器視覺(jué)
現(xiàn)在說(shuō)的機(jī)器視覺(jué)(Machine Vision)一般指計(jì)算機(jī)視覺(jué)(Computer Vision), 簡(jiǎn)單來(lái)說(shuō)就是研究如何使機(jī)器看懂東西。就是是指用攝影機(jī)和電腦代替人眼對(duì)目標(biāo)進(jìn)行識(shí)別、跟蹤和測(cè)量等機(jī)器視覺(jué),并進(jìn)一步做圖形處理,使電腦處理成為更適合人眼觀察或傳送給儀器檢測(cè)的圖像。
1.1 機(jī)器視覺(jué)的應(yīng)用
人臉識(shí)別, 車輛檢測(cè),識(shí)別圖像中的文字(OCR),圖像拼接, 修復(fù), 背景替換
二、OpenCV
Gray Bradsky于1999年開發(fā), 2000年發(fā)布
C++, Python, Java, JS
跨平臺(tái)(Windows, Linux, Mac...)
學(xué)習(xí)opencv可以:
- 了解OpenCV的運(yùn)行機(jī)制
- 可以使用OpenCV處理一些圖像常見問(wèn)題
- 學(xué)會(huì)物體識(shí)別, 文字識(shí)別等問(wèn)題的處理思路
2.1 安裝OpenCV?
使用服務(wù)器虛擬環(huán)境安裝:
pip install opencv-python==4.7.0.72
安裝opencv擴(kuò)展包(選裝):
pip install opencv-contrib-python==4.7.0.72
如果裝不了去:https://www.lfd.uci.edu/~gohlke/pythonlibs/下載相應(yīng)的包手動(dòng)安裝.
三、OpenCV讀取與顯示
3.1 創(chuàng)建窗口
namedWindow() 創(chuàng)建命名窗口# WINDOW_AUTOSIZE 窗口大小不允許修改 cv2.namedWindow('new', cv2.WINDOW_AUTOSIZE) # WINDOW_NORMAL可以讓窗口大小變得可以調(diào)節(jié) # cv2.namedWindow('new', cv2.WINDOW_NORMAL)# 修改窗口大小 # cv2.resizeWindow('new', 1920, 1080)imshow('new', 顯示內(nèi)容) 顯示窗口
# 銷毀圖像窗口 cv2.destroyAllWindows()# waitKey方法表示等待按鍵, 0表示任何按鍵, 其他整數(shù)表示等待按鍵的時(shí)間,單位是毫秒, 超過(guò)時(shí)間沒(méi)有發(fā)生按鍵操作窗口會(huì)自動(dòng)關(guān)閉. waitKey() 等待用戶輸入# 會(huì)返回按鍵的ascii的值 # key = cv2.waitKey(0) if key == ord('q'): cv2.destroyAllWindows()
ord()獲取ascii值
?
3.2 圖片讀寫
使用imread可以讀取圖片, 默認(rèn)讀取的是彩色圖片. imread(path, flag) imwrite(path, img): 使用imwrite保存圖片
cv2.imread('01_Picture/01_cat.jpg')
cv2.imshow('cat',img)
cv2.waitKey(0)
?使用matplotlib顯示`plt.imshow(img)`
import matplotlib.pyplot as pltimg= cv2.imread('D:\\3-project\\zyj\\pythonCNN\\pic\\cat.jpeg')
plt.imshow(img)
plt.show()
因?yàn)镺penCV讀取的圖片顏色通道是按照BGR(藍(lán)綠紅)排列的, 一般圖片通道都是按照RGB來(lái)排列的.為了正常的顯示貓的圖片, 我們要用OpenCV的圖像顯示方法:
3.3 視頻播放和錄制
視頻是由圖片組成的, 視頻的每一幀就是一幅圖片, 一般是30幀, 表示一秒顯示30張圖片
cv2.VideoCapture可以捕獲攝像頭, 用數(shù)字來(lái)表示不同的設(shè)備, 比如0, 1
vc = cv2.VideoCapture('./1.mp4')??# 打開視頻文件
vc = cv2.VideoCapture(0)??# 打開攝像頭
import cv2
import matplotlib.pyplot as plt
import numpy as npcv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)vc = cv2.VideoCapture(0) #打開攝像頭while True:# vc.read() 返回兩個(gè)值, 第一個(gè)為狀態(tài)值, 讀到幀為True, 第二個(gè)值為視頻幀ret, frame = vc.read()if not ret:breakcv2.imshow('video',frame) # 將視頻幀放在窗口中顯示key= cv2.waitKey(10)if key & 0xFF == ord('q'):break# 釋放
vc.release()
cv2.destroyAllWindows()
錄制視頻
cap = cv2.VideoCapture(0)
# *mp4v就是解包操作 等同于 'm', 'p', '4', 'v'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# (640, 480)表示攝像頭拍視頻, 這個(gè)大小搞錯(cuò)了也不行.
# 主要是這個(gè)分辨率.
vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))while cap.isOpened():ret, frame = cap.read()if not ret:print('can not recive frame, Exiting...')breakvw.write(frame)cv2.imshow('frame', frame)if cv2.waitKey(1) == ord('q'):breakcap.release()#釋放VideoWriter
vw.release()cv2.destroyAllWindows()
- VideoWriter : 參數(shù)一為輸出文件, 參數(shù)二為多媒體文件格式(VideoWriter_fourcc, 參數(shù)三為幀率, 參數(shù)四為分辨率.
- write 編碼并寫入緩存
- release 緩存內(nèi)容寫入磁盤, 并釋放資源
3.4 控制鼠標(biāo)
OpenCV允許我們對(duì)窗口上的鼠標(biāo)動(dòng)作做出響應(yīng).
setMouseCallback(winname, callback, userdata) winname是窗口的名字, callback是回調(diào)函數(shù), userdata是給回調(diào)函數(shù)的參數(shù).
callback(event, x, y, flags, userdata)回調(diào)函數(shù)必須包含這5個(gè)參數(shù). event是事件(鼠標(biāo)移動(dòng), 左鍵, 右鍵等), x,y是點(diǎn)鼠標(biāo)的坐標(biāo)點(diǎn), flags主要用于組合鍵, userdata就是上面的setMouseCallback的userdata
? 鼠標(biāo)事件:?
? - EVENT_MOUSEMOVE ? 0 ? ? 鼠標(biāo)移動(dòng)
? - EVENT_LBUTTONDOWN ? 1 ? 按下鼠標(biāo)左鍵
? - EVENT_RBUTTONDOWN ? 2 ?按下鼠標(biāo)右鍵
? - EVENT_MBUTTONDOWN ?3 按下鼠標(biāo)中鍵
? - EVENT_LBUTTONUP ? ?4 ? ? ?左鍵釋放
? - EVENT_RBUTTONUP ? 5 ? ? ?右鍵釋放
? - EVENT_MBUTTONUP ? 6 ? ? 中鍵釋放
? - EVENT_LBUTTONDBLCLK 7 左鍵雙擊
? - EVENT_RBUTTONDBLCLK ?8 右鍵雙擊
? - EVENT_MBUTTONDBLCLK ?9 中鍵雙擊
? - EVENT_MOUSEWHEEL ?10 鼠標(biāo)滾輪上下滾動(dòng)
? - EVENT_MOUSEHWHEEL 11 鼠標(biāo)左右滾動(dòng)
? flags:
? - EVENT_FLAG_LBUTTON ? ?1 ?按下左鍵
? - EVENT_FLAG_RBUTTON ? ?2 ?按下右鍵
? - EVENT_FLAG_MBUTTON ? 4 按下中鍵
? - EVENT_FLAG_CRTLKEY ? ?8 ? 按下ctrl鍵
? - EVENT_FLAG_SHIFTKEY ? 16 ?按下shift鍵
? - EVENT_FLAG_ALTKEY ? ? ? 32 ?按下alt鍵
import cv2
import numpy as npdef mouse_callback(event, x, y, flags, userdata):print(event, x, y, flags, userdata)cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 360)# 設(shè)置鼠標(biāo)回調(diào)函數(shù)
cv2.setMouseCallback('mouse', mouse_callback, '123')# 顯示窗口和背景
# 生成全黑的圖片
img = np.zeros((360, 640, 3), np.uint8)
while True:cv2.imshow('mouse', img)key = cv2.waitKey(1)if key & 0xFF == ord('q'):breakcv2.destroyAllWindows()
3.5 TrackBar控件
- createTrackbar(trackbarname, winname, value, count, onChange) 創(chuàng)建TrackBar控件, value為trackbar的默認(rèn)值, count為bar的最大值, 最小為0
- getTrackbarPos(trackbarname, winname) 獲取TrackBar當(dāng)前值
import cv2
import numpy as np# 創(chuàng)建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 480)
# 定義回調(diào)函數(shù)
def callback(value):print(value)# 創(chuàng)建trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)# 創(chuàng)建一個(gè)背景圖片
img = np.zeros((480,640,3), np.uint8)while True:# 獲取當(dāng)前trackbar的值r = cv2.getTrackbarPos('R', 'trackbar')g = cv2.getTrackbarPos('G', 'trackbar')b = cv2.getTrackbarPos('B', 'trackbar')# 改變背景圖顏色img[:] = [b, g, r]cv2.imshow('trackbar', img)key = cv2.waitKey(1)if key & 0xFF == ord('q'):breakcv2.destroyAllWindows()