#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的時候應該可以把相似的程式碼放到對的位置上,再加以修改。
沒有留言:
張貼留言