介紹
因爲我是一個小白,所以代碼就比較簡單,如果有錯誤,希望大家可以評論下告訴我,感激。
效果
藍色框框是我們要截下的圖
這是截完後的圖
代碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
i = w = h = f1 = f2 = ew = eh = 0
def cut(event, x, y, flags, param):
global i,w,h, f1,f2,ew,eh
img = 0
#這一個if的作用是,當鼠標左鍵按下,記錄開始的位置
if event == cv2.EVENT_LBUTTONDOWN:
f1 = 1
h = x
w = y
print("w = ", w, "h = ", h)
#這一步的作用是當鼠標滑動時,並且左鍵是按下的時候,就畫一個框框,並且記錄左後一個位置
if event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
img = frame.copy()
cv2.rectangle(img, (h,w), (x,y), (255,0,0),5)
cv2.imshow("frame", img)
f2 = 1
eh = x
ew = y
#當執行了以上的兩步時候,並且左鍵是鬆開的,就可以進行截出一張圖片。
if f1 == 1 and f2 == 1 and event == cv2.EVENT_LBUTTONUP:
#下面兩個if是向各個方向上截圖的考慮
if ew < w:
w,ew = ew,w
if eh < h:
eh,h = h, eh
i += 1
f1 = f2 = 0
img = frame[w:ew, h:eh]
path = "C:/test2/" + "%d"%i+".jpg"
cv2.imwrite(path,img)
#這時創建一個對像
cap = cv2.VideoCapture("C:/test2/bbb.mp4")
#這是命名一個窗口,與下面的鼠標結合,鼠標會在這個窗口中產生效果
cv2.namedWindow("frame",cv2.WINDOW_NORMAL)
cv2.setMouseCallback("frame",cut)
while True:
#讀取圖片
ret, frame = cap.read()
if ret == False:
break
cv2.imshow("frame", frame)
#如果輸入'c',就進行切割。
if cv2.waitKey(10) == ord("c"):
cv2.waitKey(0)
if cv2.waitKey(10) == ord('q'):
break
注意
x,y和 w,h, 的不同,x 代表的圖像的列,y是代表着行
frame[w:ew, h:eh]這個先是行,再是列。