線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1430
推到 Plurk!
推到 Facebook!

鏈碼問題

答題得分者是:syntax
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-16 19:00:43 IP:125.224.xxx.xxx 訂閱
各位大大你們好:

我修改此程式出現如圖之情形,不知是為何麻煩大大們幫我看看。
此程式為 wayne_di 大大所分享=> http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=95074
修改程式碼為如圖下方:


[code cpp]
void __fastcall TForm1::Button19Click(TObject *Sender) //=>使用一按鍵執行
{
/*原始程式宣告解釋:
圖檔大小皆為長90,寬46
Wayne.bgr[ ][ ]←這個是我做完二值化會將圖資料存入此矩陣 =>這我把它改成image03_Gray
buf[ ] [ ] ←大小為90*46 將他預設成1, 如果已經處理過的位置把它變成0,防止重複編碼 =>這我把它改成640*480
Wayne.chaincode←記錄編碼的號碼 =>這的意思不太了解,不知如何改,所以用雙斜線跳過
我掃描方向為順時針 上→右上→右→右下→下→左下→左→左上
由上述的方向依照她的方向給他標號 0→1→2→3→4→5→6→7 */
//===================================
int x,Chain_i,Chain_j,check; //記錄存儲位置 起始位置 上一點 現在位置
int exit,run; //離開迴圈的旗標 和 是否有直行過的旗標
int buf[640][480]; //記路標過的點位置
x=0;exit=0;run=0;check=0; //初始值設定
Memo1->Lines->Clear();
//TXT5 = "";//=>不知為何用途所以用斜線跳過了
Image2->Picture->Bitmap->PixelFormat = (TPixelFormat)6;
//將buf裡面全部放一 當有記錄過的位置 則轉變成0 故只要buf[][]==0的地方就不要執行
for(int i=0;iPicture->Height;i )
for(int j=0;jPicture->Width;j )
buf[i][j]=255;
/*
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<479 && exit!=1;i ) //exit=1十 表示已執行完輪廓編碼
{
for(int j=1;j<639 && exit!=1;j )
{
if(image03_Gray[i][j]==255)//找到陣列的第一個黑點
{
Chain_i=i;
Chain_j=j;
buf[Chain_i][Chain_j]=0;
int position=0; //position=0 為由0 開 始 的 順 時 針 方 向 收 尋
//position=1 為由4開始的順時針方向收尋=>此行我已刪除
//找到點 且確認八方有黑點 這樣才能繼續下去
while(~((image03_Gray[Chain_i-1][Chain_j-1]!=0)
&& (image03_Gray[Chain_i-1][Chain_j]!=0)
&& (image03_Gray[Chain_i-1][Chain_j 1]!=0)
&&(image03_Gray[Chain_i][Chain_j-1]!=0)
&& (image03_Gray[Chain_i][Chain_j 1]!=0)
&&(image03_Gray[Chain_i 1][Chain_j-1]!=0)
&& (image03_Gray[Chain_i 1][Chain_j]!=0)
&& (image03_Gray[Chain_i 1][Chain_j 1]!=0))
&& check==0) //check=0 表示已經無下一點可編碼
{
run=1;
//編碼規則 1.找出下一點的方向 2.不能是上一點 3.確認是否繞一圈
if(position==0)
{
if(image03_Gray[Chain_i-1][Chain_j]==0 && buf[Chain_i-1][Chain_j]==255 ) //上 0
{
// Wayne.chaincode[x]=0; //記錄編碼
buf[Chain_i][Chain_j]=0; //標記以編碼的位置
x ;
Chain_i=Chain_i-1; //以下一個方向當起點
Chain_j=Chain_j;
position=0; //還是以0開始的順時針編碼
}
else if(image03_Gray[Chain_i-1][Chain_j 1]==0 && buf[Chain_i-1][Chain_j 1]==255 ) //右上 1
{
//Wayne.chaincode[x]=1;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i-1;
Chain_j=Chain_j 1;
position=0;
}
else if(image03_Gray[Chain_i][Chain_j 1]==0 && buf[Chain_i][Chain_j 1]==255 ) //右 2
{
//Wayne.chaincode[x]=2;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i;
Chain_j=Chain_j 1;
position=0;
}
else if(image03_Gray[Chain_i 1][Chain_j 1]==0 && buf[Chain_i 1][Chain_j 1]==255 ) //右下 3
{
//Wayne.chaincode[x]=3;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i 1;
Chain_j=Chain_j 1;
position=0;
}
else if(image03_Gray[Chain_i 1][Chain_j]==0 && buf[Chain_i 1][Chain_j]==255 ) //下 4
{
//Wayne.chaincode[x]=4;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i 1;
Chain_j=Chain_j;
position=1;
}
else if(image03_Gray[Chain_i 1][Chain_j-1]==0 && buf[Chain_i 1][Chain_j-1]==255 ) //左下 5
{
//Wayne.chaincode[x]=5;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i 1;
Chain_j=Chain_j-1;
position=1;
}
else if(image03_Gray[Chain_i][Chain_j-1]==0 && buf[Chain_i][Chain_j-1]==255 ) //左 6
{
//Wayne.chaincode[x]=6;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i;
Chain_j=Chain_j-1;
position=1;
}
else if(image03_Gray[Chain_i-1][Chain_j-1]==0 && buf[Chain_i-1][Chain_j-1]==255 ) //右上 7
{
//Wayne.chaincode[x]=7;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i-1;
Chain_j=Chain_j-1;
position=1;
}
else
check=1;
}
else{
if(image03_Gray[Chain_i 1][Chain_j]==0 && buf[Chain_i 1][Chain_j]==255 ) //下 4
{
//Wayne.chaincode[x]=4;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i 1;
Chain_j=Chain_j;
position=1;
}
else if(image03_Gray[Chain_i 1][Chain_j-1]==0 && buf[Chain_i 1][Chain_j-1]==255 ) //左下 5
{
// Wayne.chaincode[x]=5;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i 1;
Chain_j=Chain_j-1;
position=1;
}
else if(image03_Gray[Chain_i][Chain_j-1]==0 && buf[Chain_i][Chain_j-1]==255 ) //左 6
{
//Wayne.chaincode[x]=6;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i;
Chain_j=Chain_j-1;
position=1;
}
else if(image03_Gray[Chain_i-1][Chain_j-1]==0 && buf[Chain_i-1][Chain_j-1]==255 ) //右上 7
{
//Wayne.chaincode[x]=7;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i-1;
Chain_j=Chain_j-1;
position=1;
}
else if(image03_Gray[Chain_i-1][Chain_j]==0 && buf[Chain_i-1][Chain_j]==255 ) //上 0
{
//Wayne.chaincode[x]=0;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i-1;
Chain_j=Chain_j;
position=0;
}
else if(image03_Gray[Chain_i-1][Chain_j 1]==0 && buf[Chain_i-1][Chain_j 1]==255 ) //右上 1
{
//Wayne.chaincode[x]=1;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i-1;
Chain_j=Chain_j 1;
position=0;
}
else if(image03_Gray[Chain_i][Chain_j 1]==0 && buf[Chain_i][Chain_j 1]==255 ) //右 2
{
// Wayne.chaincode[x]=2;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i;
Chain_j=Chain_j 1;
position=0;
}
else if(image03_Gray[Chain_i 1][Chain_j 1]==0 && buf[Chain_i 1][Chain_j 1]==255 ) //右下 3
{
//Wayne.chaincode[x]=3;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i 1;
Chain_j=Chain_j 1;
position=0;
}
else
check=1;
}
}
if(run==1)
exit=1;
}
}
}
}
[/code]

此程式我是要用在尋找640*480裡的白色方型輪廓,煩請各位大大們幫我看看 到底是哪裡錯誤了。
PS:有顏色字型的也煩請各位大大 詳解
"在此先說聲謝謝"
------
新手報到
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-17 10:10:49 IP:59.120.xxx.xxx 訂閱
image03_Gray 中有無窮呼叫迴圈之類的問題


===================引 用 913028 文 章===================
各位大大你們好:

我修改此程式出現如圖之情形,不知是為何麻煩大大們幫我看看。
此程式為 wayne_di 大大所分享=> http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=95074
修改程式碼為如圖下方:


[code cpp]
void __fastcall TForm1::Button19Click(TObject *Sender) //=>使用一按鍵執行
{
/*原始程式宣告解釋:
圖檔大小皆為長90,寬46
Wayne.bgr[ ][ ]←這個是我做完二值化會將圖資料存入此矩陣 =>這我把它改成image03_Gray
buf[ ] [ ] ←大小為90*46 將他預設成1, 如果已經處理過的位置把它變成0,防止重複編碼 =>這我把它改成640*480
Wayne.chaincode←記錄編碼的號碼 =>這的意思不太了解,不知如何改,所以用雙斜線跳過
我掃描方向為順時針 上→右上→右→右下→下→左下→左→左上
由上述的方向依照她的方向給他標號 0→1→2→3→4→5→6→7 */
//===================================
int x,Chain_i,Chain_j,check; //記錄存儲位置 起始位置 上一點 現在位置
int exit,run; //離開迴圈的旗標 和 是否有直行過的旗標
int buf[640][480]; //記路標過的點位置
x=0;exit=0;run=0;check=0; //初始值設定
Memo1->Lines->Clear();
//TXT5 = "";//=>不知為何用途所以用斜線跳過了
Image2->Picture->Bitmap->PixelFormat = (TPixelFormat)6;
//將buf裡面全部放一 當有記錄過的位置 則轉變成0 故只要buf[][]==0的地方就不要執行
for(int i=0;i
//position=1 為由4開始的順時針方向收尋=>此行我已刪除
//找到點 且確認八方有黑點 這樣才能繼續下去
while(~((image03_Gray[Chain_i-1][Chain_j-1]!=0)
&& (image03_Gray[Chain_i-1][Chain_j]!=0)
&& (image03_Gray[Chain_i-1][Chain_j 1]!=0)
&&(image03_Gray[Chain_i][Chain_j-1]!=0)
&& (image03_Gray[Chain_i][Chain_j 1]!=0)
&&(image03_Gray[Chain_i 1][Chain_j-1]!=0)
&& (image03_Gray[Chain_i 1][Chain_j]!=0)
&& (image03_Gray[Chain_i 1][Chain_j 1]!=0))
&& check==0) //check=0 表示已經無下一點可編碼
{
run=1;
//編碼規則 1.找出下一點的方向 2.不能是上一點 3.確認是否繞一圈
if(position==0)
{
if(image03_Gray[Chain_i-1][Chain_j]==0 && buf[Chain_i-1][Chain_j]==255 ) //上 0
{
// Wayne.chaincode[x]=0; //記錄編碼
buf[Chain_i][Chain_j]=0; //標記以編碼的位置
x ;
Chain_i=Chain_i-1; //以下一個方向當起點
Chain_j=Chain_j;
position=0; //還是以0開始的順時針編碼
}
else if(image03_Gray[Chain_i-1][Chain_j 1]==0 && buf[Chain_i-1][Chain_j 1]==255 ) //右上 1
{
//Wayne.chaincode[x]=1;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i-1;
Chain_j=Chain_j 1;
position=0;
}
else if(image03_Gray[Chain_i][Chain_j 1]==0 && buf[Chain_i][Chain_j 1]==255 ) //右 2
{
//Wayne.chaincode[x]=2;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i;
Chain_j=Chain_j 1;
position=0;
}
else if(image03_Gray[Chain_i 1][Chain_j 1]==0 && buf[Chain_i 1][Chain_j 1]==255 ) //右下 3
{
//Wayne.chaincode[x]=3;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i 1;
Chain_j=Chain_j 1;
position=0;
}
else if(image03_Gray[Chain_i 1][Chain_j]==0 && buf[Chain_i 1][Chain_j]==255 ) //下 4
{
//Wayne.chaincode[x]=4;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i 1;
Chain_j=Chain_j;
position=1;
}
else if(image03_Gray[Chain_i 1][Chain_j-1]==0 && buf[Chain_i 1][Chain_j-1]==255 ) //左下 5
{
//Wayne.chaincode[x]=5;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i 1;
Chain_j=Chain_j-1;
position=1;
}
else if(image03_Gray[Chain_i][Chain_j-1]==0 && buf[Chain_i][Chain_j-1]==255 ) //左 6
{
//Wayne.chaincode[x]=6;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i;
Chain_j=Chain_j-1;
position=1;
}
else if(image03_Gray[Chain_i-1][Chain_j-1]==0 && buf[Chain_i-1][Chain_j-1]==255 ) //右上 7
{
//Wayne.chaincode[x]=7;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i-1;
Chain_j=Chain_j-1;
position=1;
}
else
check=1;
}
else{
if(image03_Gray[Chain_i 1][Chain_j]==0 && buf[Chain_i 1][Chain_j]==255 ) //下 4
{
//Wayne.chaincode[x]=4;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i 1;
Chain_j=Chain_j;
position=1;
}
else if(image03_Gray[Chain_i 1][Chain_j-1]==0 && buf[Chain_i 1][Chain_j-1]==255 ) //左下 5
{
// Wayne.chaincode[x]=5;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i 1;
Chain_j=Chain_j-1;
position=1;
}
else if(image03_Gray[Chain_i][Chain_j-1]==0 && buf[Chain_i][Chain_j-1]==255 ) //左 6
{
//Wayne.chaincode[x]=6;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i;
Chain_j=Chain_j-1;
position=1;
}
else if(image03_Gray[Chain_i-1][Chain_j-1]==0 && buf[Chain_i-1][Chain_j-1]==255 ) //右上 7
{
//Wayne.chaincode[x]=7;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i-1;
Chain_j=Chain_j-1;
position=1;
}
else if(image03_Gray[Chain_i-1][Chain_j]==0 && buf[Chain_i-1][Chain_j]==255 ) //上 0
{
//Wayne.chaincode[x]=0;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i-1;
Chain_j=Chain_j;
position=0;
}
else if(image03_Gray[Chain_i-1][Chain_j 1]==0 && buf[Chain_i-1][Chain_j 1]==255 ) //右上 1
{
//Wayne.chaincode[x]=1;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i-1;
Chain_j=Chain_j 1;
position=0;
}
else if(image03_Gray[Chain_i][Chain_j 1]==0 && buf[Chain_i][Chain_j 1]==255 ) //右 2
{
// Wayne.chaincode[x]=2;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i;
Chain_j=Chain_j 1;
position=0;
}
else if(image03_Gray[Chain_i 1][Chain_j 1]==0 && buf[Chain_i 1][Chain_j 1]==255 ) //右下 3
{
//Wayne.chaincode[x]=3;
buf[Chain_i][Chain_j]=0;
x ;
Chain_i=Chain_i 1;
Chain_j=Chain_j 1;
position=0;
}
else
check=1;
}
}
if(run==1)
exit=1;
}
}
}
}
[/code]

此程式我是要用在尋找640*480裡的白色方型輪廓,煩請各位大大們幫我看看 到底是哪裡錯誤了。
PS:有顏色字型的也煩請各位大大 詳解
"在此先說聲謝謝"
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-17 22:06:05 IP:118.170.xxx.xxx 訂閱
syntax 大大你好:
你所說的無窮迴圈,但是我是從這改的 Wayne.bgr[ ][ ]←這個是我做完二值化會將圖資料存入此矩陣(他自己) =>這我把它改成image03_Gray
image03_Gray =>我二直化後存的陣列檔名
===================引 用 syntax 文 章===================
image03_Gray 中有無窮呼叫迴圈之類的問題
===================================================
------
新手報到
系統時間:2024-05-07 20:19:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!