顯示具有 考試心得 標籤的文章。 顯示所有文章
顯示具有 考試心得 標籤的文章。 顯示所有文章

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就是右半邊,我覺得這個方法非常的好,可以很迅速地做判斷,接著就運用老師在上課時所教的西瓜那一次的作業,再將座標位置慢慢做調整,最後我在與同學的討論下完成了此作業。其中我很感謝昊穎,因為他在星期日和我一起到教室做練習,我們將所有上課所做過的作業都拿出來討論,而我也把我不懂得問他,他都非常詳細的回答我。雖然考試時並沒有完成全部,但是如果沒有經過討論與練習,我可能連紅線都有困難。

期末上機考


題目:
中線左右各放一個皇冠,頭到左邊會戴上左邊的皇冠,到右邊則戴上右邊的皇冠。


一開始把中間的線畫出來,皇冠就相當於把圖片放上去~
考試的時候不會把皇冠放上去,再想可能是位子出了問題。
皇冠要怎麼跟著頭的移動改變位子,一開始想到是利用皮膚偵測的方式,去偵測黑色的頭髮,但最後也也不出來。

一開始皇冠的圖片放不上去,即便放上去了也是在不對的位置,後來請教同學後,才知道原來圖片放入的完整順序,然後我畫線的部分也是利用作業的程式碼改正成功的,最後請吳昊穎同學教我如何在左右邊出現黃冠。

這次的作業學到很多東西,雖然考試的時候有點緊張,甚至根本寫不出來,事後請教同學之後,了解了這次考試的問題在哪,錯在哪,對我有很大的幫助



          //為圖片申請空間
     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);
     //讀取圖片檔案
     p1 = cvLoadImage("Crown02.jpg");
     p2 = cvLoadImage("Crown04.jpg");
  
  
     //劃線
        cvLine(mergeImg,cvPoint(150,0),cvPoint(150,255),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*) (crown01->imageData +y*crown01->widthStep);// 皇冠 1
           uchar* ptr3=(uchar*) (crown02->imageData +y*crown02->widthStep);// 皇冠 2
          
           //寫入第一皇冠(左)
           for (int x=0; x<crown01->width; x++)
           {
               if(ptr2[3*x]!=255)
               {     
                   ptr1[3*(x+20)]=ptr2[3*(x)];
                   ptr1[3*(x+20)+1]=ptr2[3*(x)+1];
                   ptr1[3*(x+20)+2]=ptr2[3*(x)+2]; 
               }
            }
          
            //寫入第二皇冠(右)
            for (int x=0; x<crown02->width; x++)
            {
               if(ptr2[3*x]!=255)
               {     
                   ptr1[3*(x+180)]=ptr3[3*(x)];
                   ptr1[3*(x+180)+1]=ptr3[3*(x)+1];
                   ptr1[3*(x+180)+2]=ptr3[3*(x)+2]; 
               }
            }   
        }
    
      // 偵測第一個皇冠會在頭上
         for (int y=0; y<crown01->height; y++)
         { 
           uchar* ptr1=(uchar*) (mergeImg->imageData +(y+mouseY-170)*mergeImg->widthStep);
           uchar* ptr2=(uchar*) (crown01->imageData + y*crown01->widthStep);
           for (int x=0; x<crown01->width; x++)
           {   
                 if(mouseX <150)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] ;
                 }   
           }
         }

 //皇冠二如同


考試心得

#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我 這也是之後要在社會上生存競爭的"團隊合作"啊!

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

上機考心得

這次的上機考在前面幾個步驟算簡單
第一個是做出紅線
再來就是去背
將圖片旁的白色部分去掉
這在之前的程式中有提到 稍作修改既可以套用上去

至於皇冠的部分
就是在影像兩邊偵測膚色
判斷膚色出現在某一邊之後該邊的皇冠會偵測顏色然後隨著移動

for (int x=0; x<logoImg1->width; x++) {
if(ptr1[3*(x)]<252 && ptr1[3*(x)+1]<252 && ptr1[3*(x)+2]<252){
ptr2[3*(x+mouseX-150)]=ptr1[3*(x)];
ptr2[3*(x+mouseX-150)+1]=ptr1[3*(x)+1];
ptr2[3*(x+mouseX-150)+2]=ptr1[3*(x)+2];


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+mouseX-90)]=ptr1[3*(x)];
ptr2[3*(x+mouseX-90)+1]=ptr1[3*(x)+1];
ptr2[3*(x+mouseX-90)+2]=ptr1[3*(x)+2];

這次的上機考遇到最大的問題就是膚色偵測以及讓皇冠跟著移動
但我並沒有成功做出讓皇冠跟著移動

透過這次考試知道視訊處理要考慮相當多東西
也清楚知道自己的CODING能力不足
在考試中寫出一開始的問題之後後來的問題就完全沒有頭緒
邏輯的概念不足造成這種狀況
回家修改之後才完成到上面的程度




99361121_黃彥豪_上機考心得


題目:在左右視窗分別戴上不同的皇冠
1.先把視窗分邊
cvLine(src,cvPoint(325,0),cvPoint(325,500),CV_RGB(255,0,0),3,8,0);
ps:使用的是筆電視訊鏡頭
2.讀取圖片 偵測皮膚
logoImg1=cvLoadImage("p1.jpg");
 logoImg2=cvLoadImage("p2.jpg");
if (blackPixelNumber > 0) {
           mouseX=blackPixelX/blackPixelNumber;
           mouseY=blackPixelY/blackPixelNumber;
        }
將上面兩張圖片帶入視訊
mergeImg=cvCloneImage(src);
for (int y=0; y<logoImg1->height; y++) {  
            uchar* ptr1=(uchar*) (logoImg1->imageData +y*logoImg1->widthStep);
            uchar* ptr2=(uchar*) (mergeImg->imageData +(y+y1)*mergeImg->widthStep); 
        for (int x=0; x<logoImg1->width; x++) {
            if(ptr1[3*(x)] < 210 && ptr1[3*(x+1)] < 210 && ptr1[3*(x+2)] < 210){     
            ptr2[3*(x+x1)]=ptr1[3*(x)] ; 
            ptr2[3*(x+x1)+1]=ptr1[3*(x)+1] ; 
            ptr2[3*(x+x1)+2]=ptr1[3*(x)+2] ;           
            }    
            }
          }    
        
        for (int y=0; y<logoImg2->height; y++) {  
            uchar* ptr1=(uchar*) (logoImg2->imageData +y*logoImg2->widthStep);
            uchar* ptr2=(uchar*) (mergeImg->imageData +(y+y2)*mergeImg->widthStep); 
        for (int x=0; x<logoImg2->width; x++) {
            if(ptr1[3*(x)] < 239 && ptr1[3*(x+1)] < 239 && ptr1[3*(x+2)] < 239){          
            ptr2[3*(x+x2)]=ptr1[3*(x)] ; 
            ptr2[3*(x+x2)+1]=ptr1[3*(x)+1] ; 
            ptr2[3*(x+x2)+2]=ptr1[3*(x)+2] ;           
            }    
            }
          }
      
下面兩張帶入圖片
for (int y=0; y<logoImg1->height; y++) {  
            uchar* ptr1=(uchar*) (logoImg1->imageData +y*logoImg1->widthStep);
            uchar* ptr2=(uchar*) (mergeImg->imageData +(y+mouseY-110)*mergeImg->widthStep); 
        for (int x=0; x<logoImg1->width; x++) {
            if(mouseX<=155)
            if(ptr1[3*(x)] < 210 && ptr1[3*(x+1)] < 210 && ptr1[3*(x+2)] < 210){     
              ptr2[3*(x+mouseX-50)]=ptr1[3*(x)]; 
              ptr2[3*(x+mouseX-50)+1]=ptr1[3*(x)+1]; 
              ptr2[3*(x+mouseX-50)+2]=ptr1[3*(x)+2];
            }    
          }
        }
        
        for (int y=0; y<logoImg2->height; y++) {  
            uchar* ptr1=(uchar*) (logoImg2->imageData +y*logoImg2->widthStep);
            uchar* ptr2=(uchar*) (mergeImg->imageData +(y+mouseY-110)*mergeImg->widthStep); 
        for (int x=0; x<logoImg2->width; x++) {
             if(mouseX>=165)
              if(ptr1[3*(x)] < 239 && ptr1[3*(x+1)] < 239 && ptr1[3*(x+2)] < 239){     
              ptr2[3*(x+mouseX-50)]=ptr1[3*(x)]; 
              ptr2[3*(x+mouseX-50)+1]=ptr1[3*(x)+1]; 
              ptr2[3*(x+mouseX-50)+2]=ptr1[3*(x)+2];
              }    
          }    
          }


心得:一開始看到題目時,心裡大概有想法,
把線分開後,如何將皇冠放進去並且使其跟
隨我們擺動便使我困惑許久,在考試後問了許多同學,
也搞懂了並順利完成這個作業。

98360242_張綉美_上機考心得


#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include <cvcam.h>

#define refBlue 255
#define refGreen 255
#define refRed 255

#define TH 150  //門檻值

int main()
{
    CvCapture *capture;
    IplImage *frame;
    IplImage *img;
    IplImage *grey;
   
    IplImage *logoImg;
    IplImage *logoImg2;
   
    float SkinPixelNumber;
    float SkinPixelX;
    float SkinPixelY;
    int MouseX=0,MouseY=0;
   
    logoImg=cvLoadImage("images.jpg");
    logoImg2=cvLoadImage("images2.jpg");
   
 
   
    capture=cvCreateCameraCapture( 0 );
    frame = cvQueryFrame(capture);
    grey = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 1);
    img = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 3);
   
    while(1)
    {
        frame = cvQueryFrame(capture);                                        
        cvCvtColor(frame, frame, CV_BGR2YCrCb);
        cvInRangeS(frame, cvScalar(0,137,77), cvScalar(256,177,127),grey); //判斷膚色轉換成黑白影像
        frame = cvQueryFrame(capture); //在抓一次原的視訊影像
        cvLine(frame,cvPoint(frame->width/2,0),cvPoint(frame->width/2,frame->height),CV_RGB(255,0,0),5,8,0);
//畫線 X軸的一半位置 和Y軸0的位置 到  X軸的一半位置 和Y軸的全高
           for (int y=0; y<logoImg->height; y++) {   //讀取
           uchar* ptr1=(uchar*) (logoImg->imageData +y*logoImg->widthStep);
           uchar* ptr2=(uchar*) (frame->imageData +(y)*frame->widthStep);
         
  for (int x=0; x<logoImg->width; x++) {
                  int D= (ptr1[3*x] - refBlue) * (ptr1[3*x] - refBlue) +       // 計算白色色彩值範圍
                  (ptr1[3*x+1] - refGreen) * (ptr1[3*x+1] -refGreen) +
                  (ptr1[3*x+2] - refRed) * (ptr1[3*x+2] - refRed);

             if(sqrt(D) > TH){             //開根號讓數值大於門檻值的部分顯示 去除背景
           ptr2[3*(x+50)]=ptr1[3*(x)] ;
           ptr2[3*(x+50)+1]=ptr1[3*(x)+1] ;
           ptr2[3*(x+50)+2]=ptr1[3*(x)+2] ;
           }  
           }
           }
         
           for (int y=0; y<logoImg2->height; y++) {
           uchar* ptr1=(uchar*) (logoImg2->imageData +y*logoImg2->widthStep);
           uchar* ptr2=(uchar*) (frame->imageData +(y)*frame->widthStep);
           for (int x=0; x<logoImg2->width; x++) {    
               int D= (ptr1[3*x] - refBlue) * (ptr1[3*x] - refBlue) +
                  (ptr1[3*x+1] - refGreen) * (ptr1[3*x+1] -refGreen) +
                  (ptr1[3*x+2] - refRed) * (ptr1[3*x+2] - refRed);
                 
               if(sqrt(D) > TH){  
           ptr2[3*(x+215)]=ptr1[3*(x)] ;
           ptr2[3*(x+215)+1]=ptr1[3*(x)+1] ;
           ptr2[3*(x+215)+2]=ptr1[3*(x)+2] ;  
           }
           }
           }    

       
        for (int y=0; y<grey->height; y++) {
        uchar* ptr1=(uchar*) (frame->imageData +y*frame->widthStep);
        uchar* ptr2=(uchar*) (grey->imageData +y*grey->widthStep);
       
        for (int x=0; x<grey->width; x++) {
            if(ptr2[x]==255) {
            SkinPixelNumber++;
            SkinPixelX+=x;
            SkinPixelY+=y;
            }
//計算所有膚色值將x,y值總數相加
           
         }
         }
          if (SkinPixelNumber>0) { //抓膚色的中心點
          MouseX=(int)(SkinPixelX/SkinPixelNumber);
          MouseY=(int)(SkinPixelY/SkinPixelNumber)-120.0;
          }      
       
         for (int y=0; y<logoImg->height; y++) {
           uchar* ptr1=(uchar*) (logoImg->imageData +y*logoImg->widthStep);
           uchar* ptr2=(uchar*) (frame->imageData +(y+MouseY)*frame->widthStep);
           for (int x=0; x<logoImg->width; x++) {    
               int D= (ptr1[3*x] - refBlue) * (ptr1[3*x] - refBlue) +
                  (ptr1[3*x+1] - refGreen) * (ptr1[3*x+1] -refGreen) +
                  (ptr1[3*x+2] - refRed) * (ptr1[3*x+2] - refRed);
                 
               if(MouseX < 150)if(sqrt(D) > TH){    //判斷虛擬滑鼠小於視窗大小150時顯示左邊的圖片
           ptr2[3*(x+MouseX-50)]=ptr1[3*(x)] ;
           ptr2[3*(x+MouseX-50)+1]=ptr1[3*(x)+1] ;
           ptr2[3*(x+MouseX-50)+2]=ptr1[3*(x)+2] ;  
           }
           }
           }  
 
           for (int y=0; y<logoImg2->height; y++) {
           uchar* ptr1=(uchar*) (logoImg2->imageData +y*logoImg2->widthStep);
           uchar* ptr2=(uchar*) (frame->imageData +(y+MouseY)*frame->widthStep);
           for (int x=0; x<logoImg2->width; x++) {    
               int D= (ptr1[3*x] - refBlue) * (ptr1[3*x] - refBlue) +
                  (ptr1[3*x+1] - refGreen) * (ptr1[3*x+1] -refGreen) +
                  (ptr1[3*x+2] - refRed) * (ptr1[3*x+2] - refRed);
                 
               if(MouseX > 150)if(sqrt(D) > TH){    //判斷虛擬滑鼠大於視窗大小150時顯示右邊的圖片
           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", frame);
        cvShowImage("98360242", grey);
       
        SkinPixelNumber=0;
        SkinPixelX=0;
        SkinPixelY=0;
       
        cvWaitKey(20);
       
       
    }
    cvReleaseCapture(&capture);
    cvDestroyWindow("Webcam");
}



試後心得:
臨時抱佛腳的後果就是題目一下來完全不曉得該從何著手,最一開始畫線的部分只曉得要用cvLine卻忘了做長與寬位置的調整,所以線畫出來一直是歪的,不符合題目需求,考試過程最後也只有把圖片放到虛擬滑鼠上,但尚未做判斷,所以無法讓圖片跟著頭移動而變換皇冠。
考試結束,詢問有成功的同學了解題最主要目的,其實加入我們需要的材料後只要靠一些判斷及調整就可以完成。在找中心點時,只要一超出範圍就會不能run,所以在測試很多遍後想到可以在MouseY=(int)(SkinPixelY/SkinPixelNumber)這裡做更改,只要在後面-120.0就可以解決讓圖片改在中心點向上移動的位置的問題。放入圖片及去背後,因為我們是要讓圖片在左右兩邊做更動,所以設定MouseX小於視窗的一半為左邊,大於一半的範圍即為右邊,將這些基本設定都解決完畢後我的戴皇冠終於完成。