python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框
最近因?yàn)橐獙?shí)現(xiàn)模板匹配,需要在視頻中選中一個(gè)目標(biāo),然后框出(即作為模板),對(duì)其利用模板匹配的方法進(jìn)行檢測(cè)。于是需要首先選出視頻中的一幀,但是在利用攝像頭讀視頻的過(guò)程中我唯一能想到的方法就是:
1.在視頻播放的過(guò)程中,當(dāng)想選中哪幅圖來(lái)標(biāo)記目標(biāo)時(shí),按下暫停鍵。
2.框出你想要檢測(cè)的目標(biāo)。
那要怎么實(shí)現(xiàn)呢?
首先是暫停怎么實(shí)現(xiàn)呢?介于是攝像頭直播,我們先將那副圖像復(fù)制并在另一個(gè)窗口顯示。然后關(guān)掉攝像頭,就完成了暫停。后面標(biāo)記完目標(biāo)再打開(kāi)攝像頭就行了。那具體怎么實(shí)現(xiàn)呢...
import cv2drawing = False ix, iy = -1, -1 tempFlag = False def draw_circle(event, x, y, flags, param):global ix, iy, drawing, mode, cap, template, tempFlagif event == cv2.EVENT_LBUTTONDOWN:tempFlag = Truedrawing = Trueix, iy = x, y #按下鼠標(biāo)左鍵,用全局變量ix,iy記錄下當(dāng)前坐標(biāo)點(diǎn)elif event == cv2.EVENT_LBUTTONUP:if drawing == True:drawing = False #鼠標(biāo)左鍵抬起,畫(huà)出矩形框cv2.rectangle(frame, (ix, iy), (x, y), (0, 255, 0), 1)template = frame[iy:y, ix:x, :] #截取框中的目標(biāo)圖像cap = cv2.VideoCapture(-1) #打開(kāi)攝像頭cv2.imshow('img', frame) #顯示畫(huà)框后的圖像 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: #如果框出了目標(biāo),顯示該目標(biāo)cv2.imshow('temp', template)k = cv2.waitKey(33)if k == 27: #退出視頻breakelif k == 32: #如果按下空格鍵while(1):cap.release() #關(guān)掉攝像頭imgCOPY = frame #顯示關(guān)閉攝像頭前最后一張圖像cv2.imshow('img', frame)k = cv2.waitKey(0) #等待調(diào)用鼠標(biāo)回調(diào)函數(shù)框出目標(biāo)if k == 32: #框完目標(biāo),再次按下空格鍵,攝像頭捕捉的畫(huà)面重新播放break
結(jié)果如圖
對(duì)于在圖像中框出目標(biāo),其實(shí)我先看了網(wǎng)上的代碼,比如http://blog.csdn.net/szfhy/article/details/51087301
我畫(huà)框后的圖片是這樣的
內(nèi)心是崩潰的,寶寶就只想要一個(gè)矩形框嘛~
本來(lái)我是想在畫(huà)矩形框時(shí),有一個(gè)矩形框隨鼠標(biāo)拖動(dòng)大小隨之改變,且只有一個(gè)矩形框,鼠標(biāo)抬起時(shí),矩形框確定。暫時(shí)不知怎么實(shí)現(xiàn),有知道的可以交流一下,嘿嘿~
轉(zhuǎn)載于:https://www.cnblogs.com/subic/p/6937611.html
總結(jié)
以上是生活随笔為你收集整理的python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 乌镇学生证检查严格吗
- 下一篇: 直接在sublime中运行php