.png)
#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軸位子加為微調向左
沒有留言:
張貼留言