2013年5月26日 星期日

98360365_吳昊穎_上機考心得












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

#define refBlue 10
#define refGreen 10
#define refRed 10

#define TH1 150


int main()
{
    IplImage * src;
    IplImage * grey;
    IplImage * img;
    IplImage * logoImg1;
    IplImage * logoImg2;
    IplImage * logoImg3;
    IplImage * logoImg4;
    IplImage* mergeImg ;
   
    CvCapture * capture = cvCreateCameraCapture(0);
    src = cvQueryFrame(capture);
    grey = cvCreateImage(cvSize(src->width,src->height), IPL_DEPTH_8U, 1);
    img = cvCreateImage(cvSize(src->width,src->height), IPL_DEPTH_8U, 3);
    mergeImg = cvCreateImage(cvSize(src->width,src->height), IPL_DEPTH_8U, 3);
   
   
       
   
    logoImg1=cvLoadImage("p1.jpg");
    logoImg2=cvLoadImage("p2.jpg");
   // logoImg3=cvLoadImage("p3.jpg");
   // logoImg4=cvLoadImage("p4.jpg");
    while(true)
    {  
         cvCvtColor(src,img, CV_BGR2YCrCb);
         cvInRangeS(img,cvScalar(0,137,77), cvScalar(240,177,127),grey);
         src = cvQueryFrame(capture);
         mergeImg = cvCloneImage(src);
         cvShowImage("webcam2",grey);
       
       
         cvLine(mergeImg,cvPoint(325,0),cvPoint(325,515),CV_RGB(255,0,0),3,8,0);
       
       int mouseX=0;
       int mouseY=0;

       float redPixelNumber=0;
       float redPixelX=0;
       float redPixelY=0;
     
        for (int y=0; y<src->height; y++) {
            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(mergeImg,cvPoint(mouseX-10,mouseY),cvPoint(mouseX+10,mouseY),CV_RGB(255,0,0),2,8,0);
              //  cvLine(mergeImg,cvPoint(mouseX,mouseY-10),cvPoint(mouseX,mouseY+10),CV_RGB(255,0,0),2,8,0);
         
         
         for (int y=0; y<logoImg1->height; y++) {
            uchar* ptr1=(uchar*) (logoImg1->imageData +y*logoImg1->widthStep);
            uchar* ptr2=(uchar*) (mergeImg->imageData +y*mergeImg->widthStep);
            uchar* ptr3=(uchar*) (logoImg2->imageData +y*logoImg2->widthStep);
           for (int x=0; x<logoImg1->width; x++) {
                            if(ptr1[3*x]>=0 && ptr1[3*x]<240)
                            {                            //圖片中不是白色的部份加到視訊裡
                                ptr2[3*(x+100)]=ptr1[3*(x)];
                                ptr2[3*(x+100)+1]=ptr1[3*(x)+1];               //圖片加入視訊
                                ptr2[3*(x+100)+2]=ptr1[3*(x)+2];
                               
                            }
           }
            for (int x=0; x<logoImg2->width; x++) {
                           
                            if(ptr3[3*x]>=0 && ptr3[3*x]<230){  
                                ptr2[3*(x+400)]=ptr3[3*(x)];
                                ptr2[3*(x+400)+1]=ptr3[3*(x)+1];               //圖片加入視訊
                                ptr2[3*(x+400)+2]=ptr3[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-200)*mergeImg->widthStep);
          //  uchar* ptr3=(uchar*) (logoImg2->imageData +(y+mouseY)*logoImg2->widthStep);
           for (int x=0; x<logoImg1->width; x++) {
               if(mouseX<310)
                            if(ptr1[3*x]>=0 && ptr1[3*x]<250)
                            {                            //圖片中不是白色的部份加到視訊裡
                                ptr2[3*(x+mouseX-30)]=ptr1[3*(x)];
                                ptr2[3*(x+mouseX-30)+1]=ptr1[3*(x)+1];               //圖片加入視訊
                                ptr2[3*(x+mouseX-30)+2]=ptr1[3*(x)+2];
                               
                            }
                           
            }  
       }
     
        for (int y=0; y<logoImg2->height; y++) {
            //uchar* ptr1=(uchar*) (logoImg1->imageData +(y+mouseY)*logoImg1->widthStep);
            uchar* ptr2=(uchar*) (mergeImg->imageData +(y+mouseY-200)*mergeImg->widthStep);
            uchar* ptr3=(uchar*) (logoImg2->imageData +y*logoImg2->widthStep);
           for (int x=0; x<logoImg2->width; x++) {
                         if(mouseX>340)
                            if(ptr3[3*x]>=0 && ptr3[3*x]<230){  
                                ptr2[3*(x+mouseX+10)]=ptr3[3*(x)];
                                ptr2[3*(x+mouseX+10)+1]=ptr3[3*(x)+1];               //圖片加入視訊
                                ptr2[3*(x+mouseX+10)+2]=ptr3[3*(x)+2];
                                }
                            }
                           
            }  
     
   
     
              cvShowImage("webcam",mergeImg);  
             
         char key = cvWaitKey(33);
         if(key == 27)break;
       
    }
}

DeBug 過程(一):
 uchar* ptr2=(uchar*) (src->imageData +(y+mouseY-200)*mergeImg->widthStep);

error:
[Warning] comparison is always true due to limited range of data type

解決方法:
mergeImg = cvCloneImage(src);
 uchar* ptr2=(uchar*) (mergeImg->imageData +(y+mouseY-200)*mergeImg->widthStep);

DeBug 過程(二):
皇冠出現的位子不在正頭頂上


解決方法:
(因素一)可能穿太接近皮膚色的衣服(例如:紅色)在便是時可能會辨識成皮膚色,導致計算出的中心點並非你所想的位子。
(因素二)微調計算出中心點的x-y軸
 uchar* ptr2=(uchar*) (mergeImg->imageData +(y+mouseY-200)*mergeImg->widthStep);
//微調中心點y軸位置減為微調向上

ptr2[3*(x+mouseX+10)]=ptr3[3*(x)];
ptr2[3*(x+mouseX+10)+1]=ptr3[3*(x)+1];               //圖片加入視訊
ptr2[3*(x+mouseX+10)+2]=ptr3[3*(x)+2];
//微調中心點x軸位子加為微調向左




















沒有留言:

張貼留言