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)。這個問題還值得我們去討論。


沒有留言:

張貼留言