2013年1月8日 星期二

期末project

主題:戒指試戴

DEMO影片:

未來目標:
希望可以在Webcam同步的執行,而不是偏向靜態的模式。

2013年1月7日 星期一

期末project,第二組

題目:視訊馬賽克變換裝置



運用方法:

DEV C的環境裡,運用opencv 人臉偵測函式,搭配上課所學的 canny函式做邊緣偵測抓出人臉,並對自己想要的區塊設置ROI,並對ROI做馬賽克處理,再貼回視訊畫面中,同時我們還可偵測多個人臉並處理。


執行畫面:


  • 人臉偵測畫面

















  • 打馬賽克後畫面(單人)










  • 打馬賽克後畫面(多人)

 

未來期望:

有機會的話,希望能做些延伸應用, 感覺有點小單調。


DEMO影片:

http://youtu.be/DD0KMkpzPwE



2013年1月6日 星期日

期末PROJECT 第十組 接水珠小遊戲

遊戲規則

1.空中會噴出許多水球,畫面中會有方塊會讓水球改變方向
2.以雙手去補足黑色方塊的位置,讓水球可以正確地流至灰色的終點
3.根據所接到的水球來決定得分以及過關判定條件。

圖示
水珠在上方集中噴撒之後往四方移動,錯過了紫色線條

必須放上自己的手去接住水珠,才可以導引水珠到正確的終點
使用的技術 
1.以判斷畫面中是否有物體在那邊有的話就當做水平反射
2.水流的判定,考慮將水流做成大量的小球,每一個小球物件都有他的生命值。
3.物件的碰撞判定,考慮套用openCV的繪圖功能

製作過程
首先是畫面中的藍色軌跡,作一個迴圈去製造1000個小圓形,並且讓這些小圓形一次隨機亂噴。
每一個圓形是一個class作出來的,有幾個重要的值如下:
目前的位置ballStartX[1000]和ballStartY[1000]
向量為ballVectorX[1000]和ballVectorY[1000]
遊戲中的摩擦力以及反彈力因為怕永無止盡 所以改成碰撞之後有耗損,每次反彈都會剩下原來的0.6~0.8倍。
進入到終點線的範圍後 生命值(wBall[1000].live = 0)
球就不會再進行運算,並且消失

DEMO影片

                                  


2013年1月5日 星期六

期末project,第四組


題目:視訊小畫家
簡介:一般視訊較為乏味,邊視訊邊畫小畫家,可以增添許多趣味性,功能是滑鼠左鍵畫筆,滑鼠右鍵是填滿。
程式碼介紹:

#include<highgui.h>
#include<cv.h>
IplImage * img;
IplImage * frame;
IplImage * combine;
void mymouse(int event, int x, int y, int flag, void* param)//滑鼠事件函式
{
static int oldx, oldy, now_down=0;
if(event==CV_EVENT_RBUTTONDOWN){ //滑鼠右鍵按下
cvFloodFill(img, cvPoint(x,y), cvScalar(0,255,255));
}
if(event==CV_EVENT_LBUTTONDOWN){ //滑鼠左鍵按下
oldx=x;oldy=y;
now_down=1;
}
if(event==CV_EVENT_LBUTTONUP){ //滑鼠左鍵放開
now_down=0;
}
if(event==CV_EVENT_MOUSEMOVE && now_down==1){ //滑鼠移動
cvLine(img, cvPoint(x,y), cvPoint(oldx, oldy), cvScalar(255,255,255), 5);
oldx=x;oldy=y;//line畫線、point抓取滑鼠移動的座標
}
cvAdd(img, frame, combine, NULL);
cvShowImage("小畫家", combine);
cvShowImage("pen", img);
}
int main()
{
CvCapture * cap = cvCreateCameraCapture(0);//抓取視訊
frame = cvQueryFrame(cap);
img = cvCloneImage(frame);//clone(frame)將frame連記憶體一起複製
cvSet(img, cvScalar(0,0,0));
combine = cvCloneImage(img);
cvShowImage("小畫家", combine);
cvSetMouseCallback("小畫家", mymouse);
while(1){
frame = cvQueryFrame(cap);
cvShowImage("frame", frame);
cvAdd(img, frame, combine, NULL);
cvShowImage("小畫家", combine);
int key=cvWaitKey(33);
if(key==27)break;
}
cvReleaseCapture(&cap);
return 0;
}

未來發展:未來可以加上偵測手指可直接使用手指繪畫,畫筆可換顏色、粗細......等,且可以加入文字方塊之類的,這樣就可以變得更有趣




DEMO影片



期末project,第六組

題目:復仇者聯盟之角色扮演
介紹:藉由視訊鏡頭抓到人臉,程式裡面有三個面具,分別為蝙蝠俠、蜘蛛人、美國隊長,利用滑鼠,選擇所想要戴的面具,就可以將自己換成所想要的角色。

程式部分說明:


滑鼠(int event, int x, int y, int flag, void* param)
{
If(判斷滑鼠位置){
if(判斷按鍵狀態){
讀入對應的選單圖片;
}
}
}
畫選單介面()
{
    cvRectangle(img,cvPoint(10   ,370),cvPoint(100,470),cvScalar(0,0,r1),3);
    cvRectangle(img,cvPoint(105 ,370),cvPoint(200,470),cvScalar(0,0,r2),3);
    cvRectangle(img,cvPoint(205 ,370),cvPoint(280,470),cvScalar(0,0,r3),3);
}
面具圖片
cvRectangle
(img,cvPoint(10,370),cvPoint(100,470),cvScalar(0,255,255),3);
cvSetImageROI
(img, cvRect(center.x-130,center.y-200,250,250));
cvResize(mask1,img);
cvSetImageROI(img, cvRect(0,0,800,800));

主函式
{
開視訊;
載入人臉分類器;
讀入面具圖片;
畫選單介面();
滑鼠事件();
}

截圖:

















影片連結: http://www.youtube.com/watch?v=vacI2-MW-sI&feature=youtu.be

問題與討論:
在這個期末作業中,雖然面具可以成功地跟到人的臉,但是面具的圖片,在Open CV中還沒能做到去背的效果。 未來要研究出利用遮罩的方式,分別將每個圖片去背,讓面具更具真實性。而且目前圖片的大小是固定的,無法依照不同人臉的大小,或是距離鏡頭的遠近作縮放處理,值得研究討論。

期末project,第九組

拍照趣 - 以手指偵測拍照 

以膚色偵測判定指尖位置
偵測手指頂端左上角的位置

利用webcam當照相機
顯示的畫面會有拍照及切換R. G. B. 灰階的區塊 
當手碰觸區塊會拍照或切換R. G. B. 灰階

Demo畫面截圖:





  YouTube連結:


期末專題,第12組

  專題構想:
  川劇變臉,一直是中國民俗文化的一個代表,他是在劇情的表演當中,迅速的替換面具,而這門功夫並非短時間內就學得成的,然而在這學期的視訊分析課程中我們學到了比數位影像還要更為進階的知識與技術,所以我們想說把川劇變臉的效果以視訊分析的技術來呈現,希望能達到我們預期的效果。

執行方式:
(1)開啟操作視訊視窗、使用者臉部瞄準視窗 :
(2)使用者臉部移動至正確位置
(3)ASDFG五個鍵作面具的切換
(4)選擇一面具並長按按鍵,畫面及可暫停
(5)按下Esc鍵儲存圖片至來源資料夾