1. What is your favorite homework?
我最喜歡的作業是期末專案,這個專案題目是我和另一位組員一起討論出來的,原本的構想是可以方便人們節省時間快速的試戴眼鏡,首先我們構想了眼鏡所放置的位置,原本想要放置在人像上方,可是發現放在上方眼鏡的因為長度無法所以無法放置太多副眼鏡,因此我們決定將眼鏡放置在左方,並且以紅線作為分隔線。而最大的困難是如何將手做眼鏡選擇的觸控,這時我們請教了劉家維同學,他告訴我們可以以紅線做測作為偵測範圍,然後以膚色的最高點做偵測點,我們設定停滯兩秒做選擇以免會在滑過時發生錯誤選擇。這一次的期末展出,大家同心協力,同時我很感謝劉家維同學的幫助讓我們順利完成專案。
2. What did you learn in this course?
其實在這堂課程個人覺得學習到了不少,因為我對於寫程式有蠻大的障礙和'恐懼,老師所上的課程對我來說又是非常的有趣,尤其是期中過後的open c-v,我覺得可以做視訊的互動,並且做些不同的改變,如:放置相框,改變顏色,染頭髮,虛擬滑鼠等,都非常的有趣,而真正減輕我對於程式的壓力是,老師教我們已有範例程式,透徹的了解程式就能做充分運用。如果要我回想最大的收穫,應該是讓我感覺到原來程式碼也可以這麼有趣。尤其在專案展出時,看到不同組別的實品,大家都發揮極大的想像力,讓我大開眼界,真的很有趣。
3. What did you change after this course?
這堂課我不敢說自己有百分百的努力,但每每遇到我不了解的程式碼,我就會請教同學,也花了一部份的心血在上面,我想最大的改變是我對於寫程式的態度,因為在過去我真的很害怕寫程式,可是這堂課讓我突破了一些對於程式上的恐懼。也因為是分組的關係,讓我更懂得去負責,認真地完成。
2013年6月9日 星期日
考試心得
#include<cv.h>
#include<highgui.h>
#include<stdio.h>
#define TH1 80
#define refBlue 255
#define refGreen 255
#define refRed 255
#define refBlue1 0
#define refGreen1 0
#define refRed1 0
int main()
{
IplImage * src1;
IplImage * grey;
IplImage * img;
IplImage * logoImg;
IplImage * logoImg2;
CvCapture * capture = cvCreateCameraCapture(0);
src1 = cvQueryFrame(capture);
grey = cvCreateImage(cvSize(src1->width,src1->height), IPL_DEPTH_8U, 1);
img = cvCreateImage(cvSize(src1->width,src1->height), IPL_DEPTH_8U, 3);
logoImg=cvLoadImage("images01.jpg");//皇冠1
logoImg2=cvLoadImage("images.jpg");//皇冠2
while(true)
{
src1 = cvQueryFrame(capture);
//cvShowImage("webcam",src);
cvCvtColor(src1,img, CV_BGR2YCrCb);
cvInRangeS(img,cvScalar(0,137,77), cvScalar(240,177,127),grey);
//cvShowImage("webcam2",grey);
int mouseX=0;//西瓜X座標
int mouseY=0;//西瓜Y座標
float redPixelNumber=0;//紀錄顏色出現的次數
float redPixelX=0;//顏色出現的X位置
float redPixelY=0;//顏色出現的Y位置
for (int y=0; y<grey->height; y++) //兩個for迴圈在跑全部出現出現的顏色(用於皮膚偵測)(皮膚變白色)
{
uchar* ptr1=(uchar*) (grey->imageData +(y)*grey->widthStep);
for (int x=0; x<grey->width; x++)
{
if(ptr1[x]==255){
redPixelNumber++;
redPixelX+=x;
redPixelY+=y;
}
}
}
if (redPixelNumber>0) //計算十字架出現的位置
{
mouseX=(int)(redPixelX/redPixelNumber);
mouseY=(int)(redPixelY/redPixelNumber);
}
//cvLine(src1,cvPoint(mouseX-10,mouseY),cvPoint(mouseX+10,mouseY),CV_RGB(255,0,0),3,8,0);//十字架水平長度、顏色、
cvLine(src1,cvPoint(160,0),cvPoint(160,240),CV_RGB(255,0,0),3,8,0);//十字架垂直長度、顏色、
//此for迴圈主要在跑皇冠的圖片
for (int y=0; y<logoImg->height; y++)
{
uchar* ptr1=(uchar*) (logoImg->imageData +y*logoImg->widthStep);//宣告一個指標指向給西瓜
uchar* ptr2=(uchar*) (src1->imageData +(y)*src1->widthStep); //宣告一個指標指向給原圖
for (int x=0; x<logoImg->width; x++)
{
int D= (ptr1[3*x] - refBlue) * (ptr1[3*x] - refBlue) + //變數D為儲存類似白色的點
(ptr1[3*x+1] - refGreen) * (ptr1[3*x+1] -refGreen) +
(ptr1[3*x+2] - refRed) * (ptr1[3*x+2] - refRed);
if(sqrt(D) > TH1)
{
ptr2[3*(x+15)]=ptr1[3*(x)];
ptr2[3*(x+15)+1]=ptr1[3*(x)+1]; //圖片加入視訊
ptr2[3*(x+15)+2]=ptr1[3*(x)+2]; }
}
}
for (int y=0; y<logoImg2->height; y++)
{
uchar* ptr1=(uchar*) (logoImg2->imageData +y*logoImg2->widthStep);//宣告一個指標指向給西瓜
uchar* ptr2=(uchar*) (src1->imageData +(y)*src1->widthStep); //宣告一個指標指向給原圖
for (int x=0; x<logoImg2->width; x++)
{
int D= (ptr1[3*x] - refBlue) * (ptr1[3*x] - refBlue) + //變數D為儲存類似白色的點
(ptr1[3*x+1] - refGreen) * (ptr1[3*x+1] -refGreen) +
(ptr1[3*x+2] - refRed) * (ptr1[3*x+2] - refRed);
if(sqrt(D) > TH1)
{
ptr2[3*(x+175)]=ptr1[3*(x)];
ptr2[3*(x+175)+1]=ptr1[3*(x)+1]; //圖片加入視訊
ptr2[3*(x+175)+2]=ptr1[3*(x)+2]; }
}
}
if(mouseX < 160)
{
for (int y=0; y<logoImg->height; y++)
{
uchar* ptr1=(uchar*) (logoImg->imageData +y*logoImg->widthStep);//宣告一個指標指向給皇冠
uchar* ptr2=(uchar*) (src1->imageData +(y+mouseY-150)*src1->widthStep); //宣告一個指標指向給原圖
for (int x=0; x<logoImg->width; x++)
{
int D= (ptr1[3*x] - refBlue) * (ptr1[3*x] - refBlue) + //變數D為儲存類似白色的點
(ptr1[3*x+1] - refGreen) * (ptr1[3*x+1] -refGreen) +
(ptr1[3*x+2] - refRed) * (ptr1[3*x+2] - refRed);
if(sqrt(D) > TH1)
{
ptr2[3*(x+mouseX-140)]=ptr1[3*(x)];
ptr2[3*(x+mouseX-140)+1]=ptr1[3*(x)+1]; //圖片加入視訊
ptr2[3*(x+mouseX-140)+2]=ptr1[3*(x)+2];
}
}
}
}
else if(mouseX > 160)
{
for (int y=0; y<logoImg2->height; y++)
{
uchar* ptr1=(uchar*) (logoImg2->imageData +y*logoImg2->widthStep);//宣告一個指標指向給皇冠
uchar* ptr2=(uchar*) (src1->imageData +(y+mouseY-150)*src1->widthStep); //宣告一個指標指向給原圖
for (int x=0; x<logoImg2->width; x++)
{
int D= (ptr1[3*x] - refBlue) * (ptr1[3*x] - refBlue) + //變數D為儲存類似白色的點
(ptr1[3*x+1] - refGreen) * (ptr1[3*x+1] -refGreen) +
(ptr1[3*x+2] - refRed) * (ptr1[3*x+2] - refRed);
if(sqrt(D) > TH1)
{
ptr2[3*(x+mouseX)]=ptr1[3*(x)];
ptr2[3*(x+mouseX)+1]=ptr1[3*(x)+1]; //圖片加入視訊
ptr2[3*(x+mouseX)+2]=ptr1[3*(x)+2];
}
}
}
}
cvShowImage("webcam",src1);
cvShowImage("grey",grey);
char key = cvWaitKey(33);
if(key == 27)break;
}
}
考試心得:
這次的考試分為兩個部分,須將畫面正中央的紅線畫出來,再分別在左右放兩個不同的皇冠,當頭移動到某一邊時,皇冠需自動顯示在頭頂上。
而我在考試時只有將紅線畫出來,兩個皇冠的有出現在左右,卻無法在頭移動時自動跑出皇冠,後來中裕告訴我他的方法,他將左右以160做分隔,如果小於160就是左半邊,大於160就是右半邊,我覺得這個方法非常的好,可以很迅速地做判斷,接著就運用老師在上課時所教的西瓜那一次的作業,再將座標位置慢慢做調整,最後我在與同學的討論下完成了此作業。其中我很感謝昊穎,因為他在星期日和我一起到教室做練習,我們將所有上課所做過的作業都拿出來討論,而我也把我不懂得問他,他都非常詳細的回答我。雖然考試時並沒有完成全部,但是如果沒有經過討論與練習,我可能連紅線都有困難。
2013年6月8日 星期六
2013年6月2日 星期日
2013年5月13日 星期一
2013年4月29日 星期一
2013年4月28日 星期日
訂閱:
文章 (Atom)






