顯示具有 98360454陳湘玲 標籤的文章。 顯示所有文章
顯示具有 98360454陳湘玲 標籤的文章。 顯示所有文章

2013年6月9日 星期日

課程回顧


1. What is your favorite homework?

我最喜歡的作業是期末專案,因為可以利用上課所學的來設計自己的期末專案,我們根據鋼鐵人的素材來做成遊戲,
製作的過程雖然遇到許多問題,花了時間與心力,但是我與組員還是一起共同解決並完成這專案,完成的喜悅及回憶是難以忘記的。

2. What did you learn in this course?

我學到了最基本的opcv,我們學得並不深,但是卻可以讓我們擁有學習的動力,其中我知道了一段程式碼是可以判斷黃種人膚色的範圍,
但是判斷黃種人膚色的範圍,為什麼是這個數值(0,137,77)、(255,177,127),而且找出這個範圍的人士怎麼研究出來的,
這個問題還值得我們去討論。

3. What did you change after this course?

期中之前是processing加ardiuno,期末是opencv,這些都可以利用簡單直覺的程式碼,來製作成簡單有趣的遊戲,課堂互動可以讓我們主動學習,
積極的去解決所遇到的問題,觀摩別人的作品,帶給我許多其他的想法,豐富我的作品。

煙火

煙火-請點我

期中專案-遙控船





水果盤


int val;
int val2;
int ledPin;
int temp;
int Tone;
int speakerOut = 4;
void setup()
{
  Serial.begin(9600);
  pinMode(speakerOut, OUTPUT);
  for(ledPin=10;ledPin<=13;ledPin++){
     pinMode(ledPin, OUTPUT);
}
}

void loop()
{
  Tone = 2028;
  int LED_i;

  Serial.print(val);
  //delay(150);
  val = analogRead(0);
  val2 = 1000;

  for(LED_i=10;LED_i<=13;LED_i++)
  {
     val2=analogRead(2);
     Serial.print(val2);
     if(val2<60){
       digitalWrite(LED_i, HIGH);
       if(LED_i==11){
         tone(4,2080,1000);
      /* digitalWrite(speakerOut, HIGH);
       delayMicroseconds(Tone / 2);
       delay(1000);
       digitalWrite(speakerOut , LOW);
       delayMicroseconds(Tone / 2);
       */
     }
     delay(3000);
   }
   digitalWrite(LED_i, HIGH);
   delay(val);
   digitalWrite(LED_i, LOW);
}
}

2013年5月29日 星期三

期末專案



#include<cv.h>
#include<iostream>
#include<highgui.h>
#include<stdio.h>
#define alpha 1
#define x1 0
#define y1 0
using namespace std;
int main()
{
    CvCapture *capture;
    IplImage* pImg = NULL;
    IplImage* pImg2 = NULL;
    IplImage* grey = NULL;
    IplImage* pImgcr = NULL;
    IplImage* logoImg = NULL;
    IplImage* logoImg1 = NULL;
    IplImage* logoImg2 = NULL;
    IplImage* logoImg3 = NULL;
    IplImage* logoImg4 = NULL;
    int score=0;
    int scorex;
    int scorey;
    //cout<<"1";
   

while(true){
   
    capture=cvCreateCameraCapture( 0 );
    pImg=cvQueryFrame(capture);
    logoImg=cvLoadImage("006.jpg");
    logoImg1=cvLoadImage("002.jpg");
    logoImg2=cvLoadImage("004.jpg");
    logoImg3=cvLoadImage("008.jpg");
    logoImg4=cvLoadImage("exit.jpg");
   
    float mouseX=0;
    float mouseY=0;
    float redPixelNumber=0;
    float redPixelX=0;
    float redPixelY=0;
   
    grey = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 1);
    pImgcr = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 3);
   
    cvCvtColor(pImg, pImgcr, CV_BGR2YCrCb);
    cvInRangeS(pImgcr, cvScalar(0,137,77), cvScalar(256,177,127),grey);
   
    for (int y=0; y<grey->height; y++) {
    uchar* ptr1=(uchar*) (grey->imageData +y*grey->widthStep);
    //uchar* ptr1=(uchar*) (pImg->imageData +y*pImg->widthStep);
    for (int x=0; x<grey->width; x++) {
    if(ptr1[x]==255){
    redPixelNumber++;
    redPixelX+=x;
    redPixelY+=y;
            }
        }
    if (redPixelNumber>0) {
    mouseX=redPixelX/redPixelNumber;
    mouseY=redPixelY/redPixelNumber;
            }
        }
   
 
    int mousex1=mouseX-60;
    int mousey1=mouseY-60;
    int scorex=mouseX;
    int scorey=mouseY;
    if( (logoImg->height + mousey1) < pImg->height) {
    for (int y=0; y<logoImg->height; y++) {
    uchar* ptr1=(uchar*) (logoImg->imageData +y*logoImg->widthStep);
    uchar* ptr2=(uchar*) (pImg->imageData +((mousey1+y))*pImg->widthStep);
        for (int x=0; x<logoImg->width; x++) {
            if(ptr1[3*(x)]<255&&   ptr1[3*(x)+1]<255&& ptr1[3*(x)+2]<255){
            ptr2[3*(x+mousex1)]=ptr1[3*(x)];
            ptr2[3*(x+mousex1)+1]=ptr1[3*(x)+1];
            ptr2[3*(x+mousex1)+2]=ptr1[3*(x)+2];
                }
            }
        }
    }
   
   
        if(scorex <pImg->width/3&&scorey <pImg->height/2){
      score+=10;
      cout<<"伊凡萬科死了"<<" "<<"得分"<<score<<endl;
      cvWaitKey(100);
      //Sleep(100);
        }
        if(scorex >pImg->width/3&&scorex <(pImg->width/3)*2&&scorey<pImg->height/2){
      score+=30;
      cout<<"滿大人死了"<<" "<<"得分"<<score<<endl;
      cvWaitKey(100);
      //Sleep(100);
        }
       if(scorex>(pImg->width/3)*2&&scorey <pImg->height/2){
      score+=50;
      cout<<"火焰人死了"<<" "<<"得分"<<score<<endl;
      cvWaitKey(100);
      //Sleep(100);
        }
     
   
   
//---------------------------------------------------------------------------------
    if( (logoImg1->height + y1) < pImg->height) {
  for (int y=0; y<logoImg1->height; y++) {
    uchar* ptr1=(uchar*) (logoImg1->imageData +y*logoImg1->widthStep);
    uchar* ptr2=(uchar*) (pImg->imageData+150 +(75+y)*pImg->widthStep);
    for (int x=0; x<logoImg1->width; x++) {
        if(ptr1[3*(x)]<250&&   ptr1[3*(x)+1]<250&& ptr1[3*(x)+2]<250){
       ptr2[3*(x+x1)]=ptr1[3*(x+x1)];
       ptr2[3*(x+x1)+1]=ptr1[3*(x+x1)+1];
       ptr2[3*(x+x1)+2]=ptr1[3*(x+x1)+2];  
       }
    }  
}
}
//---------------------------------------------------------------------------------
if( (logoImg2->height + y1) < pImg->height) {
  for (int y=0; y<logoImg2->height; y++) {
    uchar* ptr1=(uchar*) (logoImg2->imageData +y*logoImg2->widthStep);
    uchar* ptr2=(uchar*) (pImg->imageData +810+(y+75)*pImg->widthStep);
    for (int x=0;x<logoImg2->width; x++) {
        if(ptr1[3*(x)]<250&&   ptr1[3*(x)+1]<250&& ptr1[3*(x)+2]<250){
       ptr2[3*(x+x1)]=ptr1[3*(x+x1)];
       ptr2[3*(x+x1)+1]=ptr1[3*(x+x1)+1];
       ptr2[3*(x+x1)+2]=ptr1[3*(x+x1)+2];  
       }
    }  
}
}
//---------------------------------------------------------------------------------
if( (logoImg3->height + y1) < pImg->height) {
  for (int y=0; y<logoImg3->height; y++) {
    uchar* ptr1=(uchar*) (logoImg3->imageData +y*logoImg3->widthStep);
    uchar* ptr2=(uchar*) (pImg->imageData +1377+(y+75)*pImg->widthStep);
    for (int x=0;x<logoImg3->width; x++) {
        if(ptr1[3*(x)]<250&&   ptr1[3*(x)+1]<250&& ptr1[3*(x)+2]<250){
       ptr2[3*(x+x1)]=ptr1[3*(x+x1)];
       ptr2[3*(x+x1)+1]=ptr1[3*(x+x1)+1];
       ptr2[3*(x+x1)+2]=ptr1[3*(x+x1)+2];  
       }
    }  
}
}
//---------------------------------------------------------------------------------

if( (logoImg4->height + y1) < pImg->height) {
  for (int y=0; y<logoImg4->height; y++) {
    uchar* ptr1=(uchar*) (logoImg4->imageData +y*logoImg4->widthStep);
    uchar* ptr2=(uchar*) (pImg->imageData +1620+(y+380)*pImg->widthStep);
    for (int x=0;x<logoImg4->width; x++) {
        if(ptr1[3*(x)]<250&&   ptr1[3*(x)+1]<250&& ptr1[3*(x)+2]<250){
       ptr2[3*(x)]=ptr1[3*(x+x1)];
       ptr2[3*(x)+1]=ptr1[3*(x+x1)+1];
       ptr2[3*(x)+2]=ptr1[3*(x+x1)+2];  
       }
    }  
}


}
//---------------------------------------------------------------------------------  
   
   // mousex1
   // mousey1  

    //cvLine(pImg,cvPoint(mouseX-10,mouseY),cvPoint(mouseX+10,mouseY),CV_RGB(255,0,0),12,8,0);
    //cvLine(pImg,cvPoint(mouseX,mouseY-10),cvPoint(mouseX,mouseY+10),CV_RGB(255,0,0),12,8,0);
   
    cvLine(pImg,cvPoint(pImg->width/3,0),cvPoint(pImg->width/3,pImg->height),CV_RGB(255,0,0),12,8,0);
    cvLine(pImg,cvPoint((pImg->width/3)*2,0),cvPoint((pImg->width/3)*2,pImg->height),CV_RGB(255,0,0),12,8,0);

    cvShowImage("webcam",pImg);  

    char key = cvWaitKey(33);
   // if(key == 27)break;
   //if(key == 27)break;
   if(scorex >(pImg->width/5)*4&&scorey>(pImg->height/5)*4)break;
    }
   

}

HW4-變色





這次的作業是將頭髮變色,由於我的頭髮有染髮不是黑色,黃也不是純黃,所以在找BGR的數值時遇到了小困難,試了許多次,還有調整黃色允許誤差的範圍後,才將我的頭髮變成紅色,但是還是有部分頭髮的顏色,電腦沒有判斷出來。第三張圖是將包包(黃色),判斷完後切出四種顏色。

2013年5月26日 星期日

98360454_考試心得









   if( (Image1->height) < src->height) {
   //mergeImg=cvCloneImage(pImg);
  for (int y=0; y<Image1->height; y++) {  
    uchar* ptr1=(uchar*) (Image1->imageData +y*Image1->widthStep);
    uchar* ptr2=(uchar*) (src->imageData +(y)*src->widthStep); 
    for (int x=0; x<Image1->width; x++) { 
        if(ptr1[3*(x)]<250&&   ptr1[3*(x)+1]<250&& ptr1[3*(x)+2]<250){
       ptr2[3*(x)]=ptr1[3*(x)]; 
       ptr2[3*(x)+1]=ptr1[3*(x)+1]; 
       ptr2[3*(x)+2]=ptr1[3*(x)+2];    
       }
    }    
}
}

 
     if( (Image2->height) < src->height) {
   //mergeImg=cvCloneImage(pImg);
  for (int y=0; y<Image2->height; y++) {  
    uchar* ptr1=(uchar*) (Image2->imageData +y*Image2->widthStep);
    uchar* ptr2=(uchar*) (src->imageData +550+(y)*src->widthStep); //更改第二章圖適合的位置
    for (int x=0; x<Image2->width; x++) { 
        if(ptr1[3*(x)]<250&&   ptr1[3*(x)+1]<250&& ptr1[3*(x)+2]<250){
       ptr2[3*(x)]=ptr1[3*(x)]; 
       ptr2[3*(x)+1]=ptr1[3*(x)+1]; 
       ptr2[3*(x)+2]=ptr1[3*(x)+2];    
       }
    }    
}
}

以上程式碼為將要放的兩張皇冠放置在畫面中,上次無法完成老師考試的要求,回家後仔細想想,發現到之前的錯誤是由於放置第一張和第二張皇冠位置會相同,導致錯誤,程式碼跑不成功,所以我將視第二張圖的位置水平增加。


 cvCvtColor(src, img, CV_BGR2YCrCb);
     cvInRangeS(img, cvScalar(0,137,77), cvScalar(256,177,127),grey);
    
       for (int y=0; y<grey->height; y++) {  
       uchar* ptr1=(uchar*) (grey->imageData +y*grey->widthStep);
           for (int x=0; x<grey->width; x++) {     
            if(ptr1[x]==255){
             PixelNumber++;
             PixelX+=x;
             PixelY+=y;
             }        
           }
           }
        if (PixelNumber>0) {                
        mouseX=PixelX/PixelNumber;
        mouseY=PixelY/PixelNumber;
        
        }


上述為將可以針對黃種人臉部膚色轉換成電腦才看得懂的顏色,是膚色時變為白色。經由兩個for迴圈抓住所有臉上膚色位置,然後得到重心位置。



int mousex1=mouseX;    
int mousey1=mouseY;
if(mousex1<src->width/2){    //左邊皇冠
 if( (Image1->height+mousey1) < src->height) {   //小於影像大小才會執行

  for (int y=0; y<Image1->height; y++) {  
    uchar* ptr1=(uchar*) (Image1->imageData +y*Image1->widthStep);
    uchar* ptr2=(uchar*) (src->imageData +(mousey1+(y)-120)*src->widthStep); //帽子在臉部上方
    for (int x=0; x<Image1->width; x++) { 
        if(ptr1[3*(x)]<250&&   ptr1[3*(x)+1]<250&& ptr1[3*(x)+2]<250){   
       ptr2[3*(x+mousex1)]=ptr1[3*(x)]; 
       ptr2[3*(x+mousex1)+1]=ptr1[3*(x)+1]; 
       ptr2[3*(x+mousex1)+2]=ptr1[3*(x)+2];    
       }
    }    
}
}
}
else{    //右邊皇冠
 if( (Image2->height+mousey1) < src->height) {
   //mergeImg=cvCloneImage(pImg);
  for (int y=0; y<Image2->height; y++) {  
    uchar* ptr1=(uchar*) (Image2->imageData +y*Image2->widthStep);
    uchar* ptr2=(uchar*) (src->imageData+(mousey1+(y)-120)*src->widthStep); 
    for (int x=0; x<Image2->width; x++) { 
        if(ptr1[3*(x)]<250&&   ptr1[3*(x)+1]<250&& ptr1[3*(x)+2]<250){
       ptr2[3*(x+mousex1)]=ptr1[3*(x)]; 
       ptr2[3*(x+mousex1)+1]=ptr1[3*(x)+1]; 
       ptr2[3*(x+mousex1)+2]=ptr1[3*(x)+2];    
       }
    }    
}
}    
     }

上述為戴上帽子部分程式碼,不過因為當時燈光太暗,導致視訊無法精確地抓取我臉部顏色、找出臉部中間位置,所以帽子帶上的位置會怪怪的,沒有那麼完美。


心得:

很開心可以完成老師要求我做到的作業,一開始只知道這部分程式碼是幹嘛,但是卻不知道為什麼程式碼是這樣寫,跟同學一起研究後不懂的地方再詢問老師時,老師很熱心地解釋,讓我豁然開朗。但是判斷黃種人膚色的範圍,為什麼是這個數值(0,137,77)、(255,177,127)。這個問題還值得我們去討論。


2013年5月6日 星期一

互動電子-作業三-相框


主要程式碼:


if( (logoImg->height + y1) < mergeImg->height) {
  mergeImg=cvCloneImage(pImg);
  for (int y=0; y<logoImg->height; y++) {
    uchar* ptr1=(uchar*) (logoImg->imageData +y*logoImg->widthStep);
    uchar* ptr2=(uchar*) (mergeImg->imageData +(y+y1)*mergeImg->widthStep);
    for (int x=0; x<logoImg->width; x++) {
        if(ptr1[3*(x)]<230&&   ptr1[3*(x)+1]<230&& ptr1[3*(x)+2]<230){
       ptr2[3*(x+x1)]=ptr1[3*(x+x1)];
       ptr2[3*(x+x1)+1]=ptr1[3*(x+x1)+1];
       ptr2[3*(x+x1)+2]=ptr1[3*(x+x1)+2];  
       }
    }  
}
}

2013年4月22日 星期一

互動電子-hw1-自畫像





重點程式碼:



  pImg2 = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 3);
  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);
cvNamedWindow("src", 1);
cvNamedWindow("gray",1);

    while(1)
    {
     pImg=cvQueryFrame(capture);

        cvResize(pImg,dst,CV_INTER_NN);

cvCvtColor(pImg, gray, CV_BGR2GRAY);
cvThreshold( gray, bw, 130, 255, CV_THRESH_BINARY );
cvThreshold( pImg, pImg2, 127, 255, CV_THRESH_BINARY );


cvCanny(gray, pCannyImg, 50, 150, 3);