圖片操作
cv2.namedWindow() 創建命名窗口
cv2.imshow()顯示窗口
cv2.destroyAllwindws()摧毀窗口
cv2.resizeWindow()改變窗口大小
cv2.waitKey()等待用戶輸入
cv2.imread()讀取圖像
img.shape 圖片h、w、c(高、寬、通道數
import cv2 # opencv讀取的格式是BGR
import matplotlib.pyplot as plt
import numpy as np# cv2.IMREAD_COLOR 彩色圖像
# cv2.IMREAD_GRAYSCALE 灰度圖像
img = cv2.imread('img1.jpg',cv2.IMREAD_COLOR)# 圖像顯示
cv2.imshow('img1',img)
# 等待時間,毫秒級,0表示任意鍵中止
cv2.waitKey(0)
cv2.destroyAllWindows()
?
視頻操作
cv2.VideoCapture() 可以捕獲攝像頭,用數字來控制不同的設備,例如0,1
如果是視頻文件,直接指定好路徑即可。
vc = cv2.VideoCapture('video1.mp4')
# 檢查是否打開正確
if vc.isOpened():open,frame = vc.read() # 每次讀取1幀,再read再讀取下一幀# 返回的第一個值是bool類型,第二個值是當前這一幀的圖像(三維數組)
else:open = False
# 通常情況下
while open:ret,frame = vc.read()if frame is None:breakif ret == True:gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # cv2.cvtColor(圖像,轉換方法)cv2.imshow('result',gray)if cv2.waitKey(10) & 0xFF == 27: # 27是esc鍵break
vc.release()
cv2.destroyAllWindows()
ROI
Region Of Interest 直譯為:感興趣的區域
作用為:截取部分圖像數據
# ROI
img = cv2.imread('img1.jpg')
if img is not None:img_partA = img[0:200,0:200] # ROI操作,img[h,w]# 本質是操作數組cv2.imshow('img1',img_partA)cv2.imshow('img2',img)cv2.waitKey(0)cv2.destroyAllWindows()
顏色通道提取
b,g,r = cv2.split(img) # 提取bgr
img = cv2.merge(b,g,r) # 通過bgr組合出一張圖像
只保留R通道顯示
img = cv2.imread("img1.jpg",cv2.IMREAD_COLOR)
b,g,r = cv2.split(img)
# 只保留R [h,w,c] c表示通道,根據bgr索引,b為0,g為1,r為2
cur_img = img.copy()
cur_img[:,:,0] = 0 # b通道清零
cur_img[:,:,1] = 0 # g通道清零
cv2.imshow("cur_img",cur_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
只保留G通道顯示
img = cv2.imread("img1.jpg",cv2.IMREAD_COLOR)
b,g,r = cv2.split(img)
# 只保留R [h,w,c] c表示通道,根據bgr索引,b為0,g為1,r為2
cur_img = img.copy()
cur_img[:,:,0] = 0 # b通道清零
cur_img[:,:,2] = 0 # r通道清零
cv2.imshow("cur_img",cur_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
只保留B通道顯示
img = cv2.imread("img1.jpg",cv2.IMREAD_COLOR)
b,g,r = cv2.split(img)
# 只保留R [h,w,c] c表示通道,根據bgr索引,b為0,g為1,r為2
cur_img = img.copy()
cur_img[:,:,1] = 0 # g通道清零
cur_img[:,:,2] = 0 # r通道清零
cv2.imshow("cur_img",cur_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
邊界填充
img = cv2.imread("img1.jpg",cv2.IMREAD_COLOR)
top_size,bottom_size,left_size,right_size = (50,50,50,50)# cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType) borderType為邊界填充類型
replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT101)
wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT,value=0)
數值計算
# 部分數值計算(如圖像融合)前提需要兩圖像shape值相同
img1 = cv2.imread("img1.jpg",cv2.IMREAD_COLOR)
img2 = cv2.imread("img2.jpg",cv2.IMREAD_COLOR)
img3 = img1 + 10 # 相當于3個通道中每一個像素數值都加10
img4 = img1 + img2 # 兩張圖像中每個像素的rgb三通道數值相加,# 以rgb888為例,如果一個像素的r相加后>255,則該數值等于相加后%255
img5 = cv2.add(img1,img2) # 兩張圖rgb相加,如果>255,則取最大值255
圖像融合
# 圖像融合前提需要兩圖像shape值相同
img1 = cv2.imread("img1.jpg",cv2.IMREAD_COLOR)
img2 = cv2.imread("img2.jpg",cv2.IMREAD_COLOR)# cv2.addWeighted(img1,img1權重,img2,img2權重,偏置項(整體提亮多少))
h2 = img2.shape[0]
w2 = img2.shape[1]
img1_new = cv2.resize(img1,(w2,h2))
res = cv2.addWeighted(img1_new,0.4,img2,0.6,0)
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()