顯示具有 497511252 標籤的文章。 顯示所有文章
顯示具有 497511252 標籤的文章。 顯示所有文章

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為視窗大小。最重要的是網路上沒人提到這點...所以我們真的是...測試了很久才發現這錯誤...大概花了一下午。

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

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

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


影片:

課程回顧

學到蠻多好玩的東西,不像以前所想的一樣,視訊鏡頭只有為了視訊聊天室那樣而已,可以運用到很多東西上面,像老師給我們看的影片,還沒學的時候一開始覺得有點扯,不相信一個人可以做到這麼多功能,後來就覺得很多東西都有可能只是要看你會不會而已,網路上也很多人在做視訊的開發,所以自己去google時候就會看到很多神人的作品不然就是程式碼範例,每次做專題的時候就自己去學,雖然不是很懂,但至少會想去弄懂一個東西的感覺還不錯,我覺得做專題應該最好玩吧!!
就是學了很多東西下去做運用,這堂課讓我覺得我也有不少的創意,只是技術不夠好很多東西都做不好,學的東西再多一點的話我覺得可以做很多東西所以希望在學多一點。

HW10




















一人遊戲變成兩個人可以玩了,在做這次作業的時候我想到兩人玩的遊戲大概是剪刀石頭布,不過還蠻難做出來的吧,因為不會判斷形狀,現在學到的只游找顏色跟x,y的值而已,所以不好做。

HW09












這次是做畫出左右平均的線跟最高的線,繪畫的功能是前面就有學到的,平均值也是前面延伸出來的,所以不會很難。

HW08

















這次學到的東西可以用在更多應用了,不用特地去寫一個小方塊去找顏色,而且是要在人動的時候才有反應,不過這個跟判斷顏色的功能去做的話可以做很多好玩的東西,相信期末專題應該很精彩。



HW05












一開始看到老師可以隨便找個有顏色的東西當畫筆,很新奇,最後自己寫的時候感覺是前面的延伸,所以學的是要懂得把學到的東西自延伸,這樣才知道到底自己有沒有學會。

2010年5月9日 星期日

期中專題 : 圖片瀏覽器

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


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



遇到的困難:

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

心得:

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

2010年3月28日 星期日

期中專題

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

2010年3月27日 星期六

HW04












上禮拜看到老師做出來的成品,可以拿一顆球畫你想要圖形,這裡禮拜終於學到了一點點,畫面分割變顏色,變數的條件改一改就好,不過我覺得厲害的是可以抓取顏色,但是抓取的顏色是裡面定死的,不過門檻值也要設好,不然整個畫面很搞笑,畫圖超好玩不過我不知道要畫啥,所以頭跟身體晃一晃就變這樣,今天怎麼這麼剛好,全身黑。



#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "stdio.h"


#define alpha 0.5

int main( int argc, char** argv )
{
//聲明 IplImage
IplImage* pImg = NULL;
IplImage* blue = NULL;
IplImage* green = NULL;
IplImage* red = NULL;
IplImage* logoImg = NULL;
IplImage* mergeImg = NULL;
CvCapture *capture;


int x1 = 0;
int y1 = 0;

capture=cvCreateCameraCapture( 0 );
logoImg=cvLoadImage("logo.jpg");
cvFlip(logoImg,0,0);

//創建視窗
cvNamedWindow("src", 1);
cvNamedWindow("blue", 1);
cvNamedWindow("green", 1);
cvNamedWindow("red", 1);
cvNamedWindow("Image with Logo", 1);
while(1)
{

x1+=10;
pImg=cvQueryFrame(capture);

//為圖像申請空間
cvFlip(pImg,0,0);

blue = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 3);
green = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 3);
red = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 3);

mergeImg = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 3);


for (int y=0; yheight; y++) {
uchar* ptr1=(uchar*) (pImg->imageData +y*pImg->widthStep);
uchar* ptr2=(uchar*) (blue->imageData +y*blue->widthStep);

for (int x=0; xwidth; x++) {
ptr2[3*x]=ptr1[3*x];
ptr2[3*x+1]=0;
ptr2[3*x+2]=0;
}
ptr2=(uchar*) (green->imageData +y*green->widthStep);
for (int x=0; xwidth; x++) {
ptr2[3*x]=0;
ptr2[3*x+1]=ptr1[3*x+1];
ptr2[3*x+2]=0;
}

ptr2=(uchar*) (red->imageData +y*red->widthStep);
for (int x=0; xwidth; x++) {
ptr2[3*x]=0;
ptr2[3*x+1]=0;
ptr2[3*x+2]=ptr1[3*x];
}

}
// 顯示圖像



cvFlip(pImg,0,0);



if( (logoImg->height + y1) <>height) {
mergeImg=cvCloneImage(pImg);
for (int y=0; yheight; y++) {
uchar* ptr3=(uchar*) (logoImg->imageData +y*logoImg->widthStep);
uchar* ptr4=(uchar*) (mergeImg->imageData +(y+y1)*mergeImg->widthStep);
for (int x=0; xwidth; x++) {
ptr4[3*(x+x1)]=alpha*ptr3[3*(x)] + (1-alpha)*ptr4[3*(x+x1)];
ptr4[3*(x+x1)+1]=alpha*ptr3[3*(x)+1] + (1-alpha)*ptr4[3*(x+x1)+1];
ptr4[3*(x+x1)+2]=alpha*ptr3[3*(x)+2] + (1-alpha)*ptr4[3*(x+x1)+2];
}
}
}

cvShowImage( "src", pImg );
cvShowImage( "blue", blue );
cvShowImage( "green", green );
cvShowImage( "red", red );

cvShowImage( "Image with Logo", mergeImg );


cvWaitKey(2); //等待按鍵








}

//釋放圖像
cvReleaseImage( &pImg );
cvReleaseImage( &blue );
cvReleaseImage( &green );
cvReleaseImage( &red );
cvReleaseImage( &mergeImg );



//銷毀視窗
cvDestroyWindow( "src" );
cvDestroyWindow( "blue" );
cvDestroyWindow( "green" );
cvDestroyWindow( "red" );
cvDestroyWindow( "Image with Logo" );

}

HW03












一開始做那三個顏色跟+一個LOGO,感覺只要懂函式在做啥事情就好,不過就算寫好了,compiler還是錯,因為忘記載圖片跟沒插視訊,怎麼弄都不會過,顯然是腦袋還沒清醒,所以移動LOGO做了很久還是失敗,但是回家後慢慢想一下,其實很簡單,只要跑回圈的時候改一下變數X1或Y1就可以了,不過問題又出現了,移動的不是圖片,而是一個跟圖片一樣大小的框框,後來還是因為函式裡沒設好的關西,到最後弄了很久終於弄好了。

2010年3月7日 星期日



















































心得 :
開始感覺到自己查資料的成就感,不過還是有點困難,所以還是互相討論出來的,圖片的變大變小,圖片變灰諧黑白,還有改一改變數會有不同的效果cvCreatImage()才是重點,不管要怎麼做效果,都要釋放空間給圖片或視訊使用。


#include "cv.h"
#include "cxcore.h"
#include "highgui.h"

int main( int argc, char** argv )
{
//聲明 IplImage
IplImage* pImg = NULL;
IplImage* pImg2 = NULL;
IplImage* gray = NULL;
IplImage* bw = NULL;
IplImage* pCannyImg = NULL;
IplImage* pImg3 = NULL;


//載入圖像,強制轉化為Gray

pImg=cvLoadImage("fruits.jpg");


//為圖像申請空間

pImg2 = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 3);

pImg3 = cvCreateImage(cvSize(pImg->width*3.14,pImg->height*3.14), IPL_DEPTH_8U, 3);
cvResize(pImg, pImg3);
gray = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 1);

bw = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 1);

pCannyImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);

//cvCvtColor彩色轉灰階
cvCvtColor(pImg, gray, CV_BGR2GRAY);

//cvThreshold灰階轉黑白
cvThreshold( gray, bw, 63, 255, CV_THRESH_BINARY );

cvThreshold( pImg, pImg2, 127, 255, CV_THRESH_BINARY );


//canny邊緣檢測
cvCanny(gray, pCannyImg, 50, 150, 3);






//創建視窗
cvNamedWindow("src", 1);
cvNamedWindow("src2",1);
cvNamedWindow("blackwhite", 1);
cvNamedWindow("gray",1);
cvNamedWindow("canny",1);
cvNamedWindow("pImg31",1);

//顯示圖像
cvShowImage( "src", pImg );
cvShowImage( "src2", pImg2 );
cvShowImage( "gray", gray );
cvShowImage( "blackwhite", bw );
cvShowImage( "canny", pCannyImg );
cvShowImage( "pImg31", pImg3 );
cvWaitKey(0); //等待按鍵

//銷毀視窗
cvDestroyWindow( "src" );
cvDestroyWindow( "src2" );
cvDestroyWindow( "canny" );
cvDestroyWindow( "blackwhite" );
cvDestroyWindow( "gray" );
cvDestroyWindow( "pImg31" );
//釋放圖像
cvReleaseImage( &pImg );
cvReleaseImage( &pImg2 );
cvReleaseImage( &gray);
cvReleaseImage( &bw );
cvReleaseImage( &pCannyImg );
cvReleaseImage( &pImg3 );
}





2010年2月28日 星期日

HW01




心得 ,

一開始用blogger很不習慣,一直問旁邊的同學,不過我覺得Webcam滿好玩的,看到自己的蠢樣出現在螢幕上感覺很好笑,旁邊的神手把程式裡的參數隨便改一下,畫面變成可以隨意拖拉放大,雖然才第一堂課不過感覺還真有趣。



#include
#include
#include
#include


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(5);
}

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