顯示具有 99360186 吳杰霖 標籤的文章。 顯示所有文章
顯示具有 99360186 吳杰霖 標籤的文章。 顯示所有文章

2013年6月9日 星期日

99360186 吳杰霖 課程回顧


1.最喜歡的作業是什麼?
我最喜歡的作業是 : 水果盤 用一個小小的arduino 和一些LED,電線,喇叭,光敏電阻,喇叭...等。 自己動手做出一個小玩具真的好有成就感,一些小小的電子零件經過組裝後 竟然會有這麼大的效果 真的是太令我震驚了!! 原來 動手做是這麼的有趣 在歡樂中還能夠學到許多專業知識真是太令人興奮了! 因為這個作業 所以我專題選了4X4X4來玩看看 真是超好玩的!



2.在課堂上學到什麼?
在課堂上我學到了3件最重要的事

(1)動手做
利用自己的雙手完成一項作業是多麼令人有成就感 也能更深的去體會所學知識的延伸利用 舉一反三 讓自己可以活用知識 而不是死記硬背

(2)討論
把不會的弄明白 把自己知道的分享給其他同學 同學間互相幫忙 學習他人優點 改善自己缺點

(3)不缺課
我打從上學開始 就完全贊成 "學生會翹課 是因為他對這堂課沒有興趣" 這個想法 在這堂課 我有好多的興趣 大家上課時的入落討論 每個人眼睛都閃閃發亮的坐著自己的作品 這不是學習 這是一種享受!

3.上完課有沒有什麼改變?
你問我有沒有改變? 你往上看第2個 "在課堂上學到什麼?" 我所寫的心得
我說我都沒有改變 這你敢信? 反正我是不信。

考試心得

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



int main()
{
IplImage * frame;
IplImage* mergeImg = NULL;
IplImage* photo01 = NULL;
IplImage* photo02 = NULL;
IplImage* pImg1 = NULL;

int mouseX=0;
int mouseY=0;

CvCapture * capture = cvCreateCameraCapture(0);
frame=cvQueryFrame(capture);

mergeImg = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 3);
pImg1 = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 1);


cvNamedWindow("webcam",0);
cvNamedWindow("Webcam1",0);

crown01 = cvLoadImage("001.jpg");
crown02 = cvLoadImage("002.jpg");


while(true)
{

frame=cvQueryFrame(capture);

cvFlip(frame,frame,1);
cvCvtColor(frame, frame, CV_BGR2YCrCb);
cvInRangeS(frame, cvScalar(0,137,77), cvScalar(256,177,127),pImg1);

frame=cvQueryFrame(capture);
cvFlip(frame,frame,1);
mergeImg=cvCloneImage(frame);

cvLine(mergeImg,cvPoint(300,0),cvPoint(300,800),CV_RGB(255,0,0),3,8,0);

int redPixelNumber=0;
int redPixelX=0;
int redPixelY=0;

for (int y=0; y<pImg1->height; y++)
{
uchar* ptr1=(uchar*) (pImg1->imageData +y*pImg1->widthStep);
for (int x=0; x<pImg1->width; x++)
{
if(ptr1[x]==255)
{
redPixelNumber++;
redPixelX+=x;
redPixelY+=y;
}
}
}

if (redPixelNumber>0)
{
mouseX=redPixelX/redPixelNumber;
mouseY=redPixelY/redPixelNumber;
}


for (int y=0; y<crown01->height; y++)
{

uchar* ptr1=(uchar*) (mergeImg->imageData +(y)*mergeImg->widthStep);
uchar* ptr2=(uchar*) (photo01->imageData +y*photo01->widthStep);
uchar* ptr3=(uchar*) (photo02->imageData +y*photo02->widthStep);


for (int x=0; x<photo01->width; x++)
{
if(ptr2[3*x]!=255)
{
ptr1[3*(x+70)]=ptr2[3*(x)];
ptr1[3*(x+70)+1]=ptr2[3*(x)+1];
ptr1[3*(x+70)+2]=ptr2[3*(x)+2];
}
}


for (int x=0; x<photo02->width; x++)
{
if(ptr2[3*x]!=255)
{
ptr1[3*(x+450)]=ptr3[3*(x)];
ptr1[3*(x+450)+1]=ptr3[3*(x)+1];
ptr1[3*(x+450)+2]=ptr3[3*(x)+2];
}
}
}


for (int y=0; y<photo01->height; y++)
{
uchar* ptr1=(uchar*) (mergeImg->imageData +(y+mouseY-170)*mergeImg->widthStep);
uchar* ptr2=(uchar*) (photo01->imageData + y*photo01->widthStep);
for (int x=0; x<photo01->width; x++)
{
if(mouseX <300)if(ptr2[3*x]!=255)
{
ptr1[3*(x+mouseX-60)]=ptr2[3*(x)] ;
ptr1[3*(x+mouseX-60)+1]=ptr2[3*(x)+1] ;
ptr1[3*(x+mouseX-60)+2]=ptr2[3*(x)+2] ;
}
}
}

for (int y=0; y<photo02->height; y++)
{
uchar* ptr1=(uchar*) (mergeImg->imageData +(y+mouseY-170)*mergeImg->widthStep);
uchar* ptr2=(uchar*) (photo02->imageData + y*photo02->widthStep);
for (int x=0; x<photo02->width; x++)
{
if(mouseX >305)if(ptr2[3*x]!=255)
{
ptr1[3*(x+mouseX-50)]=ptr2[3*(x)] ;
ptr1[3*(x+mouseX-50)+1]=ptr2[3*(x)+1] ;
ptr1[3*(x+mouseX-50)+2]=ptr2[3*(x)+2] ;
}
}
}

cvShowImage("Webcam",pImg1 );
cvShowImage("Webcam1",mergeImg );

char key = cvWaitKey(33);
if(key == 27)break;
}
}

上機考時 聽到考試題目我就知道我完蛋了 從大一下我的程設被當掉開始 程式設計就是我的弱項 寫程式對我來說 就像要一個完全沒下過廚的人 去煮一頓滿漢全席一樣困難 我必須很誠實地說 其實 我還是不太懂這些程式 我依舊還是無法一個人 從無到有 寫出一個不會有bug的程式
老師讓我們做這個心得 可能是要我們知道 考試考零分不要緊 但是剩下的100要去學會完成它 這個道理
以我目前的能力 要我在這短短幾天就要有很好的進步 是不切實際的 但我會繼續努力 或許我走的路比別人多 比別人長 但是只要持之以恆 就像馬拉松一樣 我即使沒辦法當第一名 但我也能走到終點
每個人都有自己的優點 我很會想鬼點子 很喜歡搞不一樣的東西 手工也很有自信 所以我能跟別人合作 來彌補我的弱項 放大我的優點 這或許是老師在課堂上要我們分組的原因 我的程式弱 但是我會做其他東西來彌補我的缺點 讓其他城市強的同學來cover我 這也是之後要在社會上生存競爭的"團隊合作"啊!

之後 很高興有修到這門課 學了好多的專業知識 做了許多很滿足的專題 還有許多令人興奮的成品 真的很充實 很有成就感!

2013年6月7日 星期五

期末專題 揮手變臉


#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include "cxcore.h"
#define refBlue 168
#define refGreen 182
#define refRed 205

CvCapture *capture;

int main(){
    IplImage* pImg = NULL;
    IplImage* pImg2 = NULL;  
    IplImage* pImg1 = NULL;
    IplImage* logoImg= NULL;
    IplImage* l1= NULL;
    IplImage* l2= NULL;
    IplImage* l3= NULL;
    IplImage* l4= NULL;
    IplImage* l5= NULL;
    IplImage* l6= NULL;
    IplImage* l7= NULL;
    IplImage* l8= NULL;
    IplImage* l9= NULL;
    IplImage* l10= NULL;
    IplImage* l11= NULL;
    IplImage* l12= NULL;
    IplImage* l13= NULL;
    IplImage* l14= NULL;
    IplImage* l15= NULL;
    IplImage* l16= NULL;
    IplImage* l17= NULL;
    IplImage* l18= NULL;
    IplImage* l19= NULL;
    IplImage* l20= NULL;
 
    int mouseX=0;
    int mouseY=0;
    CvPoint P1,P2,P3,P4;
    CvScalar Color;
    l1=cvLoadImage("1.jpg");
    l2=cvLoadImage("2.jpg");
    l3=cvLoadImage("3.jpg");
    l4=cvLoadImage("5.jpg");
    l5=cvLoadImage("6.jpg");
    l6=cvLoadImage("7.jpg");
    l7=cvLoadImage("8.jpg");
    l8=cvLoadImage("9.jpg");
    l9=cvLoadImage("10.jpg");
    l10=cvLoadImage("11.jpg");
    l11=cvLoadImage("12.jpg");
    l12=cvLoadImage("13.jpg");
    l13=cvLoadImage("14.jpg");
    l14=cvLoadImage("15.jpg");
    l15=cvLoadImage("16.jpg");
    l16=cvLoadImage("17.jpg");
    l17=cvLoadImage("18.jpg");
    l18=cvLoadImage("19.jpg");
    l19=cvLoadImage("20.jpg");
    l20=cvLoadImage("21.jpg");
 
    capture=cvCreateCameraCapture(1);
    cvNamedWindow("Original Image", 1);
    cvNamedWindow("123", 1);
 
    while(true){
 
    pImg=cvQueryFrame(capture);
    pImg1 = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 1);
    pImg2 = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 3);
 
 
    cvCvtColor(pImg, pImg, CV_BGR2YCrCb);
    cvInRangeS(pImg, cvScalar(0,137,77), cvScalar(256,177,127),pImg1);
    pImg=cvQueryFrame(capture);
    pImg2=cvCloneImage(pImg);
 

    int redPixelNumber=0;
    int redPixelX=0;
    int redPixelY=0;
    int s=0,R,S;
 
    for (int y=0; y<pImg1->height; y++) {
    uchar* ptr1=(uchar*) (pImg1->imageData +y*pImg1->widthStep);
    for (int x=0; x<pImg1->width; x++) {  
       if(ptr1[x]==255){    
       redPixelNumber++;
       redPixelX+=x;
       redPixelY+=y;
       s+=1;}
     }
     }
     if(R>20)R=0;
     if(s>30000)R=rand()%20;
     if(R==0)logoImg=cvCloneImage(l1);
     if(R==1)logoImg=cvCloneImage(l2);
     if(R==2)logoImg=cvCloneImage(l3);
     if(R==3)logoImg=cvCloneImage(l4);
     if(R==4)logoImg=cvCloneImage(l5);
     if(R==5)logoImg=cvCloneImage(l6);
     if(R==6)logoImg=cvCloneImage(l7);
     if(R==7)logoImg=cvCloneImage(l8);
     if(R==8)logoImg=cvCloneImage(l9);
     if(R==9)logoImg=cvCloneImage(l10);
     if(R==10)logoImg=cvCloneImage(l11);
     if(R==11)logoImg=cvCloneImage(l12);
     if(R==12)logoImg=cvCloneImage(l13);
     if(R==13)logoImg=cvCloneImage(l14);
     if(R==14)logoImg=cvCloneImage(l15);
     if(R==15)logoImg=cvCloneImage(l16);
     if(R==16)logoImg=cvCloneImage(l17);
     if(R==17)logoImg=cvCloneImage(l18);
     if(R==18)logoImg=cvCloneImage(l19);
     if(R==19)logoImg=cvCloneImage(l20);
     if (redPixelNumber>0) {
      mouseX=redPixelX/redPixelNumber;
      mouseY=redPixelY/redPixelNumber;
      }
   
      P1 = cvPoint(mouseX-10,mouseY);                                  
      P2 = cvPoint(mouseX+10,mouseY);
      P3 = cvPoint(mouseX,mouseY-10);                                  
      P4 = cvPoint(mouseX,mouseY+10);                                  
      Color=CV_RGB(255,0,0);
      //cvLine(pImg2,P1,P2,Color,2,8,0);
      //cvLine(pImg2,P3,P4,Color,2,8,0);
   
   
      for (int y=0; y<logoImg->height; y++) {
      uchar* ptr1=(uchar*) (pImg2->imageData +(y+mouseY-170)*pImg2->widthStep);
      uchar* ptr2=(uchar*) (logoImg->imageData + y*logoImg->widthStep);
      for (int x=0; x<logoImg->width; x++) {  
       if(ptr2[3*x]!=255){
       ptr1[3*(x+mouseX-80)]=ptr2[3*(x)] ;
       ptr1[3*(x+mouseX-80)+1]=ptr2[3*(x)+1] ;
       ptr1[3*(x+mouseX-80)+2]=ptr2[3*(x)+2] ;}  
      }
 
}
   

 cvShowImage( "Original Image", pImg2 );
 cvShowImage( "123", pImg1 );
 cvReleaseImage( &pImg2 );

 cvWaitKey(10);
 
}

 
 
   }

雖然程式很簡單 但是對於成是很弱的我依舊很有難度 我跑去找了吳鍾昊幫忙 請他幫我修改並且debug 他真的很厲害 一下子就修改完成了!

程式碼本體 是老師上課的作業 : 皮膚偵測
我多加了一個揮手偵測 也就是     
if(R>20)R=0;
if(s>30000)R=rand()%20;
這兩行精華所在
當手在視訊前時 因為皮膚色變多 所以程式開始隨機產生1~20值
當手消失在視訊前時 因為皮膚色變少 所以程式選定一個當時隨機到的1~20值
並且產生那個值所代表的面具

這程式有個大家都會錯的BUG 也就是 當圖片碰到視訊邊界時 程式就會當掉
所以我選擇了新的視訊硬體 讓視訊邊界變得更大 減少BUG產生的機會
但是 這是治標不治本的辦法 最好的辦法 依舊是要設定X Y 不要超過中間區域
不過真的是有點複雜 加上我的圖片太多 沒有太多時間可去一一比對修改 所以...
我才會用這個偷懶的方式 哈哈

ARDUINO 水果盤


期中專題 4X4X4 LED CUBE SHOW


皮膚偵測


相框