問:chaincode(鍊碼) 程式碼 |
缺席
|
wayne_di
一般會員 ![]() 發表:5 回覆:3 積分:1 註冊:2008-04-11 發送簡訊給我 |
因為為初學者寫得不是很好,程式碼有點長,有勞高手指點。
問題:它無法順利的將整個封閉曲線編碼完 由於還不會貼圖所以我文字敘述一下 測試一:我用小畫家畫了一個矩形,將這圖案由下方的程式去跑,他只跑了最上面一條線的一半就停下來了。 測試二:我拿一張只有數字"1"的圖案來做試驗,他跑到快結束前停下來。 其他測試:拿其他數字的圖案,掃描僅掃數字的半邊就停下來 程式有些宣告解釋: 圖檔大小皆為長90,寬46 Wayne.bgr[ ][ ]←這個是我做完二值化會將圖資料存入此矩陣 buf[ ] [ ] ←大小為90*46 將他預設成1, 如果已經處理過的位置把它變成0,防止重複編碼 Wayne.chaincode←記錄編碼的號碼 我掃描方向為順時針 上→右上→右→右下→下→左下→左→左上 由上述的方向依照她的方向給他標號 0→1→2→3→4→5→6→7 我該如何改才能順利的將邊緣掃描完呢? [code cpp] int x,Chain_i,Chain_j,check; //記錄存儲位置 起始位置 上一點 現在位置 int exit,run; //離開迴圈的旗標 和 是否有直行過的旗標 int buf[90][46]; //記路標過的點位置 x=0;exit=0;run=0;check=0; //初始值設定 Memo3->Lines->Clear(); TXT5 = ""; //將buf裡面全部放一 當有記錄過的位置 則轉變成0 故只要buf[][]==0的地方就不要執行 for(int i=0;i<90;i ) for(int j=0;j<46;j ) buf[i][j]=1; /* i-1,j-1 | i-1,j | i-1,j 1 7 | 0 | 1 ----------------------- --------- i ,j-1 | i ,j | i ,j 1 6 | | 2 ----------------------- --------- i 1,j-1 | i 1,j | i 1,j 1 5 | 4 | 3 */ for(int i=1;i<89 && exit!=1;i ) { for(int j=1;j<45 && exit!=1;j ) { if(Wayne.bgr[i][j]==0)//找到陣列的第一個黑點 { Chain_i=i; Chain_j=j; buf[Chain_i][Chain_j]=0; //找到點 且確認八方有黑點 這樣才能繼續下去 while(~((Wayne.bgr[Chain_i-1][Chain_j-1]!=0) && (Wayne.bgr[Chain_i-1][Chain_j]!=0) && (Wayne.bgr[Chain_i-1][Chain_j 1]!=0) && (Wayne.bgr[Chain_i][Chain_j-1]!=0) && (Wayne.bgr[Chain_i][Chain_j 1]!=0) && (Wayne.bgr[Chain_i 1][Chain_j-1]!=0) && (Wayne.bgr[Chain_i 1][Chain_j]!=0) && (Wayne.bgr[Chain_i 1][Chain_j 1]!=0)) && check==0) { run=1; //編碼規則 1.找出下一點的方向 2.不能是上一點 3.確認是否繞一圈 if(Wayne.bgr[Chain_i-1][Chain_j]==0 && buf[Chain_i-1][Chain_j]==1 ) //上 0 { Wayne.chaincode[x]=0; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j; } else if(Wayne.bgr[Chain_i-1][Chain_j 1]==0 && buf[Chain_i-1][Chain_j 1]==1 ) //右上 1 { Wayne.chaincode[x]=1; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j 1; } else if(Wayne.bgr[Chain_i][Chain_j 1]==0 && buf[Chain_i][Chain_j 1]==1 ) //右 2 { Wayne.chaincode[x]=2; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i; Chain_j=Chain_j 1; } else if(Wayne.bgr[Chain_i 1][Chain_j 1]==0 && buf[Chain_i 1][Chain_j 1]==1 ) //右下 3 { Wayne.chaincode[x]=3; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j 1; } else if(Wayne.bgr[Chain_i 1][Chain_j]==0 && buf[Chain_i 1][Chain_j]==1 ) //下 4 { Wayne.chaincode[x]=4; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j; } else if(Wayne.bgr[Chain_i 1][Chain_j-1]==0 && buf[Chain_i 1][Chain_j-1]==1 ) //左下 5 { Wayne.chaincode[x]=5; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i 1; Chain_j=Chain_j-1; } else if(Wayne.bgr[Chain_i][Chain_j-1]==0 && buf[Chain_i][Chain_j-1]==1 ) //左 6 { Wayne.chaincode[x]=6; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i; Chain_j=Chain_j-1; } else if(Wayne.bgr[Chain_i-1][Chain_j-1]==0 && buf[Chain_i-1][Chain_j-1]==1 ) //右上 7 { Wayne.chaincode[x]=7; buf[Chain_i][Chain_j]=0; x ; Chain_i=Chain_i-1; Chain_j=Chain_j-1; } else check=1; } if(run==1) exit=1; } } } for(int k=0;k Memo3->Text = TXT5 " "; Edit7->Text = IntToStr(x); [/code] 第一次PO 還有需要補充哪些說明的話,在跟我說。 我有把程式修改過了 目前矩形可以順利編碼完成,但是數字的1還差4個像素,而其他數字仍然只能跑一半左右, 拜託各位大大幫我修改一下吧!! 祝:順心 /*按部就班,事情簡單*\
------
/*Inch by inch, it's a cinch*\ |
wayne_di
一般會員 ![]() 發表:5 回覆:3 積分:1 註冊:2008-04-11 發送簡訊給我 |
|
jasonma168
一般會員 ![]() ![]() 發表:39 回覆:33 積分:14 註冊:2002-05-24 發送簡訊給我 |
|
wayne_di
一般會員 ![]() 發表:5 回覆:3 積分:1 註冊:2008-04-11 發送簡訊給我 |
------
/*Inch by inch, it's a cinch*\ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |