2013年5月20日 星期一

00360461黃韋晟




#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* mergeImg = NULL;
    IplImage* pImg = NULL;
    IplImage* pImg2 = NULL;  
    IplImage* pImg1 = NULL;
    IplImage* logoImg= NULL;
    IplImage* f1=NULL;
    IplImage* f2=NULL;
    int mouseX=0;
    int mouseY=0;
    CvPoint P1,P2,P3,P4;
    CvScalar Color;
    logoImg=cvLoadImage("12311.png");
    f1=cvLoadImage("12311.png");
    f2=cvLoadImage("12312.png");
    capture=cvCreateCameraCapture(0);
    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;

    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;
      }
     
      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,cvPoint(160,0),cvPoint(160,240),Color,2,8,0);
      //cvLine(pImg2,P3,P4,Color,2,8,0);

 for (int y=0; y<f1->height; y++) {
      uchar* ptr1=(uchar*) (pImg2->imageData +(y)*pImg2->widthStep);
      uchar* ptr2=(uchar*) (f1->imageData + y*f1->widthStep);
      uchar* ptr3=(uchar*) (f2->imageData + y*f2->widthStep);
      for (int x=0; x<f1->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<f2->width; x++) {    
       if(ptr3[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] ;
       }    
       }
       }
   
 //f1
     
      for (int y=0; y<logoImg->height; y++) {
      uchar* ptr1=(uchar*) (pImg2->imageData +(y+mouseY-140)*pImg2->widthStep);
      uchar* ptr2=(uchar*) (logoImg->imageData + y*logoImg->widthStep);
      for (int x=0; x<logoImg->width; x++) {    
       if(mouseX<150)if(ptr2[3*x]!=255){
       ptr1[3*(x+mouseX-100)]=ptr2[3*(x)] ;
       ptr1[3*(x+mouseX-100)+1]=ptr2[3*(x)+1] ;
       ptr1[3*(x+mouseX-100)+2]=ptr2[3*(x)+2] ;}  
       }
}
//f2
for (int y=0; y<f2->height; y++) {
      uchar* ptr1=(uchar*) (pImg2->imageData +(y+mouseY-130)*pImg2->widthStep);
      uchar* ptr2=(uchar*) (f2->imageData + y*f2->widthStep);
      for (int x=0; x<f2->width; x++) {    
       if(mouseX>170)if(ptr2[3*x]!=255){
       ptr1[3*(x+mouseX-20)]=ptr2[3*(x)] ;
       ptr1[3*(x+mouseX-20)+1]=ptr2[3*(x)+1] ;
       ptr1[3*(x+mouseX-20)+2]=ptr2[3*(x)+2] ;}  
       }
}
     

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

 cvWaitKey(10);
 
}

 }

雖然考試的時候只用CVLINE做出中心的紅線,然後參考鍾昊在部落格中的鋼鐵人,
之後把我所選的兩張皇冠把圖的比例縮小之後,把原本會根據所偵測到的白色平均點而移動的圖固定住,把MOUSEX與MOUSEY取消,直接打入圖片所要放的座標上, 再來就剩下判斷紅線左邊與右邊的白色平均,出現皇冠。
第一個圖 F1  是根據在MOUSE的X座標小於紅線X座標,左邊出現白色部分比較多時就執行F1底下的FOR迴圈,反之,F2的圖是根據MOUSEX的座標大於紅線X座標,右邊出現白色部分比較多時就執行F2底下的FOR迴圈。
這樣就大致上完成了,剩下就是調整一下座標讓圖對上自己的頭。

心得:
都有程式碼可以參考,平常上課如果有用心理解再多多練習,寫OPENCV的時候應該可以把相似的程式碼放到對的位置上,再加以修改。

沒有留言:

張貼留言