if( (Image1->height) < src->height) {
//mergeImg=cvCloneImage(pImg) ;
for (int y=0; y<Image1->height; y++) {
uchar* ptr1=(uchar*) (Image1->imageData +y*Image1->widthStep);
uchar* ptr2=(uchar*) (src->imageData +(y)*src->widthStep);
for (int x=0; x<Image1->width; x++) {
if(ptr1[3*(x)]<250&& ptr1[3*(x)+1]<250&& ptr1[3*(x)+2]<250){
ptr2[3*(x)]=ptr1[3*(x)];
ptr2[3*(x)+1]=ptr1[3*(x)+1];
ptr2[3*(x)+2]=ptr1[3*(x)+2];
}
}
}
}
if( (Image2->height) < src->height) {
//mergeImg=cvCloneImage(pImg) ;
for (int y=0; y<Image2->height; y++) {
uchar* ptr1=(uchar*) (Image2->imageData +y*Image2->widthStep);
uchar* ptr2=(uchar*) (src->imageData +550+(y)*src->widthStep); //更改第二章圖適合的位置
for (int x=0; x<Image2->width; x++) {
if(ptr1[3*(x)]<250&& ptr1[3*(x)+1]<250&& ptr1[3*(x)+2]<250){
ptr2[3*(x)]=ptr1[3*(x)];
ptr2[3*(x)+1]=ptr1[3*(x)+1];
ptr2[3*(x)+2]=ptr1[3*(x)+2];
}
}
}
}
以上程式碼為將要放的兩張皇冠放置在畫面中,上次無法完成老師考試的要求,回家後仔細想想,發現到之前的錯誤是由於放置第一張和第二張皇冠位置會相同,導致錯誤,程式碼跑不成功,所以我將視第二張圖的位置水平增加。
cvCvtColor(src, img, CV_BGR2YCrCb);
cvInRangeS(img, cvScalar(0,137,77), cvScalar(256,177,127),grey);
for (int y=0; y<grey->height; y++) {
uchar* ptr1=(uchar*) (grey->imageData +y*grey->widthStep);
for (int x=0; x<grey->width; x++) {
if(ptr1[x]==255){
PixelNumber++;
PixelX+=x;
PixelY+=y;
}
}
}
if (PixelNumber>0) {
mouseX=PixelX/PixelNumber;
mouseY=PixelY/PixelNumber;
}
上述為將可以針對黃種人臉部膚色轉換成電腦才看得懂的顏色,是膚色時變為白色。經由兩個for迴圈抓住所有臉上膚色位置,然後得到重心位置。
int mousex1=mouseX;
int mousey1=mouseY;
if(mousex1<src->width/2){ //左邊皇冠
if( (Image1->height+mousey1) < src->height) { //小於影像大小才會執行
for (int y=0; y<Image1->height; y++) {
uchar* ptr1=(uchar*) (Image1->imageData +y*Image1->widthStep);
uchar* ptr2=(uchar*) (src->imageData +(mousey1+(y)-120)*src-> widthStep); //帽子在臉部上方
for (int x=0; x<Image1->width; x++) {
if(ptr1[3*(x)]<250&& ptr1[3*(x)+1]<250&& ptr1[3*(x)+2]<250){
ptr2[3*(x+mousex1)]=ptr1[3*( x)];
ptr2[3*(x+mousex1)+1]=ptr1[3* (x)+1];
ptr2[3*(x+mousex1)+2]=ptr1[3* (x)+2];
}
}
}
}
}
else{ //右邊皇冠
if( (Image2->height+mousey1) < src->height) {
//mergeImg=cvCloneImage(pImg) ;
for (int y=0; y<Image2->height; y++) {
uchar* ptr1=(uchar*) (Image2->imageData +y*Image2->widthStep);
uchar* ptr2=(uchar*) (src->imageData+(mousey1+(y)- 120)*src->widthStep);
for (int x=0; x<Image2->width; x++) {
if(ptr1[3*(x)]<250&& ptr1[3*(x)+1]<250&& ptr1[3*(x)+2]<250){
ptr2[3*(x+mousex1)]=ptr1[3*( x)];
ptr2[3*(x+mousex1)+1]=ptr1[3* (x)+1];
ptr2[3*(x+mousex1)+2]=ptr1[3* (x)+2];
}
}
}
}
}
上述為戴上帽子部分程式碼,不過因為當時燈光太暗,導致視訊無法精確地抓取我臉部顏色、找出臉部中間位置,所以帽子帶上的位置會怪怪的,沒有那麼完美。
心得:
很開心可以完成老師要求我做到的作業,一開始只知道這部分程式碼是幹嘛,但是卻不知道為什麼程式碼是這樣寫,跟同學一起研究後不懂的地方再詢問老師時,老師很熱心地解釋,讓我豁然開朗。但是判斷黃種人膚色的範圍,為什麼是這個數值(0,137,77)、(255,177,127)。這個問題還值得我們去討論。
沒有留言:
張貼留言