OpenCV程式開發(II) 林道通 教授 多媒體技術與應用 5/16
OpenCV讀取影片 顯示一個視窗,顯示圖片在視窗中 # include→ <opencv/cv.h>與<opencv/highgui.h>與<stdio.h> 與<stdlib.h> 宣告一個CvCapture 型態的變數:Capture 並宣告成空的 宣告CvCapture 型態要記得釋放
OpenCV讀取影片 宣告一個char陣列來儲存欲讀取之影片之檔名 此時,我們要讀取的影片的檔名已經存在InputFileName裡 了,然後用cvCreateFileCapture function來載入影片到 Capture裡面 CvCapture* cvCreateFileCapture(const char* filename); filename:檔案名稱
OpenCV讀取影片 如果Capture沒有讀到欲讀取之影片,則印出開影片失敗的 文字訊息 例如:找不到圖片、檔名錯誤
OpenCV讀取影片 影片其實是連續的圖片,所以仍是要用IplImage來存影片,所 以要再宣告一個IplImage,並宣告成空的 要新創一個視窗來顯示CurrentFrame,有創視窗就要記得 Destroy
OpenCV讀取影片 使用 while 迴圈透過 cvQueryFrame function 將 frame一張一張讀出來。 IplImage* cvQueryFrame(CvCapture* capture) 並且使用 cvShowImage 將每張 frame 顯示在 Output window 上 這樣就可以將影片讀出來
OpenCV影片灰階化 在main宣告一個IplImage存灰階圖 在while迴圈內給GrayFrame跟CurrentFrame一樣的長寬 記得結束前要release GrayFrame
OpenCV影片灰階化 在while迴圈內,cvCreateImage之後 將CurrentFrame一個pixel一個pixel的讀出來,並一個pixel一個 pixel的寫入欲輸出的GrayFrame中
課堂練習:影片二值化 設閥值(threshold)為125: y>=125:設為255 y<125:設為0
OpenCV影片放大
OpenCV影片放大 在main宣告EnlargeFrame,並在while迴圈內實作影片放大 注意: EnlargeFrame為 CurrentFrame的兩倍大小 記得結束時要release EnlargeFrame 在main宣告EnlargeFrame,並在while迴圈內實作影片放大
OpenCV滑鼠事件 宣個一個onMouse function 四個參數分別代表: 事件回傳代號(int Event) 座標(int x,int y) flags代號(int flags) Mouse事件的代號名稱(param)
OpenCV滑鼠事件 一定要搭配一個callback function才能回傳指定視窗所發生的 滑鼠是件 cvSetMouseCallback(const char* windowName, CvMouseCallback onMouse, void* param=NULL) windowName = 滑鼠事件所監聽的視窗 onMouse = 滑鼠事件名稱
OpenCV滑鼠事件 在Global宣告兩個cvPoint結構Point1、Point2,並宣告一個全域變 數Mode來控制順序
OpenCV滑鼠事件 在onMouse Funtion中記錄座標值(兩點)
OpenCV滑鼠事件 event parameter: CV_EVENT_MOUSEMOVE Mouse movement CV_EVENT_LBUTTONDOWN Left button down CV_EVENT_RBUTTONDOWN Right button down CV_EVENT_MBUTTONDOWN Middle button down CV_EVENT_LBUTTONUP Left button up CV_EVENT_RBUTTONUP Right button up CV_EVENT_MBUTTONUP Middle button up CV_EVENT_LBUTTONDBLCLK Left button double click CV_EVENT_RBUTTONDBLCLK Right button double click CV_EVENT_MBUTTONDBLCLK Middle button double click
OpenCV畫框 在main 的while迴圈中加入mode==3的判斷式,使用cvRectangle function畫框 cvRectangle(CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int lineType=8, int shift=0) img = 欲畫框的影像 pt1, pt2 = 框的左上角與右下角 color = 框的顏色 thickness = 線的粗細 lineType = 線的形式
OpenCV切割ROI區域 在main宣告 int 變數 width, height, XMin, XMax, Ymin, YMax 及一張IplImage來存放切割下的畫面
OpenCV切割ROI區域 在mode==3的判斷式中 使用變數width, height來存切割畫面的寬高(要記得取絕對值), 得到寬高後就可以配置IplImage的大小
OpenCV切割ROI區域 接續上面,判斷Point1,Point2在X座標及Y座標的位置
OpenCV切割ROI區域 接續上面,將畫面從原本的CurrentFrame中切出來,存放在先 前宣告的CutFrame中,並show出來
OpenCV按R鍵重畫ROI區域 在KeyIn = cvWaitKey()之後,若使用者按下 r 或是 R,則將 Mode設為0即可重畫,記得把視窗Destory,這樣才不會看到上 一張的圖
OpenCV按S鍵儲存ROI區域 先在main宣告int counter來紀錄儲存張數 在KeyIn = cvWaitKey()之後,若使用者按下 s 或是 S,使用 cvSaveImage將CutFrame儲存下來 cvSaveImage(const char* filename, const CvArr* image) Filename = 儲存檔名 image = 欲儲存的影像
課堂練習:將ROI切割區域轉成二值化
Mosaic 馬賽克
Mosaic 馬賽克 在main function宣告一個影像 MosaicFrame 兩個變數 MosaicMode, MosaicParameters MosaicMode 記錄是否為馬賽克模式,預設0 MosaicParameters 為馬賽克影像mask大小
按下M鍵,啟用/取消 Mosaic 馬賽克 在KeyIn = cvWaitKey()之後,當使用者按下M或m 若MosaicMode=0,則改變MosaicMode=1,且將CutFrame 的寬高、深度給予MosaicFrame。 若MosaicMode=1,則改變MosaicMode=0,且release MosaicFrame且關閉視窗。
Mosaic 馬賽克 在if(mode==3)內,CutFrame之後 判斷 MosaicMode 是true或是false,使用mask由左至右、由 上至下給予MosaicFrame Pixel值
Mosaic 馬賽克
課堂練習:將框選起來的區域直接做馬賽克
HW:將ROI區域縮小+合併+上下顛倒