檢討:
這次的上機考我擅自用自備的視訊導致電腦出現錯誤無法正常讀取,回家之後發現錯誤才及時更正,可惜考試成績時間已經結束了......
在這裡修正一些小錯誤,人物超過畫面之所以會當機是因為圖片隨之超過鏡頭導致程式發生錯誤,我利用mouseX,mouseY當作鼠標目前位址,如果超過鏡頭則不處理因此布置產生當機。
for (int y=0; y<logoImg->height; y++) {
if(y+mouseY<480 &&(y+mouseY-20)>0){
uchar* ptr1=(uchar*) (logoImg->imageData +y*logoImg->widthStep);
uchar* ptr2=(uchar*) (logoImg2->imageData +y*logoImg2->widthStep);
uchar* ptr3=(uchar*) (frame->imageData +(y+mouseY-20)*frame->widthStep);
for (int x=0; x<logoImg->width; x++) {
if(mouseX<350){
if(ptr1[3*(x)]!=255&&ptr1[3*(x)+1]!=255&&ptr1[3*(x)+2]!=255){
ptr3[3*(x+mouseX)]=(uchar)(ptr1[3*(x)]);
ptr3[3*(x+mouseX)+1]=(uchar)(ptr1[3*(x)+1]);
ptr3[3*(x+mouseX)+2]=(uchar)(ptr1[3*(x)+2]);}
}
else{
if(ptr2[3*(x)]!=255&&ptr2[3*(x)+1]!=255&&ptr2[3*(x)+2]!=255){
ptr3[3*(x+mouseX)]=(uchar)(ptr2[3*(x)]);
ptr3[3*(x+mouseX)+1]=(uchar)(ptr2[3*(x)+1]);
ptr3[3*(x+mouseX)+2]=(uchar)(ptr2[3*(x)+2]);}
}
}
去背的寫法是如果皇冠的圖片那格pixel的RGB皆>+255表示這格是白色因此將不做任何動作,其他的畫素則取代原本的圖,如此一來便完成皇冠的去背!
if(ptr1[3*(x)]<255 && ptr1[3*(x)+1]<255 && ptr1[3*(x)+2]<255){
ptr2[3*(x+180)]=ptr1[3*(x)];
ptr2[3*(x+180)+1]=ptr1[3*(x)+1];
ptr2[3*(x+180)+2]=ptr1[3*(x)+2];
}
心得:
這次考試並不難而我也確實有做出來!但是視訊鏡頭因為過新導致與OPENCV衝突,須把封鎖截除才能正常使用,氣死我了!也算學了個教訓,拿到新東西,縱然品質很好,也要先動手測試,以免發生類似的狀況,得不償失!
考題「兩個皇冠」與最後一次的作業十分相像,只是一個是放在臉上一個放在頭上,然後再上X軸的判斷式判斷目前所屬的區域即可完成題目,但要注意的是圖片大小不得超過視訊影像的大小否則會錯誤,不過皇冠本來就比視訊影像要小因此不必在意,但圖片若超出影像範圍仍會發生不可預期的錯誤,因此應設立一個錯誤偵測,若人頭超過某個區域則不以理會這樣就不會造成程式的錯誤,這是我在考完試後才想出來的,重新檢查程式時發現的一個解決辦法。
不管考試結果如何,我最後還是把程式寫出來了。有達到學習的目的,這樣就夠了。
沒有留言:
張貼留言