全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2626
推到 Plurk!
推到 Facebook!

問:chaincode(鍊碼) 程式碼

缺席
wayne_di
一般會員


發表:5
回覆:3
積分:1
註冊:2008-04-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-05-20 23:53:01 IP:140.116.xxx.xxx 訂閱
因為為初學者寫得不是很好,程式碼有點長,有勞高手指點。

問題:它無法順利的將整個封閉曲線編碼完

由於還不會貼圖所以我文字敘述一下
測試一:我用小畫家畫了一個矩形,將這圖案由下方的程式去跑,他只跑了最上面一條線的一半就停下來了。
測試二:我拿一張只有數字"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 TXT5 = TXT5 Wayne.chaincode[k] ",";
Memo3->Text = TXT5 " ";
Edit7->Text = IntToStr(x);

[/code]

第一次PO 還有需要補充哪些說明的話,在跟我說。

我有把程式修改過了
目前矩形可以順利編碼完成,但是數字的1還差4個像素,而其他數字仍然只能跑一半左右,
拜託各位大大幫我修改一下吧!!

祝:順心

/*按部就班,事情簡單*\
------
/*Inch by inch, it's a cinch*\
編輯記錄
wayne_di 重新編輯於 2008-05-22 16:23:20, 註解 無‧
wayne_di 重新編輯於 2008-05-23 13:05:37, 註解 無‧
wayne_di
一般會員


發表:5
回覆:3
積分:1
註冊:2008-04-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-05-22 17:48:09 IP:140.116.xxx.xxx 訂閱
可能是寫得太雜亂無序,所以沒人回吧。
不過我剛剛跟學長討論過後已經解決了,可以順利編碼完成,還是謝謝大家。
------
/*Inch by inch, it's a cinch*\
jasonma168
一般會員


發表:39
回覆:33
積分:14
註冊:2002-05-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-08-26 09:59:00 IP:163.23.xxx.xxx 訂閱
問題已經解決,是否願意貼出來跟大家分享,謝謝!

如果每個人都是只想得答案,而不想分享,那這個論壇很快就沒人氣了。
wayne_di
一般會員


發表:5
回覆:3
積分:1
註冊:2008-04-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-29 12:00:35 IP:140.116.xxx.xxx 訂閱
------
/*Inch by inch, it's a cinch*\
系統時間:2024-04-26 1:01:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!