1. 程式人生 > >python+opencv選出視頻中一幀再利用鼠標回調實現圖像上畫矩形框

python+opencv選出視頻中一幀再利用鼠標回調實現圖像上畫矩形框

open cap 圖像 ide http 這樣的 vedio lease 等待

  最近因為要實現模板匹配,需要在視頻中選中一個目標,然後框出(即作為模板),對其利用模板匹配的方法進行檢測。於是需要首先選出視頻中的一幀,但是在利用攝像頭讀視頻的過程中我唯一能想到的方法就是:

1.在視頻播放的過程中,當想選中哪幅圖來標記目標時,按下暫停鍵。

2.框出你想要檢測的目標。

那要怎麽實現呢?

首先是暫停怎麽實現呢?介於是攝像頭直播,我們先將那副圖像復制並在另一個窗口顯示。然後關掉攝像頭,就完成了暫停。後面標記完目標再打開攝像頭就行了。那具體怎麽實現呢...

import cv2

drawing = False
ix, iy = -1, -1
tempFlag = False
def draw_circle(event, x, y, flags, param): global ix, iy, drawing, mode, cap, template, tempFlag if event == cv2.EVENT_LBUTTONDOWN: tempFlag = True drawing = True ix, iy = x, y #按下鼠標左鍵,用全局變量ix,iy記錄下當前坐標點 elif event == cv2.EVENT_LBUTTONUP:
if drawing == True: drawing = False #鼠標左鍵擡起,畫出矩形框 cv2.rectangle(frame, (ix, iy), (x, y), (0, 255, 0), 1) template = frame[iy:y, ix:x, :] #截取框中的目標圖像 cap = cv2.VideoCapture(-1) #打開攝像頭 cv2.imshow(img, frame) #顯示畫框後的圖像
cv2.namedWindow(img) cv2.setMouseCallback(img, draw_circle) cap = cv2.VideoCapture(-1) while (True): ret, frame = cap.read() cv2.imshow(Vedio, frame) if tempFlag == True: #如果框出了目標,顯示該目標 cv2.imshow(temp, template) k = cv2.waitKey(33) if k == 27: #退出視頻 break elif k == 32: #如果按下空格鍵 while(1): cap.release() #關掉攝像頭 imgCOPY = frame #顯示關閉攝像頭前最後一張圖像 cv2.imshow(img, frame) k = cv2.waitKey(0) #等待調用鼠標回調函數框出目標 if k == 32: #框完目標,再次按下空格鍵,攝像頭捕捉的畫面重新播放 break

結果如圖

技術分享技術分享技術分享

對於在圖像中框出目標,其實我先看了網上的代碼,比如http://blog.csdn.net/szfhy/article/details/51087301

我畫框後的圖片是這樣的

技術分享

內心是崩潰的,寶寶就只想要一個矩形框嘛~

本來我是想在畫矩形框時,有一個矩形框隨鼠標拖動大小隨之改變,且只有一個矩形框,鼠標擡起時,矩形框確定。暫時不知怎麽實現,有知道的可以交流一下,嘿嘿~

python+opencv選出視頻中一幀再利用鼠標回調實現圖像上畫矩形框