本次的上機考為自教視訊程式以來所有課程的應用。基本上沒甚麼難度,花最久時間的部分就是去背---其實是我忘了怎麼寫,後來請教同學得知是透明人那堂課所教的,於是就去參考我那時候的作業程式碼。
基本上去背的程式碼我是這樣寫的:
if(ptr1[3*(x)]<252 && ptr1[3*(x)+1]<252 && ptr1[3*(x)+2]<252){
ptr2[3*(x+150)]=ptr1[3*(x)];
ptr2[3*(x+150)+1]=ptr1[3*(x)+1];
ptr2[3*(x+150)+2]=ptr1[3*(x)+2];
}
此判斷為當圖片顏色為不是"白色"時,將其非白顏色所構成的圖形"貼"到視訊上,如此完成了去背的部分。
另一個稍微卡關的地方為"膚色的判斷"。因為我的程式碼是以"臉的膚色"為依據,判斷臉出現在x>or<320時(因為使用視訊為640*480),會依據狀況做出變動。
程式碼如下:
if( mouseX <= 320) {
for (int y=0; y<logoImg1->height; y++) {
uchar* ptr1=(uchar*) (logoImg1->imageData +y*logoImg1->widthStep);
uchar* ptr2=(uchar*) (src->imageData +(y+mouseY-230)*src->widthStep);
for (int x=0; x<logoImg1->width; x++) {
if(ptr1[3*(x)]<252 && ptr1[3*(x)+1]<252 && ptr1[3*(x)+2]<252){
ptr2[3*(x+mouseX-150)]=ptr1[3*(x)];
ptr2[3*(x+mouseX-150)+1]=ptr1[3*(x)+1];
ptr2[3*(x+mouseX-150)+2]=ptr1[3*(x)+2];
}
}
}
}
if( mouseX >= 320){
for (int y=0; y<logoImg2->height; y++) {
uchar* ptr1=(uchar*) (logoImg2->imageData +y*logoImg2->widthStep);
uchar* ptr2=(uchar*) (src->imageData +(y+mouseY-230)*src->widthStep);
for (int x=0; x<logoImg1->width; x++) {
if(ptr1[3*(x)]<250 && ptr1[3*(x)+1]<250 && ptr1[3*(x)+2]<250){
ptr2[3*(x+mouseX-90)]=ptr1[3*(x)];
ptr2[3*(x+mouseX-90)+1]=ptr1[3*(x)+1];
ptr2[3*(x+mouseX-90)+2]=ptr1[3*(x)+2];
}
}
}
}
這兩部分我認為是此次考試重點所在,雖說在考試當中沒能來的及完成,但回家進一步的寫出來,總體來說還是非常有收穫的!
沒有留言:
張貼留言