顯示具有 溫祥麟 標籤的文章。 顯示所有文章
顯示具有 溫祥麟 標籤的文章。 顯示所有文章

2010年6月13日 星期日

期末專題 - 瑪莉豆

介紹:
是一個利用捲軸移動的遊戲,畫面會一直向右移動,途中會有障礙物,遊戲者必須要在鏡頭前面跳躍,讓小豆子在遊戲裡面可以成功躍起閃躲障礙物,以抵達終點。

動機:
由於其中專案不是屬於遊戲型的程式,所以在評分時乏人問津。所以在這次期末專案我們決定換到遊戲型的方式來做。在一切的開始時對於要做什麼毫無想法,然而之前在電腦教室看到有人在玩"瑪莉貓"這款韓國製的遊戲,所以就想到了能不能把瑪莉歐這遊戲改成用視訊鏡頭來做,於是我們就開始了我們的計畫。

過程:
後來發現想法其實跟加分題差不多...,只是我並沒有想到把它改成鍵盤訊息,所以動作的執行是我們自己寫,遊戲背景也是我們自己畫,所以真的是遇到相當多的問題。例如最一開始是如何讓畫面用捲軸式的方式移動,我們googel搜尋也找不到,花了一整天的時間,最後上PTT的板上發問,才有人回答我們的問題

smallImg=cvCreateImage(cvSize(xwindows,ywindows),IPL_DEPTH_8U,3);
cvResetImageROI(bigImg);
cvSetImageROI(bigImg,cvRect(x,y,xwindows,ywindows));

這是我們找到的函數,xwindows還有ywindows為小視窗的視窗大小,設定x,y為0然後設定x++。我們遇到的最大問題點是...一開始我們cvSetImageROI是這樣寫的

cvSetImageROI(bigImg,cvRect(x,y,x+xwindows,ywindows));

認為前面xy為視窗左上點後面xy視窗為右下點,所以理所當然的後面的x座標要鍵入x+xwindows,然而卻錯了,因為這函數應該是前面xy為定位視窗的左上角用,右邊的xy為視窗大小。最重要的是網路上沒人提到這點...所以我們真的是...測試了很久才發現這錯誤...大概花了一下午。

再來跳躍如何讓角色跳起落下有感覺,因為如果沒有讓他有連續動作的感覺,跳起來會像是突然浮空然後瞬間回到地板,而不是跳起來。這個也花了好幾個小時。

以上只是舉其中兩個問題,因為遇到很多困難,沒有時間做,最後就捨棄了瑪莉歐變成了...類似一種障礙賽的東西...

如果早點知道有鍵盤訊息這種東西的話...應該就做得出來了。


影片:

課程回顧

這門課學到什麼 ?


日子過很快,從第一次接觸視訊處理到現在已經可以完成一個專題了,到底學到什麼呢?如果以實際面來說應該是技術吧,但我想最大的收穫可能不是技術,因為在做專題時,大家同樣是花了很多時間,學了很多技術,只是最後評選的時候,就差在那樂趣性,最高分的不代表最難做,只是最平易近人而已。


最喜歡的HOMWORK ?

第一個作業,完全沒有壓力,相當開心的學習


對這門課有什麼建議?

對於這門課的建議我也不知道耶。可能是老師給的範例可以多打一些註解嗎?有時候會看不懂一些地方在做什麼。然後延伸的題目感覺跟原本的差好多,一開始還好,後來就愈來愈難了。

2010年5月9日 星期日

HW09

兩條線+上

期中專題 : 圖片瀏覽器

介紹:
利用視訊鏡頭,將特定顏色的標的物放入指定區域,使其
感應該顏色,使顏色物體成為指標,當指標移動至左右區域,則圖片
將會切換成上下一張圖片。


動機:
一開始對於專題的主題沒有什麼方向,不想要與別組相同的使用方
式,利用遊戲來呈現視訊處理,卻又不知道該做什麼。然而靈光一閃
,突然有感於現代觸控手機的便利性,手指頭動一動便可以做到移動
照片瀏覽的功能,於是想到了利用視訊鏡頭偵測手指移動來控制照片
瀏覽,製作成圖片瀏覽器。



遇到的困難:

當初我跟憲哥兩個人是花了很長一段時間在構思,想了很
久之後,才動手下去寫的,所以遇到的困難大多都是在思考層面的。
例如,當初我們為了如何判斷下一張而想了一個星期左右的時間,一
開始我提說用速度來判斷,而其實這樣似乎相當不方便,而且手晃一
下或什麼的就沒了。後來憲哥提議說使用距離來判斷,這種方式聽起
來似乎不錯,但還有一個缺點就是,如何判斷從哪裡開始?起始點在
哪裡?結束點?這樣又要多增加幾個判斷的區域,也更容易失準。後
來想了很久之後,決定使用只要指標移動到右邊與左邊,就切換上下
張,這樣也比較簡單明瞭,等以後學到了更多精準的判斷方式,再來
改進。
寫出來後,一開始只要一把指標移動到左右兩邊,它就會當
掉,我們很納悶,到底是哪一個環節出了問題?code沒問題,debug
很久,照理說裡面的程式碼,沒有使用到我們看不懂的程式,邏輯上
也沒出問題,最後忘記是我還憲哥突然想到,應該要在切換下一張的
時候增加一個延遲時間,否則當指標移動到那區域,它就會以程式的
最快速度移動到上下張。這樣一改之後,終於可以切換上下張了,只
是...每次切換到第三張照片就擋掉了,這又是一個百思不得其解的問
題,大概又看程式碼一個小時之後,愚蠢的兩人才發現...是解析度不
夠的問題,照片太大了,視窗沒開這麼大,於是就當掉了,好在後來
改完之後,一切都好了!

心得:

這次寫出來最悶的就是...這不是遊戲,所以在DEMO的時
候乏人問津,而且功能也挺小的,以後希望可以加大,比如多點偵測,
圖片放大縮小,與遊戲結合等等的。

2010年3月28日 星期日

期中專題

組員:林昇憲 溫祥麟
主題 : 瀏覽器
手指移動後可以換下一張相片.等等

2010年3月7日 星期日

HW02: Image-Level Processing in OpenCV

How many colors in the pImg2 image?

經過老師的講解之後

G=0 or 255
B=0 or 255
R=0 or 255

所以是2的3次方為8種顏色

----------------------------------------------




-----------------------------------------------



這是放大後~~~~~

--------------------------------------------------------------------

以下是我的code
#include
#include
#include
#include


int main( int argc, char** argv )
{
CvCapture *capture;
IplImage *frame;
capture=cvCreateCameraCapture( 0 );


IplImage *frame6 = 0; //源圖像指針
IplImage *frame5 = 0; //目標圖像指針
double scale = 3.14; //縮放倍數為0.618倍
CvSize frame5_cvsize; //目標圖像尺寸

IplImage* frame1 = NULL;
IplImage* frame2 = NULL;
IplImage* frame3 = NULL;
IplImage* frame4 = NULL;
cvNamedWindow("Webcam1",1);
cvNamedWindow("Webcam2",1);
cvNamedWindow("Webcam3",1);
cvNamedWindow("Webcam4",1);
cvNamedWindow("Webcam5",1);
while(1)
{
frame1 = cvQueryFrame(capture);



frame2 = cvCreateImage(cvSize(frame1->width,frame1->height), IPL_DEPTH_8U, 1);
frame3 = cvCreateImage(cvSize(frame1->width,frame1->height), IPL_DEPTH_8U, 1);
frame4 = cvCreateImage(cvGetSize(frame1), IPL_DEPTH_8U, 1);

cvFlip(frame1,0,0);
cvCvtColor(frame1, frame2, CV_BGR2GRAY);
cvFlip(frame1,0,0);
cvThreshold( frame2, frame3, 128, 255, CV_THRESH_BINARY );
cvCanny(frame2, frame4, 50, 150, 3);

frame5_cvsize.width = frame1 ->width * scale; //目標圖像的寬為源圖象寬的scale倍
frame5_cvsize.height = frame1 ->height * scale;
frame5 = cvCreateImage( frame5_cvsize, frame1->depth, frame1->nChannels);
cvResize(frame1, frame5, CV_INTER_LINEAR);


cvShowImage("Webcam1", frame1);
cvShowImage("Webcam2", frame2);
cvShowImage("Webcam3", frame3);
cvShowImage("Webcam4", frame4);
cvFlip(frame5,0,0);
cvShowImage("Webcam5", frame5);
cvWaitKey(10);
}

cvReleaseCapture(&capture);

cvDestroyWindow("Webcam1");
cvDestroyWindow("Webcam2");
cvDestroyWindow("Webcam3");
cvDestroyWindow("Webcam4");
cvDestroyWindow("Webcam5");
}
---------------------------------------------------------------------
心得

上次為了放大圖片,去google了一堆網站,但是每一個都非常的長,長到我看不太懂,
後來終於在一個網站上找到了簡單的code,於是就用在這上面了!!!!話說這心得是一個星期後打的,很多東西都忘記了....。

2010年2月28日 星期日

HW01: Capture video from WebCam






心得:
第一次使用這個東西覺得很新鮮,只是一開始使用DEV-C++找不到編譯在哪裡,真是嚇死我也!想說是不是自己下載的東西出了什麼問題咧!然後...照片怎麼照都很瞎。


這是剛剛找到的東西


cvNamedWindow 創建視窗 int cvNamedWindow( const char* name, int flags=CV_WINDOW_AUTOSIZE ); name 視窗的名字,它被用來區分不同的視窗,並被顯示為視窗標題。

flags 視窗屬性標誌,為1時表示會根據圖像自動調整視窗大小。目前唯一支持的標誌是CV_WINDOW_AUTOSIZE。當這個標誌被設置後,用戶不能手動改變視窗大小,視窗大小會自動調整以適合被顯示圖像。


參考網址 http://yester-place.blogspot.com/2008/06/gui.html





int main()
{
CvCapture *capture;
IplImage *frame;

capture=cvCreateCameraCapture(0);
cvNamedWindow("Webcam",0);
cvNamedWindow("Webcam1",0);
cvNamedWindow("Webcam2",0);
cvNamedWindow("Webcam3",0);
cvNamedWindow("Webcam4",0);
while(1)
{
frame = cvQueryFrame(capture);
cvShowImage("Webcam", frame);
cvShowImage("Webcam1", frame);
cvShowImage("Webcam2", frame);
cvShowImage("Webcam3", frame);
cvShowImage("Webcam4", frame);
cvWaitKey(10);
}

cvReleaseCapture(&capture);
cvDestroyWindow("Webcam");
}

開五個也沒有問題呢....
隔壁同學開10個...也沒有問題呢...

下次再來玩玩看加一堆特效XDDD

--------------------------------------------------------------------------
這是後來玩的,
因為先開了一堆視窗,
然後發現鏡面特效
哈哈哈
int main()
{
CvCapture *capture;
IplImage *frame;

capture=cvCreateCameraCapture(0);
cvNamedWindow("Webcam",1);
cvNamedWindow("Webcam1",1);
cvNamedWindow("Webcam2",1);
cvNamedWindow("Webcam3",1);
while(1)
{
frame = cvQueryFrame(capture);
cvShowImage("Webcam", frame);
cvFlip( frame, frame, 0 );
cvShowImage("Webcam1", frame);
cvFlip( frame, frame, 1 );
cvShowImage("Webcam2", frame);
cvFlip( frame, frame, 0 );
cvShowImage("Webcam3", frame);
cvWaitKey(10);
}
cvReleaseCapture(&capture);
cvDestroyWindow("Webcam");
}

cvFlip( frame, frame, 1 ); <===1是上下相反 0是左右相反