
for (int y=0; y<(frame2->height)/4; y++)
{
uchar* ptr1=(uchar*) (frame->imageData +y*frame->widthStep);
int big=0,n=0,left=0,right=0;
for (int x=0; x<frame2->width; x++) {
if(ptr1[3*(x)]<50 && ptr1[3*(x)+1]<50 && ptr1[3*(x)+2]<50){
n++;
if(n>big){//尋找最大目標色塊
big=n; right=x; left=right-n;
}
}
else{n=0;}
}
if(big>test){// 判別左右半部的偵測
MyY=y; Myleft=left; Myright=right; test=big;
}
}
以上部分主要是對於偵測色塊的範圍與定位點作處理,認為是這次考是最核心的重點,對於目標的判斷準確度會直接影響顯示的結果(圖)
if(y+MyY<480 &&(y+MyY-20)>0){ //防止偵測目標超過鏡頭範圍造成shut down
uchar* ptr1=(uchar*) (logoImg->imageData +y*logoImg->widthStep);
uchar* ptr2=(uchar*) (logoImg2->imageData +y*logoImg2->widthStep);
uchar* ptr7=(uchar*) (frame->imageData +(y+MyY-20)*frame->widthStep);
for (int x=0; x<logoImg->width; x++) {
if(Myleft<325){
if(ptr1[3*(x)]==255&&ptr1[3*(x)+1]==255&&ptr1[3*(x)+2]==255)continue;
ptr7[3*(x+Myleft)]=(uchar)(ptr1[3*(x)]);
ptr7[3*(x+Myleft)+1]=(uchar)(ptr1[3*(x)+1]);
ptr7[3*(x+Myleft)+2]=(uchar)(ptr1[3*(x)+2]);
}
else{
if(ptr2[3*(x)]==255&&ptr2[3*(x)+1]==255&&ptr2[3*(x)+2]==255)continue;
ptr7[3*(x+Myleft)]=(uchar)(ptr2[3*(x)]);
ptr7[3*(x+Myleft)+1]=(uchar)(ptr2[3*(x)+1]);
ptr7[3*(x+Myleft)+2]=(uchar)(ptr2[3*(x)+2]);
}
}
當偵測目標移動至右半邊得重新定位,讓后冠隨著偵測目標移動而王冠就重回原位址
心得:
對於此次考試內容得知自己的code能力明顯不足,對於影像處理的概念非常模糊,所以為了補足此次考試的核心概念請教了較常處理此類視覺影像的同學。必須釐清撰寫程式的方向與概念,補足對於openCV的function用法與定位概念的理解(影像處理XY軸的定位方式),感謝友人的技術支援才能完成此次補繳。
沒有留言:
張貼留言